Android中的SQLite使用学习

SQLite是非常流行的嵌入式关系型数据库,轻载, 速度快,而且是开源。在Android中,runtime提供SQLite,所以我们可以使用SQLite,而且是全集的SQLite。SQLite提供 SQL接口,和一般的数据库一样。但是Android的API不采用JDBC,JDBC消耗太多的资源。

SQLite支持绝大部分SQL-92标准,不支 持:FOREIGN KEY constraints, nested transactions, RIGHT OUTER JOIN, FULL OUTER JOIN, and some flavors of ALTER TABLE.而我们在手持终端上使用SQLite,一般并不涉及太复杂的数据库处理,除了上诉,其他的SQL,包括tirger、transaction 等都是支持,应该说SQLite提供的功能是足够。

和一般的SQL数据库比较,最大的差异是数据类 型,例如我们定义一个表的某个column的数据类型为INTEGET,如果在插入时这个数值采用String,在SQLite中是包会产生错误,我们可 以将定义表格的数据类型作为一个提示,用于说明期待的数据类型,但是并不真实起到检测作用。如果真的需要限制,要以来程序的其他部分进行判断。

1、建立我们的数据库

在MySQL等数据库中,第一步是创建数据库,第 二步是创建表,如需要,还加上我们的初始预制的数据。在Android的SQLite的使用是一样的。稍微特别一点是,我们需要通过继承 SQLiteOpenHelper这个类来达到目的。对于抽象类SQLiteOpenHelper的继承,需要重 写:1)constructor,2)onCreate()和onUpgrade(),下面举例介绍。

这个例子,我们创建一个称为bebook_db的数据库,里面有一个叫mytable的表格,有三列:_id,Name,Weight。下面我们将演示如何创建数据库,如何在数据库中创建表,如何删除表,如何更新数据库。

/* 对于抽象类SQLiteOpenHelper的继承,需要重写:1)constructor,2)onCreate()和onUpgrade()  * */
public class Chapter22Db extends SQLiteOpenHelper{
    public static final String DATABASE_BAME ="bebook_db";

/* step 1 :重写构造函数中,继承super的构造函数,创建database */
    public Chapter22Db(Context context){
        /* 第一个参数 为当前环境
         * 第二个参数 String name为数据库文件,如果数据存放在内存 ,则为null,
         * 第三个参数 为SQLiteDatabase.CursorFactory  factory,存放cursor,缺省设置为null
         * 第四个参数 为int
version数据库的版本,从1开始,如果版本旧,则通过onUpgrade()进行更新,如果版本新则通过onDowngrade()进行发布。例
如,我要更改mytable表格,增加一列,或者修改初始化的数据,或者程序变得复杂,我需要增加一个表,这时我需要在版本的数字增加,在加载时,才会对
SQLite中的数据库个更新,这点非常重要,同时参见onUpgrade()的说明 */
        super(context,DATABASE_BAME,null,1);
    }
   
  
 /*step 2
:重写onCreate(),如果Android系统中第一次创建我们的数据库时(即后面介绍调用getWritableDatabase()或者
getReadbleDatabase()时),将调用onCreate(),这这里创建数据库(虽然在构造函数中填入数据库名,但数据库的创建实在
onCreate()中自动进行。在这里一般进行创建table和写入初始数据*/
    public void onCreate(SQLiteDatabase db) {
        //创建table:SQL的语句是“CREATE TABLE constants(_id INTEGER PRIMARY KEY AUTOINCREMENT,title TEXT, value REAL);”,我们可以直接通过db.execSQL(SQLCommand)来执行没有返回值的SQL语言,例如CREATE,DELETE,UPDATE,INSERT,DROP。
        db.execSQL("CREATE TABLE mytable(_id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT,Weight REAL); ");
       
        //下面是加入三个原始数据,如果对表格进行增、删、改、查,后面会详细介绍。下面的几个数据来自Android自带的重力表,据说是为了传感器管理用,Android已经考虑到我们在月球和火星上使用Android手机的情况^_^,程序员有时真的很无聊……
        ContentValues cv = new ContentValues();
        
        cv.put("Name", "Gravity, Earth");
        cv.put("Weight", SensorManager.GRAVITY_EARTH);
        db.insert("mytable", "Name", cv);
        
        cv.put("Name", "Gravity, Mars");
        cv.put("Weight", SensorManager.GRAVITY_MARS);
        db.insert("mytable", "Name", cv);

cv.put("Name", "Gravity, Moon");
        cv.put("Weight", SensorManager.GRAVITY_MOON);
        db.insert("mytable", "Name", cv);
    }

/* step 3:重写onUpgrade(),如果版本比原来的高,将调用onUpgrade(),在这个例子中,我们删除原来的表格,根据新需求创建*/
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //这次同样通过db.execSQL(SQLCommand)来执行没有返回值的SQL语言,将表格删除
        db.execSQL("DROP TABLE IF EXISTS mytable");
        onCreate(db);
    }

}

