アプリケーションにDBを実装していて、それをRESTインターフェイスに「接続」しようとしています。データはJSONとして、新しいJSONサポート(レルム0.76以降)で提供されます。私のRealm.createObjectFromJson(MyType.class, jsonString)
でJSONをスローでき、適切なオブジェクトとRealmListsを作成します。
しかし、どうすれば反対のことができますか?つまり、RealmObjectを取得してJSONにシリアル化しますか?また、そのオブジェクト内のRealmListをシリアル化する必要があります。
ここレルムのクリスチャン。 Realm for Androidは現在、そのようなメソッドを持っていませんが、コアデータベースは実際にはJSONシリアル化をサポートしているため、今のところ、手動で行うか、GSONなどのサードパーティツールを使用する必要があります(警告、私はまだそのシナリオをテストしていません)。
簡単に言うと、あなたがする必要があるのは:
Gson gson = //... obtain your Gson
YourRealmObject realmObj = realm.where(YourRealmObject.class).findFirst();
if(realmObj != null) {
realmObj = realm.copyFromRealm(realmObj); //detach from Realm, copy values to fields
String json = gson.toJson(realmObj);
}
jSONをRealmObjectに逆シリアル化するには、次のいずれかを使用します
このようなクラス定義があると言う
_ @RealmClass
public class Foo extends RealmObject{
private String name;
public void setName(String name){ this.name = name}
public String getName(){ return this.name}
}
_
そしてこのようなjsonペイロード:
_ String json = "{\"name\":\"bar\"}";
Foo fooObject= realm.createObjectFromJson(Foo.class, json);
//or
String jsonArray = "[{\"name\":\"bar\"},{\"name\":\"baz\"}]";
RealmList<Foo> fooObjects = realm.createAllFromJson(Foo.class, jsonArray);
_
ただし、その逆はレルムコアではネイティブにサポートされていません。だからこれは私がそれを回避する方法です。 [〜#〜] gson [〜#〜]を使おうとしましたが、コードが多すぎて自分では理解できなかったので、このように独自のアダプターを実装しました。問題はRealmObjectsが'レルム' _Java.lang.Object
_ではありません。
レルムオブジェクトのインスタンスを取得し、そのJSON表現を返すadapterを作成します。
例
_ public class RealmJsonAdapter{
public JSONObject toJson(Foo foo){
JSONObject obj = new JSONObject();
obj.putString("name",foo.getName());
//if you have more fields you continue
return obj;
}
}
_
これで、クラスでこのアダプターを使用して、RealmObject
を[〜#〜] json [〜#〜]にシリアル化できます。できれば、アダプターをインターフェースにして、呼び出し元(自分自身かもしれません)が使用したいアダプターを渡せるようにします。次に、たとえばadapter.toJSON(realmObjectInstance)
を呼び出すことができます。そして、RealmObjectではなくJSONだけを気にするので、JSONObjectの実装を取得します。
[〜#〜] note [〜#〜]この解決策は少し時代遅れです。 RealmObjectsが実際のJavaオブジェクトになっているため、GSONで問題なく使用できるはずです。バージョン0.89以降を使用していることを確認してください。すべてが正常に機能します。
以下は、GSONライブラリを使用してそれを行う方法です。
サーバーから次のjson応答があるとします。
{
"data": [
{
"id": "1",
"name": "John",
"surname": "Doe"
}
]
}
このJsonオブジェクトに対して、対応するプロパティを持つヘルパークラスを作成します
public class JsonHelperClass {
String id;
String name;
String surname;
public JsonHelperClass() {
}
public JsonHelperClass(String id, String name, String surname) {
this.id = id;
this.name = name;
this.surname = surname;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}
次のjsonReplyには、サーバーからの応答を含む文字列があります。
JSONArray jsonArray = new HttpManager().getJsonArrayFromReply(jsonReply);
if(jsonArray == null || jsonArray.length <0){
return;
}
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject json = null;
try {
json = (JSONObject) array.get(i);
} catch (JSONException e) {
return null;
}
Gson gson = new Gson();
JsonHelperClass helperClass = gson.fromJson(json.toString(), JsonHelperClass.class);
createRealmObject(helperClass);
}
public void createRealmObject(JsonHelperClass helperClass){
Realm realm = Realm.getInstance(context);
realm.beginTransaction();
RealmDataObject obj = realm.createObject(RealmDataObject.class);
obj.setId(helperClass.getId());
obj.setName(helperClass.getName());
obj.setSurname(helperClass.getSurname());
realm.commitTransaction();
}
public JSONArray getJsonArrayFromReply(String reply){
JSONArray array = null;
try {
JSONObject jsonResp = new JSONObject(reply);
array = jsonResp.getJSONArray("data");
} catch (JSONException e) {
return null;
}
return array;
}
そしてレルムデータオブジェクト
public class RealmDataObject extends RealmObject {
private String id;
private String name;
private String surname;
public RealmDataObject() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}
private JSONArray convertRealmintoJSONArray(Activity context){
try {
RealmResults<ModelMyCart> results = RealmControllerMyCart.with(context).getBooks();
JSONArray jsonArray = new JSONArray();
for (ModelMyCart myCart : results
) {
JSONObject object = new JSONObject();
object.put(Constants.PRODUCT_ID, myCart.getId());
object.put(Constants.PRODUCT_TITLE, myCart.getProduct_title());
object.put(Constants.PRODUCT_SIZE, myCart.getProduct_size());
object.put(Constants.PRODUCT_SELLINGFEE, myCart.getProduct_sellingfee());
object.put(Constants.PRODUCT_SELLINGFEE, myCart.getShipping_price());
object.put(Constants.PRODUCT_IMAGE, myCart.getProduct_image());
object.put(Constants.PRODUCT_BRAND, myCart.getProduct_brand());
object.put(Constants.PRODUCT_CATEGORY_ID, myCart.getProduct_category_id());
object.put(Constants.PRODUCT_CATEGORY_NAME, myCart.getProduct_category_name());
object.put(Constants.PRODUCT_COLOR, myCart.getProduct_color());
object.put(Constants.PRODUCT_COLORTYPE, myCart.getProduct_colortype());
object.put(Constants.PRODUCT_CONDITION, myCart.getProduct_condition());
object.put(Constants.PRODUCT_CREATED_DATE, myCart.getProduct_created_date());
object.put(Constants.PRODUCT_MYSALEPRICE, myCart.getProduct_mysaleprice());
object.put(Constants.PRODUCT_ORIGINALPRICE, myCart.getProduct_originalprice());
object.put(Constants.PRODUCT_POTENTIALEARNINGS, myCart.getProduct_potentialearnings());
object.put(Constants.PRODUCT_SHIPPINGCHARGES, myCart.getProduct_shippingcharges());
object.put(Constants.USER_ID, myCart.getUser_id());
object.put(Constants.USER_UNAME, myCart.getUser_uname());
jsonArray.put(object);
}
Log.e("Converted",""+jsonArray);
return jsonArray;
}catch (Exception e){
}
return null;
}