0

(基于:

Android Room:一个数据库多表

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.'),
4

1 回答 1

1

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

是的

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

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

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

  2. 使用单个基类并扩展该类,例如

:-

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 字符进行大小写折叠。

于 2021-12-30T15:48:58.260 回答