原作者介紹,在Android上如何運用Anko和Kotlin開發資料庫。 ...
時間:Mar 30, 2017
原文鏈接:https://antonioleiva.com/databases-anko-kotlin/
事實告訴我們:在Android中編寫資料庫是相當無聊的。
使用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 ... 3 }
大括弧內是SQLiteDatabase
類的擴展函數,這樣你就可以直接調用它的方法。另外,僅在這塊代碼執行前,將此表打開。而在代碼執行結束後將其關閉。
我們如何實現這個類?基於Anko的文檔,推薦的方法是:
1 class MySqlHelper(ctx: Context) : ManagedSQLiteOpenHelper(ctx, "mydb") { 2 3 companion object { 4 private var instance: MySqlHelper? = null 5 6 @Synchronized 7 fun getInstance(ctx: Context): MySqlHelper { 8 if (instance == null) { 9 instance = MySqlHelper(ctx.applicationContext) 10 } 11 return instance!! 12 } 13 } 14 15 override fun onCreate(db: SQLiteDatabase) { 16 } 17 18 override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { 19 } 20 21 } 22 23 // Access property for Context 24 val Context.database: MySqlHelper 25 get() = MySqlHelper.getInstance(applicationContext)
我們創建一個短小的單常式,它保存helper的實例,用同步的方法使不同的線程不能生成多個實例。
另外,我們為上下文創建一個擴展屬性,這樣任何需要Context
的類都可以直接訪問資料庫。
這就是允許我們使用的最初始代碼。
定義資料庫表結構
為了創建我們的資料庫,我們需要實現helper的onCreater
方法,並使用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) 7 }
這裡第一個參數給出的是資料庫名稱,第二個參數說明是否要在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) 7 }
而查詢,可以有幾種方法進行。在其中之一是,你可以為查詢的變數添加名稱,並將作為變數對將值添加上:
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")
我個人認為第二種方法更簡單。
你還可以使用所有資料庫常規操作,如limit
,orderBy
,having
或groupBy
。你可以在Anko文檔中看到所有這些操作。
為了處理結果游標,Anko還為我們提供了不同的函數,如parseSingle
(對一個結果)或者parseList
(對於幾個結果)。這些函數接收一個rowParser
。
有許多不同的解析器。MapRowParser
是其中一個有趣的,它將列映射到一張圖(map)中。
運用這個解析器和map
委托,您可以直接解析圖中的值到類中。可以我的書中看到這個說明。
結論
儘管有許多的庫可以簡化資料庫的很多工作,而對於簡化工作來說,Anko已足夠了。
由於它為我們簡化了許多使用資料庫的帶來痛苦事情,所以它是簡化資料庫工作的很好選擇。
另外,它向我們展示了用其他方式來使用語言,當您遇到問題時,這些語言非常有用。
不要忘了看看以前的文章,瞭解更多關於Kotlin!