¿Cómo se transfiere el valor de db en Kotlin?

El Código 1 es un proyecto de muestra de una página web, no sé cómo se override fun onCreate(db: SQLiteDatabase) el valor de var db para override fun onCreate(db: SQLiteDatabase) en el Código 1.

Comprobé el código fuente ManagedSQLiteOpenHelper y SQLiteOpenHelper, ¡y aún no lo entiendo!

Código 1

 class ForecastDbHelper(ctx: Context = App.instance) : ManagedSQLiteOpenHelper(ctx, ForecastDbHelper.DB_NAME, null, ForecastDbHelper.DB_VERSION) { companion object { val DB_NAME = "forecast.db" val DB_VERSION = 1 val instance by lazy { ForecastDbHelper() } } override fun onCreate(db: SQLiteDatabase) { db.createTable(CityForecastTable.NAME, true, CityForecastTable.ID to INTEGER + PRIMARY_KEY, CityForecastTable.CITY to TEXT, CityForecastTable.COUNTRY to TEXT) db.createTable(DayForecastTable.NAME, true, DayForecastTable.ID to INTEGER + PRIMARY_KEY + AUTOINCREMENT, DayForecastTable.DATE to INTEGER, DayForecastTable.DESCRIPTION to TEXT, DayForecastTable.HIGH to INTEGER, DayForecastTable.LOW to INTEGER, DayForecastTable.ICON_URL to TEXT, DayForecastTable.CITY_ID to INTEGER) } override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { db.dropTable(CityForecastTable.NAME, true) db.dropTable(DayForecastTable.NAME, true) onCreate(db) } } 

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() } } } 

SQLiteOpenHelper

 public abstract class SQLiteOpenHelper { public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) { throw new RuntimeException("Stub!"); } public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version, DatabaseErrorHandler errorHandler) { throw new RuntimeException("Stub!"); } public String getDatabaseName() { throw new RuntimeException("Stub!"); } public void setWriteAheadLoggingEnabled(boolean enabled) { throw new RuntimeException("Stub!"); } public SQLiteDatabase getWritableDatabase() { throw new RuntimeException("Stub!"); } public SQLiteDatabase getReadableDatabase() { throw new RuntimeException("Stub!"); } public synchronized void close() { throw new RuntimeException("Stub!"); } public void onConfigure(SQLiteDatabase db) { throw new RuntimeException("Stub!"); } public abstract void onCreate(SQLiteDatabase var1); public abstract void onUpgrade(SQLiteDatabase var1, int var2, int var3); public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { throw new RuntimeException("Stub!"); } public void onOpen(SQLiteDatabase db) { throw new RuntimeException("Stub!"); } } 

La class SQLHelper está destinada a simplificar el acceso a su database SQLite. pasando los valores al super le permite almacenar los valores para crear o actualizar la database.

La primera vez que llame a la database getWriteable validará la versión de DB con respecto a la proporcionada en su constructor y, si no existe, se invocará onCreate, si se llamará a onUpgrade, de lo contrario ocurrirán operaciones normales.

También ha publicado la fuente falsa anterior en el SQLiteOpenHelper en realidad es esto:

  public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version, DatabaseErrorHandler errorHandler) { if (version < 1) throw new IllegalArgumentException("Version must be >= 1, was " + version); mContext = context; mName = name; mFactory = factory; mNewVersion = version; mErrorHandler = errorHandler; } 

Así que no estoy seguro de dónde obtuvo su código fuente del SQLiteOpenHelper pero está codificado y es mucho más grande que su class abstracta pegada arriba.

  • No puedo usar Kotlin para Serenity-bdd
  • Accidentes de aplicaciones de cronómetro Android
  • Android Kotlin - Volley Código de respuesta inesperada 400
  • Escuchar posts y escribir commands en un flujo observable
  • ¿Por qué no encuentra Guice mi encuadernación List <Interface>?
  • Error: Kotlin: no se permiten varios valores para la opción de complemento org.jetbrains.kotlin.kapt: salida
  • Dagger 2 no reconoce el método de proporcionar en Kotlin. Java funciona bien
  • Prueba de unidad de complemento IDEA Intellij (dependencies de proyecto de testing)
  • Llamada API no funciona dentro de Anko Async
  • Conversor de Java a Kotlin y arguments de método nulable
  • Cómo get variables ext. * En el bloque de complementos en build.gradle.kts