概述
在 Android 代码中创建和修改 SQLite 数据库,我们可以参考 Android 文档 Save data using SQLite,我们在 Android 中需要采取两个基本步骤来设置 SQLite 就可以和数据库互动了。如下所示:
- Define a schema and contract-创建架构和契约类
- Create a database using an SQLOpenHelper-使用 SQLiteOpenHelper 创建数据库
完成上面两步后就可以执行创建、读取、更新和删除我们的数据的操作了。
创建架构和契约类
创建数据库架构其实就是需要规划数据库结构。所以我们需要问两个问题:
- 表格的名称是什么?
- 表格里列的名称和数据类型是什么?
还记得下面的语句吗?
CREATE TABLE <table_name> (<column_name_1> <data_type_1>, <column_name_2> <data_type_2>, ...);
以宠物收容所场景为例:
Attribute | Storage Class |
---|---|
Name(宠物名) | TEXT(文本) |
Breed(品种) | TEXT(文本) |
Gender(公母) | INTEGER(0-未知,1-公、2-母) |
Weight(体重) | INTEGER(为了简单) |
绘制表格,规划数据库结构
创建 Contract (契约)类
为什么要使用 Contract 类?
看个创建表格的两个例子:
String makeTableStatement = "CREATE TABLE entry (_id INTEGER PRIMARY KEY, entryid TEXT, title TEXT, subtitle TEXT)";
---
String SQL_CREATE_ENTRIES = "CREATE TABLE" + FeedEntry.TABLE_NAME + "(" + FeedEntry._ID + "INTEGER PRIMARY KEY," + FeedEntry.COLUMN_NAME_ENTRY_ID + "TEXT," + FeedEntry.COLUMN_NAME_TITLE+"TEXT);"
观察上述代码,我们发现第二个创建表格的语句中 表格名称和列名称存储在了常量里。 在生成 SQL 指令时,消除了出现拼写错误的可能性,或者不小心将不应该大写的字母大写了。如果想更改实际的列名称,也只需在一个地方更改下就行了。
总结使用 Contract 类的三个理由:
- 帮助我们定义架构,规定了去哪里查找数据库常量;
- 在生成 SQL 指令时,可以帮助我们避免拼写错误;
- 使我们更容易更新数据库架构
创建 Contract 类
根据之前规划的数据库结构即我们定义的架构,我们在项目的主包下面创建一个包名为 data
,然后在改包下创建一个新的 java 类名为 PetContract
,将该类用 final
修饰,因为它只是用来提供常量,我们不需要扩展或为此外部类实现任何内容。使用我们定义的架构,为每个表格创建一个内部类,并为每个列标题创建常量,代码如下所示:
public final class PetContract {
private PetContract() {}
public static final class PetEntry implements BaseColumns {
public final static String TABLE_NAME = "pets";
public final static String _ID = BaseColumn._ID;
public final static String COLUMN_PET_NAME = "name";
public final static String COLUMN_PET_BREED = "breed";
public final static String COLUMN_PET_GENDER = "gender";
public final