SQLite数据库存储
SQLite是一种轻量级的关系型数据库,它的运算速度非常快,占用资源少,通常只需要几百KB的内存就足够了,因此特别适合在移动设备上使用。同时,它支持标准的SQL语法,遵循数据库的ACID事务,上手较为简单。
定义架构和协定
SQL 数据库的主要原则之一是架构,即数据库组织方式的正式声明。架构反映在您用于创建数据库的 SQL 语句中。您可能会发现创建伴随类(称为协定类)很有用,该类以系统化、自记录的方式明确指定了架构的布局。
协定类是定义 URI、表和列名称的常量的容器。通过协定类,您可以在同一软件包的所有其他类中使用相同的常量。这样一来,您就可以在一个位置更改列名称并将其传播到整个代码中。
组织协定类的一种良好方法是将对整个数据库而言具有全局性的定义放入类的根级别。然后,为每个表创建一个内部类。每个内部类都枚举相应表的列。
注意:通过实现 BaseColumns 接口,您的内部类可以继承名为 _ID 的主键字段,CursorAdapter 等某些 Android 类需要内部类拥有该字段。
object FeedReaderContract {
// Table contents are grouped together in an anonymous object.
object FeedEntry : BaseColumns {
const val TABLE_NAME = "entry"
const val COLUMN_NAME_TITLE = "title"
const val COLUMN_NAME_SUBTITLE = "subtitle"
}
}
创建数据库
可以使用标准的sql语言来创建数据库
private const val SQL_CREATE_ENTRIES =
"CREATE TABLE ${
FeedEntry.TABLE_NAME} (" +
"${
BaseColumns._ID} INTEGER PRIMARY KEY," +
"${
FeedEntry.COLUMN_NAME_TITLE} TEXT," +
"${
FeedEntry.COLUMN_NAME_SUBTITLE} TEXT)"
private const val SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS ${
FeedEntry.TABLE_NAME}"
安卓提供了一个SQLiteOpenHelper帮助类。它是一个抽象类,需要我们创建一个自己的类去继承它。
它有两个抽象方法:onCreate() 和 onUpgrade()
class TestDatabaseHelper(val context: Context, name: String, version: Int) :
SQLiteOpenHelper(context, name, null, version) {
private val createTest = "create table Test ( " +
"id integer primary key autoincrement, " +
"text text" +
")"
override fun onCreate(db: SQLiteDatabase?) {
db?.execSQL(createTest)
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
db?.execSQL("drop table if exists Test")
onCreate(db)
}
}
SQLite的数据类型很简单:integer表示整型,real表示浮点型,text表示文本类型,blob表示二进制类型
/*
创建SQLite//java
*/
TestDatabaseHelper testDatabaseHelper = new TestDatabaseHelper(this, "Test.db", SQLITE_VERSION);
testDatabaseHelper.getWritableDatabase();
/*
创建SQLite//kotlin
*/
val dbHelper = TestDatabaseHelper(this, "Test.db", SQLITE_VERSION)
dbHelper.writableDatabase
我们用onCreate() 方法构建了一个TestDatabaseHelper 对象,并且通过构造函数的参数将数据库指定命名