我在Gson的一个Android应用程序中使用ORMLite,目前正在努力解决以下问题。
在我的应用程序中,有多个类使用ORMLite / Gson,为简单起见,我将仅使用两个来描述问题。
假设我们有一个班级Product
:
@SerializedName("product_id")
@DatabaseTable(tableName = "products")
public class Product {
public Product() {
}
@DatabaseField(id = true)
private int id;
// Generic stuff
@DatabaseField
@SerializedName("product_desc")
private String desc;
@DatabaseField
@SerializedName("in_stock")
private boolean inStock;
@DatabaseField(unique = true)
@SerializedName("product_name")
private String name;
// Issue occurs here
@DatabaseField(foreign = true, foreignAutoRefresh = true)
private Venue venue;
}
我们有一个班级“Venue`:
@DatabaseTable(tableName = "venues")
public class Venue {
public Venue() {
}
@SerializedName("venueid")
@DatabaseField(id = true)
private int id;
// Other Generic Junk
@DatabaseField
private String desc;
@DatabaseField
private String email;
@DatabaseField
private String fax;
@DatabaseField
@SerializedName("venue_name")
private String name;
@DatabaseField
private String phoneNumber;
}
我使用Gson从预先编写的API反序列化Json,ORMLite用这些数据填充数据库。当API返回与每个产品相关联的场所的场地ID (例如,venueid = 1)而不是Venue
对象时,会出现问题。
但是,数据库已经填充了这些场所,因此venueid = 1
指的是当前数据库中的真实场所。
麻烦在于让ORMLite理解这一点,并将Venue
中的Product
对象更新为id = 1的对象!
有人能想到解决方案吗?
修改
为了更好地理解我的问题,这里有一些示例Json:
[
{
"productid": 1,
"venueid": 4,
"product_name": "Jack Daniels",
"in_stock": true,
"orders_accepted": true,
}
...
]
正如您所看到的,我得到了一个对于sceneid而不是Venue
对象的int。是否有一种简单的方法可以将其转换为相应的场所,而无需多次查询的大量开销
答案 0 :(得分:0)
这是基于以下假设的高级答案:
Venue
对象获取一个Json字符串(抱歉,我根本不知道ORMLite,即使从它的名字,我可以想象它的作用;)。 / LI>
因此,以某种方式构建一个像Map<Integer, String>
这样的小字典,其中int键是您的场地ID,值是该Venue
对象的Json字符串。
然后,当您从API获取Product
Json时,使用regexp进行简单的字符串替换。
例如,您应该转换:
{
"productid": 1,
"venueid": 4,
"product_name": "Jack Daniels",
"in_stock": true,
"orders_accepted": true,
}
成:
{
"productid":1,
"venue":{
"venueid":4,
"desc":"aDesc",
"email":"aEmail",
"fax":"aFax",
"venue_name":"aname",
"phoneNumber":"aPhonenumber"
},
"product_name":"Jack Daniels",
"in_stock":true,
"orders_accepted":true
}
更换字符串后,您应该能够将更新的Json字符串解析为数据结构,而不再涉及数据库。认为这就像是“Json查找”。
如果您可以从数据库中读取Venue,那么您的查询成本将仅为“全选”以填充地图,之后该字符串替换将仅在内存中进行。