首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >合并Realm对象和Gson对象

合并Realm对象和Gson对象
EN

Stack Overflow用户
提问于 2014-10-09 17:39:32
回答 3查看 5.2K关注 0票数 19

我的目标是使用将使用GSON实例化的对象持久化到数据库中。

我的问题如下:

  • 我可以用GSON实例化一个对象,所以GSON负责所有的属性,但是这样它就不会被持久化到db
  • 。我可以用
  • 实例化一个对象,但是我必须填写属性的所有setter。

在我的oncreate中,这一部分对于两个方法都是相同的

代码语言:javascript
复制
//delete previous realm file
Realm.deleteRealmFile(this);

//gson instance
Gson gson = new Gson();

//realm instance
realm = Realm.getInstance(this);

**我的类名是Vacature **

信息:我知道下面的代码需要放在里面:

代码语言:javascript
复制
realm.beginTransaction();

// code here

realm.commitTransaction();

选项1:

代码语言:javascript
复制
//get class with gson
Vacature vacatureGson = gson.fromJson(jsonString, Vacature.class);

这是行不通的,因为您必须使用

代码语言:javascript
复制
Class instance = realm.createObject(Class.class); // Create a new object

选项2:

代码语言:javascript
复制
//get instance with gson
Vacature vacatureGson = gson.fromJson(jsonString, Vacature.class);
//make instance with realm
Vacature realmVacature = realm.createObject(Vacature.class);
realmVacature = vacatureGson;

这是行不通的,因为这不是将所有属性从一个对象复制到另一个对象的正确方法。但是,如果有一种很好的方法可以将所有属性从gsonObject复制到realmObject,那么选项2可能会起作用。

对如何解决这个难题有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2014-10-09 18:02:34

来自王国的伊曼纽尔。

目前,该解决方案不是最优的,并在其中一个示例中给出:https://github.com/realm/realm-java/blob/master/examples/gridViewExample/src/main/java/io/realm/examples/realmgridview/GridViewExampleActivity.java

我们正在努力让体验变得更流畅!

票数 13
EN

Stack Overflow用户

发布于 2015-12-21 16:11:25

正如前面关于使用Gson序列化RealmObject的答案中所说的,应该在Gson实例中注册适当的JsonSerializer。下面是Gson的通用JsonSerializer示例,它使用getters而不是字段。

首先,它应该注册到Gson,才能像这样使用:

代码语言:javascript
复制
    @NonNull private static Gson createGson() {
            GsonBuilder gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
            try {        
                    gsonBuilder.registerTypeAdapter(Class.forName("io.realm.<YourClassName1>RealmProxy"), Serializer.newInstance(<YourClassName1>.class));
                    gsonBuilder.registerTypeAdapter(Class.forName("io.realm.<YourClassName2>RealmProxy"), Serializer.newInstance(<YourClassName2>.class));
                    ...
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }

        return gsonBuilder.create();
    }

然后可以从任何RealmObject派生的(甚至是由Realm创建的)类中获取JSON,如下所示:

代码语言:javascript
复制
public class MessageModel extends RealmObject { ... }
String json = createGson().toJson(messageModelInstance);

你可以像这样复制MessageModel

代码语言:javascript
复制
MessageModel src= ...; 
MessageModel dst= ...;

Serializer.newInstance(MessageModel.class).copy(src, dst);

还有这里的Serializer

代码语言:javascript
复制
public class Serializer<T> implements JsonSerializer<T> {

    private Class<T> clazz;
    private Serializer(Class<T> clazz) {this.clazz = clazz;}

    @NonNull
    public static <T> Serializer<T> newInstance(Class<T> clazz) {return new Serializer<T>(clazz);}

    @Override
    public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) {

        final JsonObject jsonObject = new JsonObject();

        Field[] fields = clazz.getDeclaredFields();
        for (Field f : fields) {
            if (f.isAnnotationPresent(Expose.class)) try {

                String name = f.getName();
                String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
                Method method = src.getClass().getMethod(methodName);
                Object o = method.invoke(src);

                if (o instanceof String) {
                    jsonObject.addProperty(name, (String) o);
                }
                else if (o instanceof Number) {
                    jsonObject.addProperty(name, (Number) o);
                }
                else if (o instanceof Boolean) {
                    jsonObject.addProperty(name, (Boolean) o);
                }
                else if (o instanceof Character) {
                    jsonObject.addProperty(name, (Character) o);
                }

            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }

        return jsonObject;
    }

    public <T> void copy(T src, T dst) {

        Field[] fields = clazz.getDeclaredFields();
        for (Field f : fields) {
            if (f.isAnnotationPresent(Expose.class)) try {

                String name = f.getName();

                String getterName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
                String setterName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
                Method getter = clazz.getMethod(getterName);
                Method setter = clazz.getMethod(setterName, f.getType());

                setter.invoke(dst, getter.invoke(src));

            } catch (Exception e) {
                e.printStackTrace();
                checkState(false);
            }
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2017-02-18 08:59:27

这可以通过一行代码来实现。

在内存中获取托管RealmObject的副本并将其传递给Gson

代码语言:javascript
复制
String jsonVacature = new Gson().toJson(realm.copyFromRealm(vacature));

有关更多详细信息和其他解决方案,请查看this answer

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26275143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档