GreenDao 和实体继承

3
我的任务是为我的应用程序(它是某种信使)在Android OS上制作磁盘缓存。我想将消息存储在数据库中,但遇到了存储不同类型消息的问题(目前有5种类型的消息,每种类型都有自己的字段,并且它们都继承基类)。
GreenDaodocumentation说:
注意:当前不可能拥有另一个实体作为超类(也没有多态查询)
我计划有一个实体与基类几乎一对一,除了一个列-原始二进制或JSON数据,每个子类都可以在其中编写任何需要的内容。
我的问题是:
  1. GreenDao是这种情况下的好解决方案吗?是否有其他解决方案可以让我们不用担心继承问题,它们在效率方面的成本是多少。
  2. 如何将数据“序列化”到这样的字段中(我应该重写哪个方法或者我应该把我的代码放在哪里来完成所有必要的事情)。
  3. 如何为GreenDao提供正确的构造函数以将Json或二进制文件“反序列化”为正确的类实例。
  4. 我应该使用反射还是使用switch/case来查找正确的构造函数(只有5种类型的构造函数可用)- 反射在这种情况下会产生多大的“成本”?

你的类是由GreenDAO生成的,那么你为什么要首先创建一个基类呢?我建议使用接口就足够了。 - AlexS
大多数时候,我使用消息作为基类的实例进行工作,但有时我需要它们作为具体类型 - 例如:在聊天中,这条消息是传入的还是传出的。而且我认为为每种类型的消息拥有自己的表会使程序变得更加复杂和低效 - 要在屏幕上绘制对话框,就需要访问多个表格... - Art
1个回答

3
如果你确实需要继承,那么greendao不是我首选的选择,因为它不支持继承。但我认为你可以不用继承:你可以设计一个带有鉴别器列(messagetype)和二进制或文本列(data)的实体。然后,您可以使用抽象工厂根据messagetype从数据创建所需的对象。如果转换复杂,我会将其放在单独的类中;否则,我会将其作为保留部分的方法。请注意,如果您真的有很多消息,这种设计可能会减慢速度,因为单独的表会减小索引大小。谈到索引:如果您想通过数据列的某些属性稍后访问消息,则无法在其上放置索引。

是的,我是这样做的 - 只需为基本类创建ORM,为每个继承基类的子类创建一个String(JSON格式)。 - Art
为了避免频繁解析JSON对象 - 继承类的实例是基于ORM类的实例创建的,并缓存所有必要的字段。 - Art

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接