Room-如何通过迁移首次显式创建所有表



我想通过迁移在空数据库中显式地创建所有DB表。我该怎么做?

Room始终使用实体类创建初始表。这是一种不可靠的方法。我无法控制架构,只能依赖Room。

Room始终使用实体类创建初始表。这是一种不可靠的方法。

事实恰恰相反,它并不可靠。然而,应该理解的是,当底层数据库管理器SQLite没有对象的概念,只有带列的表时,Room是关于存储和检索对象的。因此,Room必须能够从一行或多行中的列创建对象(实体(,因此必须满足的规则。如果满足,那么Room是相当可靠的。

我无法控制架构,必须依赖Room。

您可以通过对实体进行编码的方式进行。然而,规则有局限性,或者更正确/正式地使用SQLite。因此,您可以控制模式,但它必须遵守Room的规则/限制。

  • 列类型就是一个例子。

    • SQLite对列类型有一种非常灵活的方法。实际上,任何东西都可以作为列类型被接受。

    • 但是,Room必须知道如何存储/提取对象(实体(。因此,Room将列类型限制为INTEGERTEXTREALBLOB(SQLite支持的4种类型(。Room不支持catch-all NUMERIC类型,也不支持SQLite通过用于确定类型相关性的SQLite规则将其他列类型转换为类型。

      • Room永远不会接受定义为timestamp DATE的列作为示例,因为DATE不是INTEGER、TEXT、REAL或BLOB之一(在SQLite中,DATE解析为NUMERIC的类型亲和性,即catch-all(

我想通过迁移在一个空数据库中显式地创建所有DB表。我该怎么做?

简而言之,请执行以下操作之一:

  1. 在定义模式时遵循Room的规则
  2. 聪明一点,让Room来做这项工作(如下所述(,或者
  3. 使用本机SQLite而不是Room
  • 聪明的方法是创建实体和用@Database注释的类,然后编译。这样做将生成具有expected模式的代码。生成的代码在生成的java中,通过Android Studio中的Android视图可见。它在类中,是用@Database注释的类的名称,后缀为_Impl。在createAllTables方法中,是Room在创建表时使用的创建表SQL语句。这是Room所期望的,并将遵守规则。

  • 然后,您可以使用Room创建的SQL作为创建或修改表的基础。

您可以在迁移中执行许多操作。如果引入了新表,则需要创建新表,因为迁移会传递一个未更改的数据库。迁移的工作是更改数据库,从而根据@database注释中定义的实体创建新表(如果需要(。

相关内容