拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 带有多张桌子的预包装房间数据库

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

白鹭 - 2022-01-24 2117 0 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 作业台”获得的)

以及表“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.'),

uj5u.com热心网友回复:

是的

  • (基本上必须有一个物体(用@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')");
      }

统一编码/UTF

  • 请注意,您可能必须检查您的整理要求(Room 似乎没有对 UNICODE 选项说太多),但您可能会发现以下内容在这方面很有用:-

  • https://sqlite.org/version3.html(请参阅对 UTF-8 和 UTF-16 的支持)

  • https://sqlite.org/pragma.html#pragma_encoding

  • https://www.sqlite.org/datatype3.html#collat??ion

  • https://developer.android.com/reference/androidx/room/ColumnInfo#summary

  • 摘自https://www.sqlite.org/lang_expr.html#the_like_glob_regexp_and_match_operators
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *