kotlin
Android
搜索歷史功能
1.ManagedSQLiteOpenHelper的前世今生
SQLite是Android內(nèi)置的一個小型秀睛、關(guān)系型、屬于文本型的數(shù)據(jù)庫椭迎。
Android中田盈,通過SQLiteOpenHelper類來實現(xiàn)對SQLite數(shù)據(jù)庫的操作(創(chuàng)建、增简软、修痹升、刪)。
過創(chuàng)建子類繼承
SQLiteOpenHelper類踱卵,實現(xiàn)
它的一些方法來對數(shù)據(jù)庫進行操作据过。
在實際開發(fā)中妒挎,為了能夠更好的管理和維護數(shù)據(jù)庫,我們會封裝一個繼承自SQLiteOpenHelper類的數(shù)據(jù)庫操作類鳞芙,然后以這個類為基礎(chǔ)期虾,再封裝我們的業(yè)務(wù)邏輯方法。
抽象類ManagedSQLiteOpenHelper類繼承自SQLiteOpenHelper類
// ManagedSQLiteOpenHelper源碼
abstract class ManagedSQLiteOpenHelper(
ctx: Context,
name: String?,
factory: SQLiteDatabase.CursorFactory? = null,
version: Int = 1
): SQLiteOpenHelper(ctx, name, factory, version) {
private val counter = AtomicInteger()
private var db: SQLiteDatabase? = null
fun <T> use(f: SQLiteDatabase.() -> T): T {
try {
return openDatabase().f()
} finally {
closeDatabase()
}
}
@Synchronized
private fun openDatabase(): SQLiteDatabase {
if (counter.incrementAndGet() == 1) {
db = writableDatabase
}
return db!!
}
@Synchronized
private fun closeDatabase() {
if (counter.decrementAndGet() == 0) {
db?.close()
}
}
}
當(dāng)我們使用一個一般的SQLiteOpenHelper,我們需要去調(diào)用getReadableDatabase()或者getWritableDatabase()壕鹉,然后我們可以執(zhí)行我們的搜索并拿到結(jié)果聋涨。在這之后,我們不能忘記調(diào)用close()脊凰。使用ManagedSqliteOpenHelper我們只需要:
forecastDbHelper.use {
//forecastDbHelper類為繼承ManagedSQLiteOpenHelper類的類
...
}