【问题标题】:Foreign Key update from JSON using ORMLite使用 ORMLite 从 JSON 更新外键
【发布时间】:2013-08-30 17:05:28
【问题描述】:

我在 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 返回与每个产品相关联的场所的 venue id(例如,venueid = 1)而不是 Venue 对象时,就会出现问题。

但是,数据库中已经填充了这些场所,因此 venueid = 1 指的是当前数据库中的真实场所。

问题在于让 ORMLite 理解这一点并将 Product 中的 Venue 对象更新为 id = 1 的对象!

谁能想到解决办法?

编辑:

为了更好地理解我的问题,这里有一些示例 Json:

[
    {
        "productid": 1,
        "venueid": 4,
        "product_name": "Jack Daniels",
        "in_stock": true,
        "orders_accepted": true,
     }
     ...
]

如您所见,我得到了一个 int 的场地 ID,而不是一个 Venue 对象。有没有一种简单的方法可以将其转换为相应的场地,而无需多次查询的大量开销

【问题讨论】:

  • 为了更好地理解。您希望在 Gson 反序列化场地填充正确的对象而您的字符串只有它的 id 之后?
  • 请看我的编辑,也许它会提供一些清晰@trapo

标签: java android gson ormlite


【解决方案1】:

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

  • 您的 API 还会为每个 Venue 对象返回一个 Json 字符串或
  • 您可以轻松地为数据库中的每个 Venue 对象获取一个 Json 字符串(抱歉,我根本不知道 ORMLite,即使从它的名称,我也可以想象它的作用;)。

所以,以某种方式构建一个像 Map<Integer, String> 这样的小字典,其中 int 键是您的场地 id,值是该 Venue 对象的 Json 字符串。

然后,当您从 API 获得 Product Json 时,使用正则表达式进行简单的字符串替换。 例如,您应该转换:

{
  "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 查找”。

如果您可以从数据库中读取场地,您的查询成本将只是“全选”来填充地图,之后字符串替换将仅在内存中发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多