0

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

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

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

谁能想到解决方案?

编辑:

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

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

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

4

1 回答 1

0

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

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

因此,以某种方式构建一个小字典Map<Integer, String>,例如 int 键是您的场地 id,值是该Venue对象的 Json 字符串。

然后,当您Product从 API 获取 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 查找”。

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

于 2013-09-03T20:46:36.480 回答