web-dev-qa-db-fra.com

Comment définir l'incrémentation automatique de la clé primaire dans le royaume android

Je veux définir l'incrément automatique de clé primaire pour ma table.

Voici ma classe. J'ai défini la clé primaire mais je veux que ce soit une clé primaire à incrémentation automatique.

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

}

Merci d'avance.

23
Maaz Patel

Dans une transaction, vous pouvez toujours accéder de manière fiable à l'ID maximum actuel, sur la base duquel vous pouvez l'incrémenter et l'utiliser comme base pour l'ID suivant.

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

C’est une question ancienne à laquelle on a déjà répondu, mais je souhaite publier une autre solution que j’avais utilisée .

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

Eh bien, @PrimaryKey indique uniquement que ce champ est une clé. Mais vous le définissez vous-même lorsque vous créez un objet et que vous le copiez dans Realm. Pensez à utiliser UUID.random (), ne l'incrémentez pas manuellement. (comme dans la réponse du commentaire): Exemple de champ Incrément auto.

2
Alex Shutov

il existe un exemple qui crée une séquence pour implémenter l'incrémentation automatique de la clé primaire id:

https://raw.githubusercontent.com/505aaron/realm-migration-example/master/realm/sequencer.js

const sequencer = (realmInstance, schema, props) => new Promise((resolve, reject) => {
  let saved;

  try {
    realmInstance.write(() => {
      const obj = { ...props };

      if (typeof obj.id === 'undefined') {
        let seq = realmInstance.objects('Sequence').filtered(`name = "${schema}"`)[0];
        if (typeof seq === 'undefined') {
          seq = realmInstance.create('Sequence', { name: schema, value: 0 });
        }
        obj.id = seq.next();
      }
      saved = realmInstance.create(schema, obj, true);

      resolve({ ...saved });
    });
  } catch (e) {
    reject(e);
  }
});

export default sequencer;
1
user909768

Pour réagir natif

...
// this is the part where you are saving the newItem
realm.write(() => {
    // handle the id
    let id: any = realm.objects(this.Schema).max("id");
    newItem.id = id === undefined ? 1 : id++;
    realm.create(this.Schema, newItem);
    resolve(newItem);
});
0
lukaserat

À Kotlin

Mes interfaces

fun getRegistroIdentity(): Int

Ma méthode

class RegistroOver(private val realm: Realm) : RegistroImplementation {

override fun getRegistroIdentity(): Int {
    val registro = realm.where(Registro::class.Java).max("id")
    val result: Int
    result = if (registro == null) {
        1
    } else {
        registro.toInt() + 1
    }
    return result
}}

:)

0
Irvin Joao