2016-10-21 10 views
14

テーブルのプライマリキーの自動インクリメントを設定したいと思います。realmの主キー自動インクリメントを設定する方法android

ここは私のクラスです。私はプライマリキーを設定しましたが、プライマリキーを自動インクリメントにします。事前に

public class users extends RealmObject { 

@PrimaryKey 
private int id; 
private long icn; 
private String name; 
private String email; 
private String password; 
private int phone; 

public String getName() { 
    return name; 
} 

public int getId() { 
    return id; 
} 

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

public long getIcn() { 
    return icn; 
} 

public void setIcn(long icn) { 
    this.icn = icn; 
} 

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

public String getEmail() { 
    return email; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

public int getPhone() { 
    return phone; 
} 

public void setPhone(int phone) { 
    this.phone = phone; 
} 

}

感謝。

+1

可能性のある重複した[レルムオートIncreamentフィールドの例](http://stackoverflow.com/questions/31229226/realm-auto-increament-field-example) –

+0

Iユニークです他のデータベースのように自動的に増加する領域内のビルドされたプロパティで探しています。 –

+0

それが存在しないため、あなたはそれを見つけられません。ほとんどの場合、6行で多大な労力を費やすことなく行えるので、決して優先順位は高くありませんでした。 – EpicPandaForce

答えて

24

トランザクションでは、現在の最大IDにいつでも確実にアクセスできます。これを基準にして、そのIDを増分して次のIDの基礎として使用できます。

realm.executeTransaction(new Realm.Transaction() { // must be in transaction for this to work 
    @Override 
    public void execute(Realm realm) { 
     // increment index 
     Number currentIdNum = realm.where(users.class).max(usersFields.ID); 
     int nextId; 
     if(currentIdNum == null) { 
      nextId = 1; 
     } else { 
      nextId = currentIdNum.intValue() + 1; 
     } 
     users user = new users(); // unmanaged 
     user.setId(nextId); 
     //... 
     realm.insertOrUpdate(user); // using insert API 
    } 
} 
+0

シンプルで良い答えです。ありがとう。 –

+0

これは、Synchronized Realmの場合、通常はランダムなUUIDを使用する方が一般的に適していますが、やや難解です。またはサポートされるRealmCounter。 – EpicPandaForce

2

まあ、@PrimaryKeyはフィールドがキーであることを示すだけです。しかし、オブジェクトを作成してそれをRealmにコピーするときは、自分で設定します。 UUID.random()を使用することを検討してください。手動でインクリメントしてください。 (コメントの回答のように):Realm Auto Increament field example

+1

申し訳ありませんが、間違ったタブのアドレスがコピーされました:http://stackoverflow.com/questions/31229226/realm-auto-increament-field-example –

5

これは古い質問ですが、私が使用した別のソリューションを投稿したいと思います。 あなたはこのように行うことができます。

Realm realm = Realm.getDefaultInstance(); 
// Realm transaction 
realm.executeTransactionAsync(new Realm.Transaction() { 
    @Override 
    public void execute(Realm bgRealm) { 
     // Get the current max id in the users table 
     Number maxId = bgRealm.where(users.class).max("id"); 
     // If there are no rows, currentId is null, so the next id must be 1 
     // If currentId is not null, increment it by 1 
     int nextId = (maxId == null) ? 1 : maxId.intValue() + 1; 
     // User object created with the new Primary key 
     users user = bgRealm.createObject(users.class, nextId); 
     // Now you can update your object with your data. The object will be 
     // automatically saved in the database when the execute method ends 
     // ... 
     // ... 
    } 
} 
0

を私の個人的なケースでは、私はUnixの時間値としてIDを設定します。私はインクリメントされていない知っているが、

(int) System.currentTimeMillis()/1000; 
+1

何とか2レコードが1秒以内に挿入された場合、エラーが発生します。 –

+0

@MaazPatel mmmそれは本当です。私のアプリケーションでは2つの項目を同時に挿入しないので、あなたのコメントをシミュレートしようとします。 –

+0

それをintにキャストすべきではありません。それはより良い選択です。 – 476rick

関連する問題