概述
本篇文章的主题是讲述在 Android 中应用 SQLite 的实例,结构如下所示:
- SQLiteOpenHelper 的应用
- SQLiteDatabase 的 CRUD 操作
- 开启事务
- SQLite 的其他注意事项
一、SQLiteOpenHelper
在 Android 中使用 SQLite 的时候需要借助一个类:SQLiteOpenHelper,这是一个抽象类,继承这个抽象类的时候,我们必须实现以下2个方法:
/**
* 创建数据库的时候回调的方法
* @param db 数据库对象
*/
public abstract void onCreate(SQLiteDatabase db);
/**
* 数据库版本更新时回调的方法
* @param db 数据库对象
* @param oldVersion 数据库的旧版本
* @param newVersion 数据库的新版本
*/
public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);
所以我们可以提供一个子类来继承 SQLiteOpenHelper
,如下所示:
public class MySQLiteHelper extends SQLiteOpenHelper {
private static final String TAG = "MySQLiteHelper";
/**
* @param context 上下文对象
* @param name 数据库名称
* @param factory 游标工厂
* @param version 数据库版本,大于等于1
*/
protected MySQLiteHelper(@Nullable Context context, @Nullable String name,
@Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
/**
* 数据库创建时回调的方法
* @param db 数据库对象
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.d(TAG, "-------------onCreate------------");
}
/**
* 数据库版本更新时回调的方法
* @param db 数据库对象
* @param oldVersion 数据库的旧版本
* @param newVersion 数据库的新版本
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d(TAG, "-------------onUpgrade------------");
}
/**
* 数据库打开时回调的方法
* @param db 数据库对象
*/
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
Log.d(TAG, "-------------onOpen------------");
}
}
在这里我们还需要定义它的构造方法,构造方法中的参数如下所示:
- context :上下文对象。
- name:数据库名称。
- factory:游标工厂,一般我们使用不到这个参数,直接传 null 即可。
- version:数据库的版本,传入的数必须是一个大于等于 1 的数。
除了 onCreate
和 onUpgrade
这两个抽象方法之外,有时候我们也会重写 onOpen
方法,这个方法会在数据库打开的时候回调,为了了解这些方法的回调时机,我们通过 Log 来确定,接着在 MainActivity
中我们创建 MySQLiteHelper
对象并创建一个数据库对象,然后观察日志输出:
public class MainActivity extends AppCompatActivity {
private MySQLiteHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
createDatabase();
}
private void createDatabase() {
helper = new MySQLiteHelper(this, "default.db", null, 1);
SQLiteDatabase db = helper.getWritableDatabase();
}
}
MainActivity
所做的事很简单,创建了一个 MySQLiteHelper
对象,然后通过 getWritableDatabase
方法获取数据库对象,接着我们运行该工程,查看 Log 日志:
D/MySQLiteHelper: -------------onCreate------------
D/MySQLiteHelper: -------------onOpen------------
可以看到 onCreate
和 onOpen
方法被回调了。此时我们的存储空间中就会存在一个叫做 default.db
的数据库,default.db
只会创建一次,所以当我们下次再打开时,onCreate
方法不再被回调,只会回调 onOpen
方法。
1. onCreate
前面说到 onCreate
方法会在数据库创建的时候进行回调,而数据库中存储和管理数据我们需要创建表、视图、索引等,所以在 onCreate
中创建表等是再适宜不过的了。如下所示:
假设要创建一张 Contacts 表用于存放联系人信息,它的 SQL 语句如下所示:
CREATE TABLE Contacts (
id integer PRIMARY KEY,
name tex