使用ORMLite从JSON更新外键

时间:2013-08-30 17:05:29

标签: java android gson ormlite

我在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。是否有一种简单的方法可以将其转换为相应的场所,而无需多次查询的大量开销

1 个答案:

答案 0 :(得分:0)

这是基于以下假设的高级答案:

  • 您的API还会返回每个Venue对象的Json字符串或
  • 你可以轻松地为你的数据库中的每个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,那么您的查询成本将仅为“全选”以填充地图,之后该字符串替换将仅在内存中进行。