【问题标题】:ORMLite custom data persister with multiple columnsORMLite 具有多列的自定义数据持久化器
【发布时间】:2011-10-21 17:36:03
【问题描述】:

假设我有一个名为 Person 的类,它通常使用 ORMLite 持久化到一个 db 表中。

现在,我在 Person 类中有一个名为 House 的成员。 House 类包含 3 个属性,并且永远不会存储到数据库中。

我想要的是每当Person 被持久化时,我想将House 的3 个字段存储到Person 表中的3 个不同的列中。

所以 Person 表将有:{ person_name, person_contact, house_address, house_type, house_date }

最后 3 个字段将来自 House 对象。

我想我应该在House 成员变量上使用DataPersister,但这是否意味着它将整个House 对象写入一列?我想将它分成Person 表内的 3 列。有人可以帮忙吗?

谢谢!

【问题讨论】:

  • 为什么不使用另一个表并为 House 添加外键?您的目标最低 Android 版本是什么?
  • 我不想将 House 存储到数据库中。我没有用它。我的要求在 ormlite 中是否可行?
  • 我只针对平板电脑,所以这是 Honeycomb。
  • 您不能同时不将房屋存储在数据库中和将房屋存储在数据库中。你真正想要完成什么?
  • 你读过我的问题吗?我想存储一个 Person 类,它将包含来自 House 对象的 2 列 + 3 列。

标签: android orm ormlite


【解决方案1】:

实际上,可序列化对象的完美解决方法可能是:

@DatabaseField (dataType = DataType.SERIALIZABLE) 
public Person person;

因此,Person 作为通常的原始变量存储在单个列中。

【讨论】:

  • 这很危险。如果更改Person的类变量,则存储在数据库中的值将无法正确反序列化为更改后的类。
  • @JasonRobinson 是的,这种方法的用户应该知道这个后果。
  • 序列化实际上非常聪明@JasonRobinson。只要您不更改版本 ID(而且您永远不应该这样做),那么序列化就会适当地处理缺失和未知的字段。
  • @Gray 我不知道,所以感谢您指出我的无知。
【解决方案2】:

您所要求的称为嵌入对象。子对象中的所有字段都存储在父对象中。

抱歉,目前 (12/2012) ORMLite 不支持嵌入对象。它在 TODO 列表中,但没有任何计划。正如@user999717 提到的,我们确实支持可以自动刷新的外来对象。这允许您将House 对象存储在另一个表中,当您取出Person 时,ORMLite 将查询它。这是它的文档:

http://ormlite.com/docs/foreign

【讨论】:

  • 你能说这对于嵌入式对象仍然适用吗?
  • 好的,谢谢,实际上我发现完美的解决方法可能是将可序列化对象存储在列中
【解决方案3】:

你可以用这个:

@DatabaseField (useGetSet = true)
private String personStr; // Dummy

public Person person;
public String getPersonStr(){ person.toString(); }
public void setPersonStr(String personstr){ person = Person(personstr); }

太糟糕了,以下不起作用,您需要额外的虚拟字段:

@DatabaseField (dataType = DataType.String, useGetSet = true) 
public Person person;
public String getPerson(){ person.toString(); }
public void setPerson(String personstr){ person = Person(personstr); }

您也可以使用 dataType = DataType.SERIALIZABLE ,如其他答案中所述,但使用自定义序列化,这意味着实际实现 Serializable 并在阅读时处理所有可能的序列化版本。 不应该使用默认序列化,因为你最终会弄乱数据库。

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 2012-09-17
    相关资源
    最近更新 更多