0

私は Gson と一緒に Android アプリケーション内で ORMLite を使用しており、現在次の問題に苦しんでいます。

私のアプリ内には、ORMLite/Gson を利用する複数のクラスがあります。簡単にするために、2 つだけを使用して問題を説明します。

クラスがあるとし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 がこれを理解し、内部のオブジェクトを id = 1のVenueオブジェクトに更新することです!Product

誰でも解決策を考えることができますか?

編集:

私の問題をよりよく理解するために、サンプル Json を次に示します。

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

ご覧のとおり、オブジェクトではなく、venueid の int を取得しVenueます。複数のクエリの大きなオーバーヘッドなしで、対応する会場に変換する簡単な方法はありますか

4

1 に答える 1

0

これは、次の仮定に基づく高レベルの回答です。

  • API は、すべての Venue オブジェクトまたはすべての Json 文字列も返します。
  • DBにあるすべてのオブジェクトのJson文字列を簡単に取得できVenueます(ORMLiteの名前からでも、ORMLiteをまったく知らないのは残念です;))。

Map<Integer, String>そのため、どういうわけか、int キーが会場 ID で、値がそのオブジェクトの Json 文字列であるような小さな辞書を作成しVenueます。

次に、ProductAPI から 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 ルックアップ」のようなものだと考えてください。

DB から Venue を読み取ることができる場合、クエリのコストは、マップを埋めるための「すべて選択」だけになり、その後、文字列の置換はメモリ内でのみ発生します。

于 2013-09-03T20:46:36.480 に答える