2016-05-19 2 views
0

しばらくレルムバージョン0.80で作業していましたが、レルムが自動インクリメント動作をサポートしていないことがわかっていました。
したがって、私はこの回避策でした:レルム内のIDが自動インクリメント動作をサポートするためのカスタムメソッド

public class Item extends RealmObject implements Serializable { 

@PrimaryKey 
private int id; 
private int order; 

public int getId() { 
    return id; 
} 

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

public int getOrder() { 
    return order; 
} 

public void setOrder(int order) { 
    id = Increment.Primary_Cart(order); //this line for increment id 
    this.order = order; 
} 

をし、これがインクリメントする私の静的メソッドであるID:私は0.90にバージョン0.80.0からレルムをアップグレードすることを決めたまで

public static int Primary_Cart(int id){ 
    if(id>0) { 
     id_Cart++; 
    } 
    return id_Cart; 
} 

Everytingが正常に動作します。 1。私はこのエラーを持っていた
は次に:

Caused by: io.realm.exceptions.RealmPrimaryKeyConstraintException: Value already exists: 0

より明確にするために、私はレルムを使用してJSONを解析し、いくつかのモデルは、これは私が上記の回避策を使用する理由である、IDを持っている、と私ドンはありませんGSONなどの別のソリューションを使用したい
私は巨大なプロジェクトを持っていたため、レルムだけを使って解析とストレージを行う必要があり、最適化すると思いました。

+0

この例外は、既に使用されている主キーを使用して新しいRealmObjectを作成しようとしていることを意味します。あなたのコードから何が問題なのかを知るのは難しいです。 'id_Cart'はどこから来たのですか?どのようにRealmObjectsを作成しますか? – Emanuelez

+0

** id_Cart **これは** 0 **から始まるローカル変数です。保存された**すべての注文**でインクリメントされますが、これはバージョン0.80.0でうまくいきます。 – Euphor08

+0

同時に問題が発生する可能性があります。 'setOrder()'が呼び出されるソースコードを共有してもらえますか? – beeender

答えて

1

は今日でレルムは、自動インクリメント機能をサポートしていませんが、carloseduardosxすることにより、この要旨はあなたに役に立つことがあります。それは、レルムデータベース用に特別にAUTOINCREMENTを実装whickクラスですhttps://gist.github.com/carloseduardosx/a7bd88d7337660cd10a2c5dcc580ebd0

/** 
* Search in modelMap for the last saved id from model passed and return the next one 
* 
* @param clazz Model to search the last id 
* @return The next id which can be saved in database for that model, 
* {@code null} will be returned when this method is called by reflection 
*/ 
public Integer getNextIdFromModel(Class<? extends RealmObject> clazz) { 

    if (isValidMethodCall()) { 
     AtomicInteger modelId = modelMap.get(clazz); 
     if (modelId == null) { 
      return 0; 
     } 
     return modelId.incrementAndGet(); 
    } 
    return null; 
} 

/** 
* Utility method to validate if the method is called from reflection, 
* in this case is considered a not valid call otherwise is a valid call 
* 
* @return The boolean which define if the method call is valid or not 
*/ 
private boolean isValidMethodCall() { 
    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); 
    for (StackTraceElement stackTraceElement : stackTraceElements) { 

     if (stackTraceElement.getMethodName().equals("newInstance")) { 
      return false; 
     } 
    } 
    return true; 
} 
関連する問題