在Android上运用Anko和Kotlin开发数据库:SQLite从来不是一件轻松的事(KAD25)
时间: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)的更多相关文章
- Android上基于libgdx的游戏开发资料
本来之前想边学边写一个有关libgdx的游戏开发历程的,但是由于自己的懒惰和客观上的各种事情,一直没有搞下去.最近发现了一个大牛写的一本书<Beginning Android Games, 2n ...
- 在Android上,怎样与Kotlin一起使用Retrofit(KAD21)
作者:Antonio Leiva 时间:Apr 18, 2017 原文链接:https://antonioleiva.com/retrofit-android-kotlin/ 这是又一个例子,关于怎样 ...
- iOS开发数据库SQLite的使用
iOS系统自带Core Data来进行持久化处理,而且Core Data可以使用图形化界面来创建对象,但是Core Data不是关系型数据库,对于Core Data来说比较擅长管理在设备上创建的数据持 ...
- 使用Kotlin&Anko, 扔掉XML开发Android应用
尝鲜使用Kotlin写了一段时间Android.说大幅度的减少了Java代码一点不夸张.用Java的时候动不动就new一个OnClickListener()匿名类,动不动就类型转换的地方都可以省下很多 ...
- 用Anko和Kotlin实现Android上的对话框和警告提示(KAD 24)
作者:Antonio Leiva 时间:Mar 9, 2017 原文链接:https://antonioleiva.com/dialogs-android-anko-kotlin/ 借助Builder ...
- 即刻开始使用Kotlin开发Android的12个原因(KAD 30)
作者:Antonio Leiva 时间:Jul, 11, 2017 原文链接:https://antonioleiva.com/reasons-kotlin-android/ 这组文章已到最后了,它们 ...
- 用Kotlin开发Android应用(I):介绍
关于Kotlin,网上已有一些介绍的文章,包括Antonio Leiva的这组blog翻译稿.不过,我还是想跟进它们.翻译它们,以锻炼自己的英文翻译.各位高手发现问题,请及时“拍砖”. 原文题目:Ko ...
- 使用Kotlin开发Android应用(I):简单介绍
使用Kotlin开发Android应用(I):简单介绍 @author ASCE1885的 Github 简书 微博 CSDN 原文链接 Kotlin是一门基于JVM的编程语言.它正成长为Androi ...
- Google Android Studio Kotlin 开发环境配置
Google 近日开发者大会宣布Kotlin成为Android开发的第一级语言,即Android官方开发语言,可见Google对Kotlin的重视,本文就介绍一下Android Studio下的Kot ...
随机推荐
- SVN工具使用总结
SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subversion ...
- 十三、IntelliJ IDEA 中的版本控制介绍(下)
我们已经简单了解了 IntelliJ IDEA 的版本控制机制,那么接下来,就让我们一起看看在 IntelliJ IDEA 中进行具体的版本控制操作. 标注1:Checkout from Versio ...
- spring配置redis(xml+java方式)(最底层)
条件:引用好架包 <dependency> <groupId>org.springframework.data</groupId> <artifactId&g ...
- 自定义属性之LinearLayout ImageView TextView模拟图片文字按钮
一.资源文件: 1.文字选择器: <?xml version="1.0" encoding="utf-8"?> <selector xmlns ...
- “->”和“.”运算符
1.指向结构变量的指针. 2.定义:struct stu *pstu, 赋值是把结构变量的首地址赋给指针,不能把结构名给该指针:如, pstu = &boy; 3. 访问结构变量的成员 (*结 ...
- private、protected、public和internal的区别
private是完全私有的,只有在类自己里面可以调用,在类的外部和子类都不能调用,子类也不能继承父类的private的属性和方法. protected虽然可以被外界看到,但外界却不能调用,只有自己及自 ...
- el表达式不显示值
1.场景是自己搭建一个ssm的项目,登录页面跳转到首页,首页显示登录用户的信息,用request传递的值,用el表达式在jsp页面中没有显示 2.解决办法 早jsp的代码中添加头<%@ page ...
- 并发之AtomicIntegerFieldUpdater
基于反射的实用工具,可以对指定类的指定 volatile int 字段进行原子更新.此类用于原子数据结构,该结构中同一节点的几个字段都独立受原子更新控制. 先来看一段代码: package autom ...
- 原生 JS 实现扫雷 (分析+代码实现)
阅读这篇文章需要掌握的基础知识:Html5.CSS.JavaScript 在线Demo:查看 扫雷规则 在写扫雷之前,我们先了解下它的游戏规则 ● 扫雷是一个矩阵,地雷随机分布在方格上. ● 方格上的 ...
- Linux磁盘管理和lvm
磁盘管理 硬盘接口和硬盘种类 从整体的角度上,硬盘接口分为IDE.SATA.SCSI和SAS四种,IDE接口硬盘多用于家用产品中,也部分应用于服务器,SCSI接口的硬盘则主要应用于服务器市场,而SAS ...