相关文章推荐
慷慨的黄豆  ·  matplotlib ...·  11 月前    · 
有胆有识的豆腐  ·  Geometry.Within(Geomet ...·  1 年前    · 

使用 SQLite 时,所需的所有模板在当今世界上都不是一件最令人愉快的事情。

所幸的是,在最新一次 Google I / O 会议上,它们宣布的其中一项事项(称其为: Room ),就是为简化这项工作,开发出足够的库。

然而, 运用 Anko ,我们仍可以继续像使用低级别框架一样工作,但是 摆脱了实施过程中一些繁琐的部分 。今天我们来看看究竟是怎么样做到的。

运用 Anko 创建你的数据库

这里你将看到如何从头开始创建数据库。在 Android 上,你需要 SQLiteOpenHelper ,来检索数据库。其后,你还需要记住在请求之后关闭它。而这些 Anko 都为你做了。

维持,你需要添加 Anko的 SQLite依赖关系:

1 compile 'org.jetbrains.anko:anko-sqlite:0.10.0'

实现 ManagedSQLiteOpenHelper

如果你使用这个继承 SQLiteOpenHelper 的类,就可以创建操作数据库的代码块,如下所示:

1 database.use { 
2     ...

大括号内是SQLiteDatabase类的扩展函数,这样你就可以直接调用它的方法。另外,仅在这块代码执行前,将此表打开。而在代码执行结束后将其关闭

我们如何实现这个类?基于Anko的文档,推荐的方法是:

 1 class MySqlHelper(ctx: Context) : ManagedSQLiteOpenHelper(ctx, "mydb") {
 3     companion object {
 4         private var instance: MySqlHelper? = null
 6         @Synchronized
 7         fun getInstance(ctx: Context): MySqlHelper {
 8             if (instance == null) {
 9                 instance = MySqlHelper(ctx.applicationContext)
10             }
11             return instance!!
12         }
13     }
15     override fun onCreate(db: SQLiteDatabase) {
16     }
18     override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
19     }
21 }
23 // Access property for Context
24 val Context.database: MySqlHelper
25     get() = MySqlHelper.getInstance(applicationContext)

我们创建一个短小的单例程,它保存helper的实例,用同步的方法使不同的线程不能生成多个实例。

另外,我们为上下文创建一个扩展属性,这样任何需要Context的类都可以直接访问数据库。

这就是允许我们使用的最初始代码。

定义数据库表结构

为了创建我们的数据库,我们需要实现helperonCreater方法,并使用Anko提供的createTable扩展函数:

1 override fun onCreate(db: SQLiteDatabase) {
2     db.createTable("Person", true,
3             "_id" to INTEGER + PRIMARY_KEY,
4             "name" to TEXT,
5             "surname" to TEXT,
6             "age" to INTEGER)

这里第一个参数给出的是数据库名称,第二个参数说明是否要在create之前,确定表不存在。

第三个参数是vararg(变量)对。也就是,你可以添加加任意数量变量。如你所见,这个变量对的格式是 A to B。这个用保留字infix修饰的函数,称之为中缀函数infix function)。

变量对的第二部分是SqlType类常量。由于这很有趣,我建议你看看它的实现。在这里,它巧妙地使用了操作符重载

插入和查询数据

运用Anko一切都变得容易多了。在插入过程中,不需要创建自己的ContentValue来添加所有数据,而是用数据库对象的扩展函数。这样就可以:

1 database.use {
2     insert("Person",
3             "_id" to 1,
4             "name" to "John",
5             "surname" to "Smith",
6             "age" to 20)

而查询,可以有几种方法进行。在其中之一是,你可以为查询的变量添加名称,并将作为变量对将值添加上:

1 select("Person")
2         .where("(_id = {id}) and (name = {name})",
3                 "id" to 1,
4                 "name" to "John")

还有另一个方法更类似在Android框架中使用,允许在其后用询问符号和值。在这种情况下,它们都必须为String

1 select("Person")
2         .whereSimple("(_id = ?) and (name = ?)",
3                 1.toString(), "John")

我个人认为第二种方法更简单。

你还可以使用所有数据库常规操作,如limitorderByhavinggroupBy你可以在Anko文档中看到所有这些操作。

为了处理结果光标,Anko还为我们提供了不同的函数,如parseSingle(对一个结果)或者parseList(对于几个结果)。这些函数接收一个rowParser

有许多不同的解析器。MapRowParser是其中一个有趣的,它将列映射到一张图(map)中。

运用这个解析器和map委托,您可以直接解析图中的值到类中。可以我的书中看到这个说明。

尽管有许多的库可以简化数据库的很多工作,而对于简化工作来说,Anko已足够了。

由于它为我们简化了许多使用数据库的带来痛苦事情,所以它是简化数据库工作的很好选择。

另外,它向我们展示了用其他方式来使用语言,当您遇到问题时,这些语言非常有用。

不要忘了看看以前的文章,了解更多关于Kotlin