我的目标是使用将使用GSON实例化的对象持久化到数据库中。
我的问题如下:
在我的oncreate中,这一部分对于两个方法都是相同的
//delete previous realm file
Realm.deleteRealmFile(this);
//gson instance
Gson gson = new Gson();
//realm instance
realm = Realm.getInstance(this);
**我的类名是Vacature **
信息:我知道下面的代码需要放在里面:
realm.beginTransaction();
// code here
realm.commitTransaction();
选项1:
//get class with gson
Vacature vacatureGson = gson.fromJson(jsonString, Vacature.class);
这是行不通的,因为您必须使用
Class instance = realm.createObject(Class.class); // Create a new object
选项2:
//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可能会起作用。
对如何解决这个难题有什么想法吗?
发布于 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
我们正在努力让体验变得更流畅!
发布于 2015-12-21 16:11:25
正如前面关于使用Gson序列化RealmObject
的答案中所说的,应该在Gson实例中注册适当的JsonSerializer
。下面是Gson的通用JsonSerializer
示例,它使用getters而不是字段。
首先,它应该注册到Gson,才能像这样使用:
@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,如下所示:
public class MessageModel extends RealmObject { ... }
String json = createGson().toJson(messageModelInstance);
你可以像这样复制MessageModel
:
MessageModel src= ...;
MessageModel dst= ...;
Serializer.newInstance(MessageModel.class).copy(src, dst);
还有这里的Serializer
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);
}
}
}
}
发布于 2017-02-18 08:59:27
这可以通过一行代码来实现。
在内存中获取托管RealmObject的副本并将其传递给Gson
String jsonVacature = new Gson().toJson(realm.copyFromRealm(vacature));
有关更多详细信息和其他解决方案,请查看this answer。
https://stackoverflow.com/questions/26275143
复制相似问题