¿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.

  • Objeto de inheritance rápida y significado de la interfaz
  • Cómo llamar al constructor String de Java (char , int offset, int length) de Kotlin?
  • UNRESOLVED_REFERENCE Referencia no resuelta: isInitialized
  • Java Wildcard-types vs Kotlin Star-projection
  • reflexión kotlin get list de campos
  • Método de references al método Super Class
  • Agregar el constructor secundario al padre afecta inesperadamente a las classs secundarias
  • No se puede "findViewById" en Kotlin. Obteniendo el error "Falló la inferencia de tipo"
  • La aplicación Kotlin cli no funciona después de actualizar a kotlin 1.0.0-beta
  • @ Propiedad lateinit autocadenada '' no se ha inicializado
  • Error al imprimir el número primo usando funciones de order alto en kotlin