2017-06-11 45 views
1

我創建了我的應用程序數據庫,如下所示。現在我要插入記錄和檢索作爲此鏈接說https://antonioleiva.com/databases-anko-kotlin/使用database.useSQLite在Kotlin和Anko中的實現

import android.database.sqlite.SQLiteDatabase 
import org.jetbrains.anko.db.* 


class AppDbHelpler : ManagedSQLiteOpenHelper(AppApplication.instance(), AppDbHelpler.DB_NAME, null, AppDbHelpler.DB_VERSION) { 

    companion object { 
     val DB_NAME = "person.db" 
     val DB_VERSION = 1 
     val instance by lazy { AppDbHelpler() } 
    } 

    override fun onCreate(db: SQLiteDatabase?) { 
     db!!.createTable(PersonTable.Name, true, 
       Pair(PersonTable.ID, INTEGER + PRIMARY_KEY + AUTOINCREMENT), 
       Pair(PersonTable.PersonName, TEXT), 
       Pair(PersonTable.Domain, TEXT), 
       Pair(PersonTable.MobileNumber, REAL)) 
    } 

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { 
     db!!.dropTable(PersonTable.Name, true) 
     onCreate(db) 
    } 
} 

// Access property for Context 
val Context.database: AppDbHelpler 
get() = AppDbHelpler() 

MainActivity.kt

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_main) 

    insertPerson() 
} 


fun insertPerson() { 
    database.use { 

    } 
} 

誰能暗示我什麼是線val Context.database: AppDbHelpler get() = AppDbHelpler()。它能做什麼 ?

回答

4

val Context.database是在Kotlin中使用extensions。它們允許您在使用Context的課程(或其他功能)中訪問值database

下面的get()方法定義了該變量的property。它相當於Java中的getDatabase()方法,它將返回AppDbHelper,如圖所示。通過這種方式,您可以使用變量語法檢索幫助程序。由於getter是一個函數,因此每次都會創建一個新的幫助程序,而不是一個實際的變量只有一個賦值時的行爲。另請注意,由於這是val,因此不提供設置方法。

代碼相當於

public static AppDbHelper getDatabase(Context context) { 
    return new AppDbHelper(); 
} 

在Java中

+0

'Extensions'-它允許你做變量從任何地方訪問,點式前要看。如果它是'Context',那麼它允許你在有'Context'的地方調用這個方法。如果我指定'X',那麼它將允許我在有'X'可用的地方調用它。這是如何工作的? –

+0

在這種特殊情況下,如果你在一個Activity(擴展上下文)中,你可以直接寫'database'來使用它。如果您在視圖中,則無法直接使用它。但是你可以調用'context.database'。請注意,Views中的'context'直接引用'getContext()'。如果您熟悉Kotlin中的'with'或'apply'方法,則可以使用'context.apply {database}'來獲取它。擴展允許您使用方法/變量,就像它是原始類的一部分一樣。但最終它被靜態調用,所以你不會創建一個自定義類。 –