作者: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")

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

你还可以使用所有数据库常规操作,如limit,orderBy,having或groupBy。你可以在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. LeetCode27.移除元素 JavaScript

    给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...

  2. Reading Notes : 180212 冯诺依曼计算机

    读书<计算机组成原理>,百度百科 现在大部分接触过计算机的人,都会知道冯诺依曼计算机,但是这个概念是怎么来的呢?本节我们就通过聊一下计算机的存储程序控制,来认识”冯诺依曼”. 存储程序控制 ...

  3. 【转载】决策树Decision Tree学习

    本文转自:http://www.cnblogs.com/v-July-v/archive/2012/05/17/2539023.html 最近在研究规则引擎,需要学习决策树.决策表等算法.发现篇好文对 ...

  4. redhat6本地源NBD驱动安装

    安装NBD驱动 一.配置本地yum源 1.挂载系统安装光盘 # mount /dev/cdrom /mnt/cdrom/ # mkdir /mnt/media # cp -rf /mnt/cdrom/ ...

  5. python 变量定义

    变量定义 什么是变量? 在程序运行过程中,其值可以改变的量. 标识符(命令规范) 只能由数字.字母.下划线组成 不能以数字开头 不能是系统关键字 import keyword ​ # 打印关键字列表 ...

  6. 『C++』Temp_2018_12_13_Type

    #include <iostream> #include <string> using namespace std; class Object{ public: virtual ...

  7. ABAP术语-SAPNET

    SAPNET 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/17/1109823.html SAPNet is the intranet p ...

  8. 笔记: js构造函数与原型

    目录 构造函数与原型介绍 涉及三种引用的操作 有关原型及原型链的一些相关方法总结 @ 构造函数与原型介绍 1.函数与函数的原型对象(prototype object): 在JavaScript中,创建 ...

  9. Debian中CodeIgniter+nginx+MariaDB+phpMyAdmin配置

    本文不讲述软件安装过程,记述本人在Debia中配置CodeIgniter时遇到的问题及解决方法,希望能够为有需要的人提供帮助. 一.Debian版本及所需的软件 Debian 9.8 stretch ...

  10. (数据科学学习手札43)Plotly基础内容介绍

    一.简介 Plotly是一个非常著名且强大的开源数据可视化框架,它通过构建基于浏览器显示的web形式的可交互图表来展示信息,可创建多达数十种精美的图表和地图,本文就将以jupyter notebook ...