Android 具有多列的ORMLite自定义数据持久器

Android 具有多列的ORMLite自定义数据持久器,android,orm,ormlite,Android,Orm,Ormlite,假设我有一个名为Person的类,它通常使用ORMLite保存到db表中 现在,我在Person类中有一个名为House的成员。House类包含3个属性,从不存储到数据库中 我想要的是,每当Person被持久化时,我想将House的3个字段存储到Person表中的3个不同列中 因此Person表将有:{Person\u name,Person\u contact,house\u address,house\u type,house\u date} 最后3个字段将来自House对象 我认为应该在H

假设我有一个名为
Person
的类,它通常使用ORMLite保存到db表中

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

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

因此Person表将有:
{Person\u name,Person\u contact,house\u address,house\u type,house\u date}

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

我认为应该在
House
成员变量上使用
DataPersister
,但这是否意味着它会将整个
House
对象写入一列?我想在
Person
表中将其拆分为3列。有人能帮忙吗


谢谢

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

抱歉,目前(2012年12月)不支持嵌入式对象。它在待办事项清单上,但没有任何计划。正如@user999717所提到的,我们确实支持可以自动刷新的外来对象。这允许您将
House
对象存储在另一个表中,当您拉出
人员时,ORMLite将查询该对象。以下是它的文档:


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

@DatabaseField (dataType = DataType.SERIALIZABLE) 
public Person person;
因此,Person像通常的原语变量一样存储在单个列中。

您可以使用:

@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并处理所有可能的序列化版本。
不应使用默认序列化,因为最终将导致数据库混乱。

为什么不使用另一个表并向House添加外键?你的目标最低Android版本是什么?我不想把House存储到db中。我没用它。我所问的在ormlite中可能吗?我只针对平板电脑,所以这是蜂巢。你不能同时不在数据库中存储House和在数据库中存储House。你到底想完成什么?你读过我的问题吗?我想存储一个Person类,它将包含来自House对象的2列+3列。你能告诉我这对嵌入对象仍然是正确的吗?好的,谢谢,事实上我发现最好的解决方法是将可序列化对象存储在列中,而不是这是危险的。如果更改
Person
的类变量,则数据库中存储的值将无法正确反序列化到更改的类。@JasonRobinson是的,此方法的用户应该知道这一结果。序列化实际上非常聪明@JasonRobinson。只要您不更改版本id(并且您永远不应该这样做),序列化就会适当地处理丢失和未知的字段。@Gray我不知道,所以感谢您指出我的无知。