2015-06-16 1 views
1

В настоящее время я работаю над проектом, в котором у моей базы данных очень большое количество таблиц (всего около 60). Я работаю над созданием класса Database Helper, который будет работать как писатель/читатель в/из базы данных. И пример моего метода записи будет таким:В Java, как мне сделать объект Realm в класс, который я хочу записать в базу данных?

public static void executeInsertInto(final Context context, final UserData passedObject){ 
    //Generate a realm object from the context 
    Realm realm = Realm.getInstance(context); 
    realm.executeTransaction(new Realm.Transaction() { 
     @Override 
     public void execute(Realm realm) { 
      //Begin a transaction, create a new item from the passed object, and commit. 
      realm.beginTransaction(); 
      UserData itemToWrite = realm.copyToRealm(passedObject); 
      realm.commitTransaction(); 
     } 
    }); 
    //Close the realm object to prevent leaks 
    if (realm != null) { 
     realm.close(); 
    } 
} 

Как видно из кода, я вручную создал объект типа UserData; Проблема в том, что я либо должен повторить это в общей сложности 60 раз (для многих типов объектов/таблиц), либо придумать лучший способ. Это приводит меня к моему вопросу, есть ли способ создать объект, используя тип переданного объекта для определения класса? Что-то вроде кода ниже не хочет работать, как я делаю что-то в корне неправильно с моим Java кодом:

public static void executeInsertInto(final Context context, final RealmObject passedObject){ 
      //Generate a realm object from the context 
      Realm realm = Realm.getInstance(context); 
      realm.executeTransaction(new Realm.Transaction() { 
       @Override 
       public void execute(Realm realm) { 
        //Begin a transaction, create a new item from the passed object, and commit. 
        realm.beginTransaction(); 
//The below line is flawed in that you cannot create an object that way, 
//But hopefully it illustrates what I am trying to accomplish 
        passedObject.getClass() itemToWrite = (passedObject.getClass()) realm.copyToRealm(passedObject); 
        realm.commitTransaction(); 
       } 
      }); 
      //Close the realm object to prevent leaks 
      if (realm != null) { 
       realm.close(); 
      } 
     } 

Кто-нибудь есть какие-либо идеи? Буду весьма признателен за это!

EDIT: Просто чтобы прояснить дальше, Возьмите Сферу из картины на одну секунду, предполагая, что у меня есть два класса (класса автомобилей и класса велосипед), оба из которых распространяются на класса транспорта, если Я передал транспорт класса как аргумент, как я могу определить, какой тип передается, а затем как только я это сделаю, как мне создать новый объект с этой информацией?

-Sil

+0

Обратите внимание на executeTransaction() выполнит BeginTransaction() и CommitTransaction() для вас. Это точка executeTransaction(). В качестве альтернативы вы можете просто оставить весь файл executeTransaction() и использовать тело прохода execute(). – bmunk

ответ

3

Все классы Realm расширяет RealmObject, так что вы можете использовать дженерики для ее выполнения:

public static <T extends RealmObject> void executeInsertInto(final Context context, final T passedObject){ 
    Realm realm = Realm.getInstance(context); 
    realm.executeTransaction(new Realm.Transaction() { 
     @Override 
     public void execute(Realm realm) { 
      T itemToWrite = realm.copyToRealm(passedObject); 
     } 
    }); 
    realm.close(); 
} 
+0

То, что мне нужно, спасибо! Конечно, мне все равно пришлось передать некоторую переменную идентификатора (я выбрал окончательные ints, которые я устанавливаю, чтобы быть константами, чтобы идентифицировать правильный класс), чтобы их отличить. – Silmarilos

Смежные вопросы