2016-08-29 9 views
0

Я написал статический класс, который автоматически увеличивает значение идентификатора RealmObject на 1.PrimaryKey «идентификатор» не установлен автоматический инкрементора

public class AutoIncrementKey { 

    public static int Next(Class<? extends RealmObject> c) 
    { 
     Realm realm = Realm.getDefaultInstance(); 
     Number maxId = realm.where(c).max("id"); 
     realm.close(); 
     if(maxId == null) 
     { // no object exists, so return 0 
      return 0; 
     } 
     return maxId.intValue() + 1; 
    } 

} 

Однако, когда я устанавливаю значение по умолчанию Идентификатор RealmObject как так :

@PrimaryKey private int id = AutoIncrementKey.Next(PresetSelect.class); 

Не работает! В частности, при первом запуске для создания нового класса через realm.createObject (IExtendRealmObject.class) значение равно 0, но AutoIncrementKey.Next (...) возвращает id как 1!

Так идентификатор никогда не устанавливается в 1. Всегда 0, и пытается создать больше объектов заставляет его бросить об ошибке «индекс уже существует: 0»

Что дает?

Вызывается функция AutoIncrementKey.Next(). Он находит следующий ключ равным 1. Возвращаемое значение просто не выполняется.

Edit: Так что теперь я сумел создать более одного объекта в моем царстве, я нахожу, что установка идентификатора значение по умолчанию не единственная проблема.

Установка любого члена класса, расширяющего объект RealmObject со значением по умолчанию, НЕИСПРАВНО. С чем это связано?

ответ

2

Это потому, что вместо

realm.createObject(IExtendRealmObject.class) 

Вы должны использовать

realm.createObject(IExtendRealmObject.class, primaryKeyValue) 

Но я думаю, что ваш метод

public class AutoIncrementKey { 

    public static int Next(Class<? extends RealmObject> c) 
    { 
     Realm realm = Realm.getDefaultInstance(); 
     Number maxId = realm.where(c).max("id"); 
     realm.close(); 
     if(maxId == null) 
     { // no object exists, so return 0 
      return 0; 
     } 
     return maxId.intValue() + 1; 
    } 

} 

бы быть более стабильным, как

public class AutoIncrementKey { 
    public static int Next(Realm realm, Class<? extends RealmModel> c) 
    { 
     Number maxId = realm.where(c).max("id"); 
     if(maxId == null) 
     { // no object exists, so return 0 
      return 0; 
     } 
     return maxId.intValue() + 1; // why not long? 
    } 
} 

Если вы отвечаете условию , когда вы звоните AutoIncrementKey.Next(realm, Some.class), выполняется транзакция записи.

Черт, вы даже можете добавить

public class AutoIncrementKey { 
    public static int Next(Realm realm, Class<? extends RealmModel> c) 
    { 
     if(!realm.isInTransaction()) { 
      throw new IllegalStateException("Realm is not in a transaction."); 
     } 
     // continue as mentioned 

Он должен хорошо работать для ваших нужд

+0

Я дам этот выстрел прямо сейчас. Кроме того, нет оснований не использовать длинный идентификатор, но база данных будет содержать только около 1000 объектов, так как модель будет исправлена. 4 предустановки с 8 каналами, каждый по 32 диапазона. –

+0

Итак, я просто не могу установить значения по умолчанию для членов объекта realm? Я делаю: private Float level = DEFAULT_LEVEL; для значения объекта Trim, и уровень всегда возвращает null независимо. –

+0

Значение по умолчанию не поддерживается прямо сейчас. См. Https://github.com/realm/realm-java/issues/777 @MagicMarbles – beeender