2017-06-11 4 views
1

Ich habe meine Anwendungsdatenbank wie folgt erstellt. Ich möchte jetzt Datensatz einfügen und abrufen, wie Link sagt https://antonioleiva.com/databases-anko-kotlin/database.useImplementierung von SQLite in Kotlin und 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 verwenden, um

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

    insertPerson() 
} 


fun insertPerson() { 
    database.use { 

    } 
} 

Kann mir jemand andeuten, welche Linie für val Context.database: AppDbHelpler get() = AppDbHelpler() ist. Was es macht ?

Antwort

4

val Context.database ist eine Verwendung von extensions in Kotlin. Sie ermöglichen den Zugriff auf den Wert database, wenn Sie in einer Klasse (oder einer anderen Funktion) mit Context arbeiten.

Die folgende get() Methode definiert die property dieser Variablen. Dies entspricht einer getDatabase()-Methode in Java, bei der der AppDbHelper wie gezeigt zurückgegeben wird. Auf diese Weise können Sie den Helper mithilfe der Variablensyntax abrufen. Da der Getter eine Funktion ist, erstellt er jedes Mal einen neuen Helfer und nicht, wie sich eine tatsächliche Variable mit nur einer Zuweisung verhält. Beachten Sie auch, dass dies eine val ist, eine Set-Methode nicht zur Verfügung gestellt wird.

Der Code entspricht

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

in Java

+0

'Extensions'- Ist es Ihnen Variablen von überall zugänglich machen können, hängt vor Punktartauswahleinheit auf. Wenn es "Kontext" ist, dann erlaubt es, diese Methode aufzurufen, wo Sie "Kontext" haben. Wenn ich 'X' spezifiziere, kann ich das hier aufrufen, wo ich' X' zur Verfügung habe. So funktioniert es? –

+0

In diesem speziellen Fall können Sie, wenn Sie sich in einer Aktivität befinden (was den Kontext erweitert), direkt 'database' schreiben, um sie zu verwenden. Wenn Sie sich in einer Ansicht befinden, können Sie sie nicht direkt verwenden. Aber Sie können 'context.database' aufrufen. Beachten Sie, dass sich 'context' in Views direkt auf' getContext() 'bezieht. Wenn Sie mit den Methoden 'with' oder' apply' in Kotlin vertraut sind, können Sie 'context.apply {database}' verwenden, um sie zu erhalten. Erweiterungen ermöglichen es Ihnen, die Methoden/Variablen so zu verwenden, als ob sie Teil der ursprünglichen Klasse wären. Aber am Ende wird es statisch aufgerufen, so dass Sie keine benutzerdefinierte Klasse erstellen. –

Verwandte Themen