主键 '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
它应该能很好地满足您的需求
我写了一个静态 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
它应该能很好地满足您的需求