Intereting Posts
Библиотека поддержки проектирования – какая версия для использования с SDK v21 Это приложение не будет запущено, если вы не обновите ошибку сервисов Google Play Сохранять объект фрагмента во время вращения Как передать значения между диалогом и активностью? Добавление высоты / тени на панели инструментов для устройств с предварительным леоптипом StringByEvaluatingJavascriptFromString (метод iOS, что эквивалентно Android?) Эффект изображения заголовка Spotify ListView Как установить напоминание в Android? Камера в Android, как получить лучший размер, размер предварительного просмотра, размер изображения, размер изображения, искаженное изображение Установить выравнивание текста в центре в spinner в android Ошибка: не удалось разрешить: com.twitter.sdk.android:twitter-2.3.0 – Android Studio ClassNotFoundException при unmarshalling: android.support.v4.view.ViewPager $ SavedState Ошибка копирования / вставки с помощью eclipse Juno Прокси-сервер WebView android Какая лицензия (ы) – это библиотеки поддержки Android, выпущенные под?

Слияние объекта Realm и объекта Gson

Моя цель – сохранить объект, созданный с помощью 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); 

Это не сработает, потому что вам нужно создать экземпляр объекта realm, используя

 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 может работать.

Любые идеи о том, как решить эту загадку?

Solutions Collecting From Web of "Слияние объекта Realm и объекта Gson"

Эмануэле из Королевства здесь.

В настоящее время решение является субоптимальным и представлено в одном из примеров: https://github.com/realm/realm-java/blob/master/examples/gridViewExample/src/main/java/io/realm/examples/realmgridview /GridViewExampleActivity.java

Мы работаем над тем, чтобы сделать процесс более плавным!

Как было сказано в предыдущих ответах для сериализации RealmObject с Gson, соответствующий JsonSerializer должен быть зарегистрирован в экземпляре Gson. Ниже мой пример универсального JsonSerializer для Gson, который работает с геттерами вместо полей.

Во-первых, он должен быть зарегистрирован в 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(); } 

И тогда можно получить JSON из любого класса RealmObject (и даже созданного в Realm) следующим образом:

 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); } } } } 

Этого можно достичь с помощью ONE LINE OF CODE .

Получите копию в памяти управляемого объекта RealmObject и передайте ее в Gson

 String jsonVacature = new Gson().toJson(realm.copyFromRealm(vacature)); 

Проверьте этот ответ для получения более подробной информации и других решений.