在Android上運用Anko和Kotlin開發數據庫:SQLite從來不是一件輕松的事(KAD25)


作者:Antonio Leiva

時間: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的類都可以直接訪問數據庫。

 

 

這就是允許我們使用的最初始代碼。

 

 

定義數據庫表結構

 

 

 

為了創建我們的數據庫,我們需要實現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)
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")

 

我個人認為第二種方法更簡單。

 

 

你還可以使用所有數據庫常規操作,如limitorderByhavinggroupBy你可以在Anko文檔中看到所有這些操作。

 

為了處理結果光標,Anko還為我們提供了不同的函數,如parseSingle(對一個結果)或者parseList(對於幾個結果)。這些函數接收一個rowParser

 

 

有許多不同的解析器。MapRowParser是其中一個有趣的,它將列映射到一張圖(map)中。

 

 

運用這個解析器和map委托,您可以直接解析圖中的值到類中。可以我的書中看到這個說明。

 

結論

 

盡管有許多的庫可以簡化數據庫的很多工作,而對於簡化工作來說,Anko已足夠了。

 

由於它為我們簡化了許多使用數據庫的帶來痛苦事情,所以它是簡化數據庫工作的很好選擇。

 

 

另外,它向我們展示了用其他方式來使用語言,當您遇到問題時,這些語言非常有用。

 

 

不要忘了看看以前的文章,了解更多關於Kotlin

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM