2016-10-12 6 views
0

私のアプリでは、私たちの要素の1つに新しいプライマリキーを追加しました(これはかなり前です)。当然ながら、移行が必要でした。問題は、テストするのはかなり難しいです。だれも実際に何も言えず、最初にそれらのオブジェクトをどのように作成するのか(何らかの理由でintellijも答えを出しません)レルムの移行 - 新しいプライマリキーをintとして初期化

とにかく私の移行-code:

public class CustomMigration implements RealmMigration{ 

    private int currentKey = 0; 

    public void migrate(DynamicRealm realm, long oldVersion, long newVersion){ 
     RealmSchema schema = realm.getSchema(); 
     if(oldVersion <= 4){} 
      if(schema.contains("AvailableCandidate"){ 
       if(!schema.get("AvailableCandidate").hasField("pos")){ 
        .addField("pos", int.class, FieldAttribute.PRIMARY_KEY) 
         .transform(new RealmObjectSchema.Function() { 
          @Override 
          public void apply(DynamicRealmObject obj) { 
           obj.setInt("pos", currentKey++); 
          } 
         }); 
       } 
      } 
      // 
      // here be more code 
      // 
      oldVersion = 5; 
     } 
    } 
} 

変数currentKeyに特に注意してください。私はその変換がイテレータのように動作し、currentKeyは変換が繰り返されるたびにインクリメントされるべきだと考えました。

問題は、まだそのバグを取得しているように見えますが、currentKeyは増分されていないようです。

この厄介な問題の解決方法は何ですか?

編集:布を吐き出すという例外は以下の通りです:

"pos" cannot be a primary key, it already contains duplicate values: 0 
+0

私はこれが起こる理由は全くわからないんだけど、[この例では、動作するようになっている](https://github.com/realm/realm-java/issues/3068#issue-162264733) – EpicPandaForce

+0

私はPKタイプを変更していませんが、全く新しいタイプを追加しました。バグを経験しているユーザーがすでに部分的に移行を行っている可能性があり、したがってPKが0のエントリが1つありますか? – TormundThunderfist

+0

ここで回避策を確認してくださいhttps://github.com/realm/realm-java/issues/2167#issuecomment-175442772これは文書化する必要があるものです... – beeender

答えて

1

フィールド内の値が制約に違反していない一度あなたが唯一の主キー制約を追加する必要があります。

public class CustomMigration implements RealmMigration{ 

    private int currentKey = 0; 

    public void migrate(DynamicRealm realm, long oldVersion, long newVersion){ 
     RealmSchema schema = realm.getSchema(); 
     if(oldVersion <= 4){} 
      if(schema.contains("AvailableCandidate"){ 
       if(!schema.get("AvailableCandidate").hasField("pos")){ 
        .addField("pos", int.class, FieldAttribute.INDEXED) 
        .transform(new RealmObjectSchema.Function() { 
         @Override 
         public void apply(DynamicRealmObject obj) { 
          obj.setInt("pos", currentKey++); 
         } 
        }) 
        .addPrimaryKey("pos"); 
       } 
      } 
      // 
      // here be more code 
      // 
      oldVersion = 5; 
     } 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if(obj == null) { 
      return false; 
     } 
     return CustomMigration.class.equals(obj.getClass()); 
    } 

    @Override 
    public int hashCode() { 
     return CustomMigration.class.hashCode(); 
    } 
} 
関連する問題