主键 'id' 未通过自动递增设置

PrimaryKey 'id' not set by auto incrementer

我写了一个静态 class 自动将 RealmObject 的 id 递增 1。

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 的 ID 的默认值时:

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

永远行不通!特别是第一次通过 realm.createObject(IExtendRealmObject.class) 创建一个新的 class 时,值是 0,但是 AutoIncrementKey.Next(...) returns id 为 1!

所以 id 永远不会设置为 1。它始终为 0,并且尝试创建更多对象会导致它抛出错误 "index already exists: 0"

什么给了?

正在调用 AutoIncrementKey.Next() 函数。它正在寻找下一个键为 1。返回的值只是没有执行。

编辑: 所以现在我已经设法在我的领域中创建了多个对象,我发现将 id 设置为默认值并不是唯一的问题。

使用默认值设置 class 扩展 RealmObject 的任何成员将被忽略。这有什么关系?

那是因为

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

它应该能很好地满足您的需求