作者:Antonio Leiva

时间:Mar 30, 2017

原文链接:https://antonioleiva.com/databases-anko-kotlin/

事实告诉我们:在Android中编写数据库是相当无聊的。

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

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

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

运用Anko创建你的数据库

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

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

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

实现ManagedSQLiteOpenHelper

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

 database.use {
...
}

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

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

 class MySqlHelper(ctx: Context) : ManagedSQLiteOpenHelper(ctx, "mydb") {

     companion object {
private var instance: MySqlHelper? = null @Synchronized
fun getInstance(ctx: Context): MySqlHelper {
if (instance == null) {
instance = MySqlHelper(ctx.applicationContext)
}
return instance!!
}
} override fun onCreate(db: SQLiteDatabase) {
} override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
} } // Access property for Context
val Context.database: MySqlHelper
get() = MySqlHelper.getInstance(applicationContext)

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

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

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

定义数据库表结构

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

 override fun onCreate(db: SQLiteDatabase) {
db.createTable("Person", true,
"_id" to INTEGER + PRIMARY_KEY,
"name" to TEXT,
"surname" to TEXT,
"age" to INTEGER)
}

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

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

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

插入和查询数据

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

 database.use {
insert("Person",
"_id" to 1,
"name" to "John",
"surname" to "Smith",
"age" to 20)
}

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

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

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

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

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

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

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

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

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

结论

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

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

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

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

在Android上运用Anko和Kotlin开发数据库:SQLite从来不是一件轻松的事(KAD25)的更多相关文章

  1. Android上基于libgdx的游戏开发资料

    本来之前想边学边写一个有关libgdx的游戏开发历程的,但是由于自己的懒惰和客观上的各种事情,一直没有搞下去.最近发现了一个大牛写的一本书<Beginning Android Games, 2n ...

  2. 在Android上,怎样与Kotlin一起使用Retrofit(KAD21)

    作者:Antonio Leiva 时间:Apr 18, 2017 原文链接:https://antonioleiva.com/retrofit-android-kotlin/ 这是又一个例子,关于怎样 ...

  3. iOS开发数据库SQLite的使用

    iOS系统自带Core Data来进行持久化处理,而且Core Data可以使用图形化界面来创建对象,但是Core Data不是关系型数据库,对于Core Data来说比较擅长管理在设备上创建的数据持 ...

  4. 使用Kotlin&Anko, 扔掉XML开发Android应用

    尝鲜使用Kotlin写了一段时间Android.说大幅度的减少了Java代码一点不夸张.用Java的时候动不动就new一个OnClickListener()匿名类,动不动就类型转换的地方都可以省下很多 ...

  5. 用Anko和Kotlin实现Android上的对话框和警告提示(KAD 24)

    作者:Antonio Leiva 时间:Mar 9, 2017 原文链接:https://antonioleiva.com/dialogs-android-anko-kotlin/ 借助Builder ...

  6. 即刻开始使用Kotlin开发Android的12个原因(KAD 30)

    作者:Antonio Leiva 时间:Jul, 11, 2017 原文链接:https://antonioleiva.com/reasons-kotlin-android/ 这组文章已到最后了,它们 ...

  7. 用Kotlin开发Android应用(I):介绍

    关于Kotlin,网上已有一些介绍的文章,包括Antonio Leiva的这组blog翻译稿.不过,我还是想跟进它们.翻译它们,以锻炼自己的英文翻译.各位高手发现问题,请及时“拍砖”. 原文题目:Ko ...

  8. 使用Kotlin开发Android应用(I):简单介绍

    使用Kotlin开发Android应用(I):简单介绍 @author ASCE1885的 Github 简书 微博 CSDN 原文链接 Kotlin是一门基于JVM的编程语言.它正成长为Androi ...

  9. Google Android Studio Kotlin 开发环境配置

    Google 近日开发者大会宣布Kotlin成为Android开发的第一级语言,即Android官方开发语言,可见Google对Kotlin的重视,本文就介绍一下Android Studio下的Kot ...

随机推荐

  1. 关于使用eclipse maven UpdateProject时报错,无法更新本地仓库的问题解决方案

    在做项目中,需要从同事电脑中把Maven项目copy过来,但是copy的过程中只copy了代码,setting.xml文件和pom.xml,使用eclipse把项目导入,有红色的感叹号提示,由于我没有 ...

  2. Spring(十九)之异常处理

    异常处理,对于项目开发至关重要,总不能用户点击一个页面出错了,直接报500,那样用户体验多不好啊! 所以这里讲的是SpringMVC对异常的处理,希望能给大家带来一定的 帮助和启发. 一.编写实体 p ...

  3. 十七、IntelliJ IDEA 中的 Maven 项目初体验及搭建 Spring MVC 框架

    我们已经将 IntelliJ IDEA 中的 Maven 项目的框架搭建完成.接着上文,在本文中,我们更近一步,利用 Tomcat 运行我们的 Web 项目. 如上图所示,我们进一步扩展了项目的结构, ...

  4. Knowledge Point 20180308 Dead Code

    不知道有没有前辈注意过,当你编写一段“废话式的代码时”会给出一个Dead Code警告,点击警告,那么你所写的废物代码会被编译器消除,那么如果你不理睬这个警告呢?编译后会是什么样的呢?下面我们写点代码 ...

  5. Oracle中插入千万条测试数据

    测试需求,id.姓名.邮箱.手机号不可重复 1.创建序列 create sequence id_sequence; //创建序列id_sequence 2.创建表 create table USERI ...

  6. Javascript混淆与解混淆的那些事儿

    像软件加密与解密一样,javascript的混淆与解混淆同属于同一个范畴.道高一尺,魔高一丈.没有永恒的黑,也没有永恒的白.一切都是资本市场驱动行为,现在都流行你能为人解决什么问题,这个概念.那么市场 ...

  7. E. K Balanced Teams

    类比背包问题,为每个学生附加一个权重$pos[i]$,意思是选择该学生后,之后可以选择$p[i]~p[i]+5$的学生. 转换公式: $$d[i][j]=max(d[i+1][q],d[i+pos][ ...

  8. 【LAMP整合Redis键值缓存为库分担压力】

    LAMP+ redis 架构图: 安装phpredis扩展 Php主配置文件引入redis库文件 Redis扩展 // 对httpd php扩展连接指定redis服务器

  9. mongodb副本集的docker化安装

    1. 定义 一般只要生产环境就需要考虑冗余设计,保证在某一台服务器由于某种原因宕机后服务还可以正常运行. mongo副本集是一组服务器,其中有一个主服务器(primary),用于处理客户端请求:还有多 ...

  10. Elasticsearch 映射操作

    一.创建 语法: PUT /索引库名称/_mapping/类型名称 { "properties": { "字段名": { "type": 类 ...