如果我们的房间里有@entity,其中有复杂的对象作为字段,我们可以使用2种方法:
@嵌入式 - 正如我所理解的,如果您用此注释标记字段,则房间将保存所有作为实体本身字段中的对象内部的字段,然后正确检索所有内容。
@@typeconverter-在这里我们编写自己的转换器,在大多数情况下,它归结为将对象通常解析为JSON字符串。实际上是:
根本差异是什么?为什么不在任何地方写@embedd,而不必担心转换器?什么时候写自己的转换器更好,什么时候最好使用@embedded,这些方法的优点和缺点是什么?
或实际上,这里还有另一种方法要提及 - 将复杂的对象保存在单独的表中,并与外键链接到它(像往常一样使用
id
Int
类型,通常是自动化的)。
如果复杂的对象具有自己的价值,并且与其他对象有多个连接,请考虑使用单独的表和外键。示例:您有复杂的对象
Long
和另一个-Ind -
User
(和字段:UserGroup
user
(字段:Document
)。使用单独的表author
您只能在一个地方更改用户的名称,而无需触摸另外两个表(但您应该使用User
方法来做到这一点)。
wiD-使用的用例用于
@Embedded
-正在将类型转换为整数,因为Sqlite不知道如何使用自己的类型的系统保存此类型。
Type-converter
在这种情况下没有帮助。 另一个用于
Date
@Embedded
的用例是一个字段中某些对象的列表或数组。但是通常可以使用单独的表和外键替换此方法(如果这些对象形成列表具有其自己的值)。
如果在多个@Entity中,您在同一复杂的对象上使用
Type-converter
,则应该考虑使用单独的表和外键的选项,因为它浪费了空间,并且以某种方式违反了DB表标准化的原理。例如,如果某些复杂的对象具有n个字段,并且您将其用作另外两个表的
Type-converter
@Embedded
被 @relation(房间的类似物)中广泛使用。在那里,它们确实很有帮助,并有很大帮助使这些数据类的代码简短而简单。这样,@embedded不会像表的结构添加任何重复(因为它仅影响内存中的对象),就像它在用 @entity注释的类中使用时一样。
实际差异是,使用同一表,
@Embedded
@Embedded
会。从
@TypeConverter
转换为
@Embedded