如何在使用房间时手动调用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_STATEMENTonUpgrade()而不复制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`))"); } }; 

看来你必须自己写。