2016-03-24 4 views
0

シンプルレルムオブジェクトを初期化しようとしたとき、私はいくつかの奇妙な行動を経験してるに失敗しました。@PrimaryKey 0(ゼロ)とレルムオブジェクトを初期化し第二の目的

[{"id":0,"name":"Biatrix"},{"id":1,"name":"Bill"},{"id":2,"name":"O-ren"}] 

私は次のような単純なレルムクラスを持っている:ここで

import io.realm.RealmObject; 
import io.realm.annotations.PrimaryKey; 
import io.realm.annotations.Required; 

public class Assassin extends RealmObject { 
    @PrimaryKey 
    private int id; 

    @Required 
    private String name; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

は、私は(Kotlinで)クラスを移入しようとする方法である:

val assassins = viperData.getJSONArray("assassins") 

for (i in 0..(assassins.length() - 1)) { 
    val item = assassins.getJSONObject(i) 

    var assassin = realm.createObject(Assassin::class.java) 
    assassin.setId(item.getInt("id")) 
    assassin.setName(item.getString("name")) 
} 
私はそのように見えるJSONArrayを持っています

id = 0の最初の項目は正常に作成されますが、2番目の項目では例外io.realm.exceptions.RealmPrimaryKeyConstraintException: Value already exists: 0が生成されます。その後、私はああ、オブジェクトが作成されたと思った。デフォルトではid = 0であり、その後は値を別のものに変更します。

... 
public class Assassin extends RealmObject { 
    @PrimaryKey 
    private int id = -1; 
... 

を...それでも同じ例外を取得:それは出回っだから私はクラスで-1 = IDを設定した値0のアイテムを持っているので、それは失敗しています。

これはバグですか?ここに何か不足していますか?

更新

私は@PrimaryKey注釈を削除し、クラスが正しく装着。

enter image description here

答えて

1

レルムのドキュメントから::

- (ここではありません暗殺者...実際の値)だけの値がここに値を含むレルムクラスのショットがある、一意であることを示すためにRealm.createObject()を呼び出すと、すべてのフィールドがデフォルト値に設定された新しいオブジェクトが返されます。この場合、主キーフィールドがデフォルト値である既存のオブジェクトと競合する可能性があります。これを避けるには、スタンドアロンオブジェクトを作成し、フィールドの値を設定してから、copyToRealm()メソッドでRealmにコピーすることをお勧めします。

+0

私はあなたの言うことを理解していますが、これは問題ではありません。ここでの問題は、なぜ私が提供する 'id'の値が明らかに一意である場合、初期化が失敗するのですか? – Ambran

+0

失敗した場合は、明らかに一意ではありません。 – Wukash

+0

または私は私の記事で提案したバグがあるかもしれませんが、値を数回チェックして確実に確認したので、間違いなくユニークです。私の更新を参照してください。 – Ambran

関連する問題