Android中SQLite的使用

SQLite是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite是一个增长最快的数据库引擎,这是在普及方面的增长,与它的尺寸大小无关。SQLite 源代码不受版权限制。

SQLite是什么

SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。
就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。
SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB(但它竟然可以支持高达2TB大小的数据库)
与许多其它数据库管理系统不同,SQLite不是一个客户端/服务器结构的数据库引擎,而是被集成在用户程序中。

SQLite采用动态数据类型,当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储,SQLite称这为“弱类型”。但有一个特例,如果是INTEGER PRIMARY KEY,则其他类型不会被转换,会报一个“datatype missmatch”的错误。
所以,还是尽量按规定的类型来存

在Android中主要涉及的就是SQLiteDatabaseSQLiteOpenHelper这两个类

SQLiteDatabase

这个类提供了一些管理SQLite数据库的方法,比如创建、删除、执行SQL命令,和执行其他常见的数据库管理任务的方法。所以说这个类是比较核心的
常用的方法有:

db.execSQL(String sql) //执行任何的SQL语句

db.insert(String table,String nullColumnHack,ContentValues values) //插入记录

db.delete(String table,String whereClause,String[] whereArgs)//删除记录

db.update(String table,ContentValues values,String whereClause,String[] whereArgs)//更新记录

db.query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy)//查询记录

db.rawQuery(String sql,String[] selectionArgs)//通过sql语句查询记录

然后看一段在Activity具体使用的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//通过openOrCreateDatabase来打开或创建一个数据库,返回SQLiteDatabase对象
// 第二个参数是权限,关于更详细见 Android安全开发
SQLiteDatabase db = openOrCreateDatabase("user.db",MODE_PRIVATE,null);
//创建一个表
db.execSQL("create table if not exists userTb (" +
"_id integer primary key," +
"name text not null,age integer not null," +
"sex text not null)");
//向表中插入记录
db.execSQL("insert into userTb (name,age,sex) values ('张三',18,'女')");
//Cursor为查询结果对象,类似于JDBC中的ResultSet,rawQuery是使用sql语句自己封装
Cursor queryResult = db.rawQuery("select * from userTb", null);
// 可以使用占位符:db.rawQuery("select * from ?", new String[]{"userTb"});
if (queryResult != null) {
while (queryResult.moveToNext()) {
Log.i("info", "id: " + queryResult.getInt(queryResult.getColumnIndex("_id"))
+ " 姓名: " + queryResult.getString(queryResult.getColumnIndex("name"))
+ " 年龄: " + queryResult.getInt(queryResult.getColumnIndex("age"))
+ " 性别: " + queryResult.getString(queryResult.getColumnIndex("sex")));
}
//关闭游标对象
queryResult.close();
}
//关闭数据库
db.close();
}
}

db 查询方法得到的 cursor 是指向第一条记录之前
因此查询得到 cursor 后第一次调用 moveToFirst(实际要向后移一个位置)或 moveToNext(从指向第一条记录之前向后移动一个位置变为刚好指向第一条记录位置)都可以将 cursor 移动到第一条记录上。

SQLiteOpenHelper

这个类为SQLiteDatabase的帮助类,主要用于管理数据库的创建与版本更新。SQLiteHelper是一个抽象类,一般通过创建一个继承自它的子类并重写onCreat()onUpgrade()这两个回调方法进行使用。

onCreat(SQLiteDatabase db)
首次创建数据库时调用,一般用于建表等操作。当检测到数据库已经存在后就不再执行了,只能用升级的方法更新

onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)
当升级数据库版本时调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class SQLiteHelper extends SQLiteOpenHelper {
/**
* 这里以2个参数的构造函数为例,所有构造函数都要调用super的4个参数的构造
* context:上下文对象
* name:数据库名
*/
public SQLiteHelper(Context context, String name) {
super(context, name, null, 1);
}

//首次创建数据库的时候调用,一般进行建表或某些初始化的操作
@Override
public void onCreate(SQLiteDatabase db) {
//建表
db.execSQL("create table if not exists userTb (" +
"_id integer primary key," +
"name text not null,age integer not null," +
"sex text not null)");
}

//当数据库版本升级时自动调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
}

有时候还会用到一个回调函数:onOpen,就是数据库打开的时候会回调
创建好了辅助类就可以在Activity中进行使用了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class MainActivity2 extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//创建一个SQLiteHelper对象
SQLiteHelper helper = new SQLiteHelper(MainActivity2.this,"stu.db");
//使用getWritableDatabase()或getReadableDatabase()方法获得SQLiteDatabase对象
//它们默认都是打开的可读写的数据库,如果没有就新建再打开
//区别就是:当磁盘已满的时候,getReadableDatabase会打开只读的数据库
SQLiteDatabase db = helper.getWritableDatabase();
//插入记录
db.execSQL("insert into userTb (name,age,sex) values ('张三',18,'女')");
db.execSQL("insert into userTb (name,age,sex) values ('李四',19,'男')");
//获取游标对象
Cursor queryResult = db.rawQuery("select * from userTb", null);
if (queryResult != null) {
//打印所有记录
while (queryResult.moveToNext()) {
Log.i("info", "id: " + queryResult.getInt(queryResult.getColumnIndex("_id"))
+ " 姓名: " + queryResult.getString(queryResult.getColumnIndex("name"))
+ " 年龄: " + queryResult.getInt(queryResult.getColumnIndex("age"))
+ " 性别: " + queryResult.getString(queryResult.getColumnIndex("sex")));
}
//关闭游标对象
queryResult.close();
}
//关闭数据库
db.close();
}
}

更多内容待补充…

关于事务

写数据库的时候也许会用到事务,SQLite是支持事务操作的,很简单的几句代码

1
2
3
4
5
6
7
8
// 事务开始
db.beginTransaction();
//....一顿写之类的

//设置事务处理成功,不设置会自动回滚不提交。
db.setTransactionSuccessful();
//在setTransactionSuccessful和endTransaction之间不进行任何数据库操作
db.endTransaction(); //处理完成

参考

http://www.cnblogs.com/caobotao/p/5118463.html

喜欢就请我吃包辣条吧!

评论框加载失败,无法访问 Disqus

你可能需要魔法上网~~