Как настроить автоматический прирост первичного ключа в андроиде realm

Я хочу настроить первичный ключ для автоматического увеличения для моей таблицы.

Вот мой класс. Я установил первичный ключ, но я хочу, чтобы он был автоматическим приращением первичного ключа.

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;
}

}

Спасибо в Advance.

Ответ 1

В транзакции вы всегда можете надежно получить доступ к текущему максимальному идентификатору, на основе которого вы можете увеличить его и использовать в качестве основы для следующего идентификатора.

 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
     }
 }

Ответ 2

Это старый и уже ответивший вопрос, но я хочу опубликовать другое решение, которое я использовал. Вы можете сделать следующее:

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
         // ...
         // ... 
    }
}

Ответ 3

Ну, @PrimaryKey указывает только, что поле является ключом. Но вы сами устанавливаете его при создании объекта и копировании его в Царство. Подумайте, используя UUID.random(), ot увеличивайте его вручную. (как в ответе от комментария): Пример поля для увеличения поля Realm

Ответ 4

В моем личном случае я устанавливаю id как значение времени Unix. Я знаю, что это не инкремент, а уникальный 🙃

(int) System.currentTimeMillis() / 1000;