2、和数据库进行关联

就如同在MYSQL中进行来数据库的创建,表格创
建和初始数据的填写,其他的操作一般在Activity中和用户互动产生。回忆一下我们在Linux环境中如何处理,首先是要创建和数据库的连
接,Android也一样,另外在Activity结束时,我们需要将连接断开,以释放有关资源。

public class Chapter22Test1 extends ListActivity{
    private SQLiteDatabase  db = null;
    private Cursor cursor = null; //在后面与ListView互动中使用

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 获取处理SQLiteOpenHelper的子类的SQLite的实例,如果只读,可以采用getReadableDatabase(),这个例子我们奖通过SQLiteDatabase实例的操作,来进行对数据进行增删改查询,采用可写的方式。
        db= (new Chapter22Db (getApplicationContext())).getWritableDatabase();  
    }

protected void onDestroy() {
        super.onDestroy();
       //释放和数据库的连接
        db.close();
    }
}

3、对表格进行操作

对表格的操作有两种方式,一种是RAW方式,即直接给出SQL语句,另一种是采用SQLiteDatabase中给出的方法来进行,姑且称为API方式。下面就这两种方式的增、删、改、查进行实验。

3.1增加一行数据

在设置创建表格时,使用了db.execSQL(SQLCommand)来执行没有返回值的SQL语言,这个是RAW方式。另一种方式在之前加入原始数据时给出,通过db.insert("mytable","Name",<ContentValues values>);来实现。其中第二个参数比较特别。SQL是不运行加入一个空的行。如果第二个参数不设置为null,则对这种情空行情况进行处理,将对应列的值设置为“NULL”。

//RAW方式。
db.execSQL("INSERT INTO mytable(Name,Weight) VALUES ('Test1',1.0);");
//API方式,通过db.insert("mytable","Name",<ContentValues values>);来处理,其中ContentValues是用于存储名称和数值,对应为表格的列的名词和其在行中的数据。
ContentValues values =new ContentValues(2);//ContentValues有两个数值
values.put("Name", "Test2"); //一个列名为Name,数据为Test2
values.put("Weight", 2.0); //一个列名为Weight,数据为2.0
db.insert("mytable","Name",values);

3.2删除一行数据

//RAW方式
db.execSQL("DELETE FROM mytable WHERE Name='Test1';");    
//API方式,方法是:delete (String table, String whereClause, String[] whereArgs)
db.delete("mytable", "Name=?", {"Test1"});

3.3更新一行数据

//RAW方式
db.execSQL("UPDATE mytable SET Weight=5.0 WHERE Name='Test1';");
//API方式,方法是:update (String table, ContentValuesvalues, StringwhereClause, String[]whereArgs)
String[] name = {"Test1"};
ContentValues values =new ContentValues(2);
values.put("Name", "Test1");
values.put("Weight", 5.0);
db.update("mytable",values,"Name=?",name);

3.4查询和游标Cursor

上面的三个操作都是无返回值的,而查询SELECT则不然,将返回游标Cursor。下面是两种方式的查询

//RAW方式,带返回值,采用db.rawQuery(SQL语句)方式
Cursor result1 =db.rawQuery("SELECT _id,Name,Weight from mytable ORDER BY Name", null);
/API
方式,带返回值,采用public Cursor query (String table, String[] columns, String
selection, String[] selectionArgs, String groupBy, String having, String
orderBy)
String[] columns ={"Name","Weight"};
String[] name ={"Name"};
Cursor result2 = db.query("mytable", columns, "Name=?", name, null, null, null);

游标和Iterator接口有些相似,对于Cursor result我们可以通过下面的方式来读取数据:

result.moveToFirst();
while(!result.isAfterLast()){
    int id = result.getInt(0);
    String name = result.getString(1);
    double weight = result.getDouble(2);
    System.out.println("\t "+id + "\t["+ name + "]\t" +weight);
    result.moveToNext();
}        
result.close();

通过Cursor我们可以读取数据库的详细信息我
们可以数据用ArrayList<HashMap<>>来存放,由于real非对象,简单地用
ArrayList<HashMap<String,String>>来存储。我们已经有能力对SQLite数据进行处理,并也
有能力处理ListView,这样可以编写我们的Activity。

SQLite是非常流行的嵌入式关系型数据库,轻载,
速度快,而且是开源。在Android中,runtime提供SQLite,所以我们可以使用SQLite,而且是全集的SQLite。SQLite提供
SQL接口,和一般的数据库一样。但是Android的API不采用JDBC,JDBC消耗太多的资源。

