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提供的功能是足够。

更多相关文章

  1. Android自己主动化測试解决方式
  2. android ListView没有数据时信息显示
  3. android蓝牙BLE(三) —— 广播
  4. android自制的软件如何添加到打开方式
  5. Android的四种启动方式
  6. Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedC
  7. Android向服务器传接和接收数据的方法汇总
  8. Android中的几种网络请求方式详解
  9. Android中如何自己创造一个Cursor及MatrixCursor源码分析

随机推荐

  1. 加速 Android 开发的五大开源网站
  2. Android界面开发推荐颜色
  3. Android之TextView设置String文本颜色
  4. Android TextView字体颜色等样式详解
  5. 「横竖屏」 「分屏」 「虚拟按键」
  6. Gradle-jar-aar
  7. 在Android中使用GIF图片
  8. Android 主动获取电量的方法
  9. Android 网络连接处理 学习笔记
  10. 做android 开发遇到的问题及解决办法记录