如何在使用房间时手动调用CREATE TABLE?
鉴于Java中的这个自定义SQLiteOpenHelper
:
public class ExamplesOpenHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "app.db"; private static final String CREATE_TABLE_STATEMENT = "CREATE TABLE examples (_id INTEGER PRIMARY KEY, NAME TEXT);"; public ExamplesOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE_STATEMENT); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS examples"); onCreate(db); } }
我可以在数据库迁移中引用CREATE_TABLE_STATEMENT
。 onUpgrade()
而不复制SQL代码。
我想实现与Kotlin和Room一样,如下所示:
@Database( entities = [ (Example::class) ], version = 2 ) abstract class ExamplesDatabase : RoomDatabase() { companion object { const val NAME = "examples" @Volatile private var INSTANCE: ExamplesDatabase? = null @JvmStatic fun getInstance(context: Context): ExamplesDatabase = INSTANCE ?: synchronized(this) { INSTANCE ?: buildDatabase(context).also { INSTANCE = it } } private fun buildDatabase(context: Context) = Room.databaseBuilder( context.applicationContext, ExamplesDatabase::class.java, NAME) .addMigrations(MIGRATION_1_2) .build() private val MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(db: SupportSQLiteDatabase) { // How to invoke CREATE TABLE here? } } } }
这一次实际的表格定义是从Example
模型中导入的。 如何从房间推断CREATE_TABLE_STATEMENT
,以便在迁移中使用它? 我想避免手动编写语句,从而定义它两次 :一次在模型中,一次在SQL语句中。
不,我不认为有办法做到这一点。 看官方教程 。
static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { database.execSQL("CREATE TABLE `Fruit` (`id` INTEGER, " + "`name` TEXT, PRIMARY KEY(`id`))"); } };
看来你必须自己写。