我想通过迁移在空数据库中显式地创建所有DB表。我该怎么做?
Room始终使用实体类创建初始表。这是一种不可靠的方法。我无法控制架构,只能依赖Room。
Room始终使用实体类创建初始表。这是一种不可靠的方法。
事实恰恰相反,它并不可靠。然而,应该理解的是,当底层数据库管理器SQLite没有对象的概念,只有带列的表时,Room是关于存储和检索对象的。因此,Room必须能够从一行或多行中的列创建对象(实体(,因此必须满足的规则。如果满足,那么Room是相当可靠的。
我无法控制架构,必须依赖Room。
您可以通过对实体进行编码的方式进行。然而,规则有局限性,或者更正确/正式地使用SQLite。因此,您可以控制模式,但它必须遵守Room的规则/限制。
-
列类型就是一个例子。
-
SQLite对列类型有一种非常灵活的方法。实际上,任何东西都可以作为列类型被接受。
-
但是,Room必须知道如何存储/提取对象(实体(。因此,Room将列类型限制为INTEGER、TEXT,REAL或BLOB(SQLite支持的4种类型(。Room不支持catch-all NUMERIC类型,也不支持SQLite通过用于确定类型相关性的SQLite规则将其他列类型转换为类型。
- Room永远不会接受定义为
timestamp DATE
的列作为示例,因为DATE不是INTEGER、TEXT、REAL或BLOB之一(在SQLite中,DATE解析为NUMERIC的类型亲和性,即catch-all(
- Room永远不会接受定义为
-
我想通过迁移在一个空数据库中显式地创建所有DB表。我该怎么做?
简而言之,请执行以下操作之一:
- 在定义模式时遵循Room的规则
- 聪明一点,让Room来做这项工作(如下所述(,或者
- 使用本机SQLite而不是Room
-
聪明的方法是创建实体和用@Database注释的类,然后编译。这样做将生成具有
expected
模式的代码。生成的代码在生成的java中,通过Android Studio中的Android视图可见。它在类中,是用@Database注释的类的名称,后缀为_Impl。在createAllTables
方法中,是Room在创建表时使用的创建表SQL语句。这是Room所期望的,并将遵守规则。 -
然后,您可以使用Room创建的SQL作为创建或修改表的基础。
您可以在迁移中执行许多操作。如果引入了新表,则需要创建新表,因为迁移会传递一个未更改的数据库。迁移的工作是更改数据库,从而根据@database注释中定义的实体创建新表(如果需要(。