SQLite支持绝大部分SQL-92标准,不支
持:FOREIGN KEY constraints, nested transactions, RIGHT OUTER JOIN, FULL
OUTER JOIN, and some flavors of ALTER
TABLE.而我们在手持终端上使用SQLite,一般并不涉及太复杂的数据库处理,除了上诉,其他的SQL,包括tirger、transaction
等都是支持,应该说SQLite提供的功能是足够。

Android中的SQLite使用学习的更多相关文章

  1. Android中使用sqlite笔记

    1.实现SQLiteHelper来在android中使用SQLite.代码如下,来自android官网. public class FeedReaderDbHelper extends SQLiteO ...

  2. Android中对sqlite加密--SQLCipher

    原文:Android中对sqlite加密--SQLCipher android中有些时候会将一些隐私数据存放在sqlite数据库中,在root过的手机中通过RE就能够轻松的打开并查看数据库所有内容,所 ...

  3. android中与SQLite数据库相关的类

    为什么要在应用程序中使用数据库?数据库最主要的用途就是作为数据的存储容器,另外,由于可以很方便的将应用程序中的数据结构(比如C语言中的结构体)转化成数据库的表,这样我们就可以通过操作数据库来替代写一堆 ...

  4. Android学习记录(3)—Android中ContentProvider的基本原理学习总结

    一.ContentProvider简介        当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据 ...

  5. Android中数据库Sqlite的性能优化

    1.索引简单的说,索引就像书本的目录,目录可以快速找到所在页数,数据库中索引可以帮助快速找到数据,而不用全表扫描,合适的索引可以大大提高数据库查询的效率.(1). 优点大大加快了数据库检索的速度,包括 ...

  6. Android中关于JNI 的学习(三)在JNI层訪问Java端对象

    前面两篇文章简介了JNI层跟Java层的一些相应关系,包含方法名,数据类型和方法名称等,相信在理论层面.可以非常好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步 ...

  7. Android中关于JNI 的学习(四)简单的样例,温故而知新

    在第零篇文章简单地介绍了JNI编程的模式之后.后面两三篇文章,我们又针对JNI中的一些概念做了一些简单的介绍,也不知道我究竟说的清楚没有.但相信非常多童鞋跟我一样.在刚開始学习一个东西的时候,入门最好 ...

  8. android中滑动SQLite数据库分页加载

    今天用到了android中滑动SQlit数据库分页加载技术,写了个测试工程,将代码贴出来和大家交流一下: MainActivity package com.example.testscrollsqli ...

  9. android中的SQLite数据库

    SQLite是android中集成的一个轻量级的数据库,该数据库支持绝大部分SQL92语法 SQLiteDatabase代表一个数据库(底层就是一个数据库文件),一旦应用程序获得了代表指定数据库的SQ ...

随机推荐

  1. OC中的消息传递和初始化

    [receiver message]:[接收者 消息] 把消息传递给接收者. getter(接收器),setter(设置器):只设置和读取一个参数. Person *p1 = [[Person all ...

  2. (转)redis 学习笔记(1)-编译、启动、停止

    redis 学习笔记(1)-编译.启动.停止   一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...

  3. 为什么要用Message Queue

    摘录自博客:http://dataunion.org/9307.html?utm_source=tuicool&utm_medium=referral 为什么要用Message Queue 解 ...

  4. bootstrap-fileinput 图片上传

    bootstrap-fileinput 源文件 在网上下载 CSS: <link href="../../static/Bootstrap/css/plugins/bootstrap- ...

  5. 查看JVM内存

    你知道如何进行JVM内存查看,这里和大家分享几个JVM内存查看方法,希望对你的学习有所帮助,通常情况下可以用代码查看,也可以在eclipse中增添相关信息后直接查看. JVM内存查看方法 可以用代码查 ...

  6. android开发连接wifi addNetwork 返回-1

    如下代码:(注释掉的是会返回-1的代码,未注释的是能够正常连接wifi的代码) // public WifiConfiguration CreateWifiInfo(String SSID, Stri ...

  7. HashMap优雅的初始化方式以及引申

    小记 相信很多人和笔者一样,经常会做一些数组的初始化工作,也肯定会经常用到集合类.假如我现在要初始化一个String类型的数组,可以很方便的使用如下代码: String [] strs = {&quo ...

  8. python 数据结构-字典

    原文地址:http://docs.pythontab.com/python/python3.4/datastructures.html#tut-tuples 理解字典的最佳方式是把它看做无序的键: 值 ...

  9. discuz之同步登入

    前言   首先感谢dozer学长吧UCenter翻译成C# 博客地址----------->http://www.dozer.cc/   其次感谢群友快乐々止境同学的热心指导,虽然萍水相逢但让我 ...

  10. 剑指offer--21题

    #include "stdafx.h" #include<iostream>using namespace std; void LeftRotateString(cha ...