我应该为 .db 文件中的每个表创建一个实体吗?
是的
- (基本上必须有一个实体(用@Entity注解的类也包含在@Database注解中定义的实体列表中))
,尽管您可以执行以下操作之一来简化问题:-
合并所有表格,添加一列指示原始表格。您可以使用prePackagedDatabaseCallback来组合表(或相应地预先打包预打包的数据库)。
使用单个基类并扩展该类,例如
:-
class BaseTable {
@PrimaryKey
Long id;
@ColumnInfo(name = "short", collate = UNICODE /*? need to check out Room's UNICODE v requirements */ )
String shrt;
String full_name;
}
和 :-
@Entity(tableName = "b")
class TableB extends BaseTable {
}
和 :-
@Entity(tableName = "c")
class TableC extends BaseTable{
}
使用@Database注释的类,包括实体列表中的TableB和TableC,例如:-
@Database(entities = {TableB.class,TableC.class},version = 1)
Room 生成一个与使用 @Database 注释但后缀为 _Impl 的类同名的类,其中有一个名为 createAllTables 的方法,使用上述方法将是:-
@Override
public void createAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("CREATE TABLE IF NOT EXISTS `b` (`id` INTEGER, `short` TEXT COLLATE UNICODE, `full_name` TEXT, PRIMARY KEY(`id`))");
_db.execSQL("CREATE TABLE IF NOT EXISTS `c` (`id` INTEGER, `short` TEXT COLLATE UNICODE, `full_name` TEXT, PRIMARY KEY(`id`))");
_db.execSQL("CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)");
_db.execSQL("INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1beb9a18d3900d11d1aa0e29c22c5208')");
}
UNICODE/UTF
重要提示:默认情况下,SQLite 只理解 ASCII 字符的大写/小写。默认情况下,LIKE 运算符对超出 ASCII 范围的 unicode 字符区分大小写。例如,表达式 'a' LIKE 'A' 为 TRUE,但 'æ' LIKE 'Æ' 为 FALSE。SQLite 的 ICU 扩展包括 LIKE 运算符的增强版本,它可以跨所有 unicode 字符进行大小写折叠。