2017-10-05 41 views
-1

代码1是一个来自网页的示例项目,我不知道代码1中的override fun onCreate(db: SQLiteDatabase)中的var db如何传递值。db如何在Kotlin中传递值?

我检查了源代码都ManagedSQLiteOpenHelper和SQLiteOpenHelper,我还不明白!

代码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!"); 
    } 
} 

回答

1

的提供SQLHelper类是为了让访问你的SQLite数据库更简单。将值传递给super允许它存储用于创建或升级数据库的值。

您第一次调用getWriteable数据库时,它会根据构造函数中提供的数据库验证数据库的版本,如果它不存在,将调用onCreate,如果更新,onUpgrade将被调用,否则正常的操作将会发生。

而且你贴假源上方的SQLiteOpenHelper它实际上是这样的:

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; 
} 

所以我不知道你在哪里得到了SQLiteOpenHelper的源代码,但它是编码,远远大于你的粘贴上面的抽象类。