繁体   English   中英

带有多张桌子的预包装房间数据库

[英]prepackaged room db with multiple tables

(基于:

Android 机房:一库多表

https://gist.github.com/garcia-pedro-hr/9bb5d286d3ea226234a04109d93d020a )

我有一个包含多个表的 .db 文件,我无法思考如何在任何应用程序中实现它,我应该为 .db 文件中的每个表创建一个实体吗? 即使每个表都包含精确的列?

例子:

table 'b' (
  `Id` int(6) UNSIGNED NOT NULL,
  `Short` text COLLATE utf8_unicode_ci DEFAULT NULL,
  `Full_name` text COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

(上面列出的信息是我从“mySQL workbench”得到的)

和表'b'中的一条数据:

(6, 'BBI', 'pow. bie.'),
table 'c'(
  `Id` int(6) UNSIGNED NOT NULL,
  `Short` text COLLATE utf8_unicode_ci DEFAULT NULL,
  `Full_name` text COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

和表'c'中的一条数据:

(3, 'CT', 'Tor.'),

我应该为 .db 文件中的每个表创建一个实体吗?

是的

  • (基本上必须有一个实体(用@Entity注解的类也包含在@Database注解中定义的实体列表中))

尽管您可以执行以下操作之一来简化问题:-

  1. 合并所有表格,添加一列指示原始表格。 您可以使用prePackagedDatabaseCallback来组合表(或相应地预先打包预打包的数据库)。

  2. 使用单个基础 class 并扩展该 class 例如

:-

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 注释的 class,包括实体列表中的 TableB 和 TableC,例如:-

@Database(entities = {TableB.class,TableC.class},version = 1)

Room 生成一个 class 与 class 同名,用 @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 字符之间进行大小写折叠。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM