房间:@embedded vs @typeconverters

问题描述 投票:0回答:1

如果我们的房间里有@entity,其中有复杂的对象作为字段,我们可以使用2种方法:

@嵌入式 - 正如我所理解的,如果您用此注释标记字段,则房间将保存所有作为实体本身字段中的对象内部的字段,然后正确检索所有内容。

@@typeconverter-在这里我们编写自己的转换器,在大多数情况下,它归结为将对象通常解析为JSON字符串。

实际上是:

根本差异是什么?为什么不在任何地方写@embedd,而不必担心转换器?什么时候写自己的转换器更好,什么时候最好使用@embedded,这些方法的优点和缺点是什么?

java android kotlin android-room
1个回答
3
投票

实际上,这里还有另一种方法要提及 - 将复杂的对象保存在单独的表中,并与外键链接到它(像往常一样使用

id

Int

类型,通常是自动化的)。
如果复杂的对象具有自己的价值,并且与其他对象有多个连接,请考虑使用单独的表和外键。示例:您有复杂的对象
Long
和另一个-Ind -
User

(和字段:
    UserGroup
  • )和
    user
    (字段:
    Document
    )。使用单独的表
    author
    您只能在一个地方更改用户的名称,而无需触摸另外两个表(但您应该使用
    User
    方法来做到这一点)。
    wiD-使用的用例用于
    @Embedded
    -正在将类型转换为整数,因为Sqlite不知道如何使用自己的类型的系统保存此类型。 
    Type-converter
    在这种情况下没有帮助。
    另一个用于
    Date
  • 的广泛使用的用例持续存在于数据库复杂的嵌套结构中,通常从后端API(JSON Serialization)获得。但是,如果您以后决定独立处理这些嵌套结构的一部分(例如,对它们查询)。
  • 一个更广泛使用的(对于我的口味 - 使用过多)用于
    @Embedded
    的用例是一个字段中某些对象的列表或数组。但是通常可以使用单独的表和外键替换此方法(如果这些对象形成列表具有其自己的值)。
    如果在多个@Entity中,您在同一复杂的对象上使用
    Type-converter
    ,则应该考虑使用单独的表和外键的选项,因为它浪费了空间,并且以某种方式违反了DB表标准化的原理。例如,如果某些复杂的对象具有n个字段,并且您将其用作另外两个表的
    Type-converter
  • 字段,这意味着SQLITE在这两个表中生成n个其他列。 应该提到的是,
  • @Embedded
    被 @relation(房间的类似物)中广泛使用。在那里,它们确实很有帮助,并有很大帮助使这些数据类的代码简短而简单。这样,@embedded不会像表的结构添加任何重复(因为它仅影响内存中的对象),就像它在用 @entity注释的类中使用时一样。
    
  • 实际差异是,使用同一表,
    @Embedded
  • 使用单独的表。即使可以滥用序列化/去序列化的JSON,这也只有在不需要查询那里的价值的同时才有意义 - 但是,一旦有人想查询数据,当它得到实际表的支持时,它的努力就会减少很多,而它得到了实际的表格,而这可以运行SQL(而不是跨过所有记录和所有JSON)。实际上,JSON是一种数据形式,而不是数据类型。 例如,以WordPress post-meta为例...这也是存储在SQL数据库中的JSON。同样在这里,这是可能的,但这就是表现低于标准的原因。 proper使用A
  • @Embedded
    会。从
    @TypeConverter
    转换为
    @Embedded
  • 使用@embedded注释将使升级数据库更加麻烦,您还应该注意引用的位置。
        
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.