Come impostare la chiave primaria di incremento automatico nell’area di android

Voglio impostare la chiave primaria di incremento automatico per il mio tavolo.

Qui è la mia Classe. Ho impostato la chiave primaria, ma voglio che sia di incremento automatico di chiave primaria.

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

}

Grazie in Anticipo.

  • Possibile duplicato di Area Auto Increament esempio di campo
  • Sto cercando in struttura, costruita nel regno che incrementerà automaticamente come gli altri database.
  • Non lo troverete perché non esiste. Soprattutto perché non può essere fatto in 6 righe senza molto sforzo, quindi, non è mai stata una priorità alta.
  • Regno è oggetto di database che memorizza un grafico di oggetti. Tabelle utilizza chiavi primarie quando l’indicizzazione delle tabelle, non c’è nessuna tale cosa, Regno utilizza @PrimaryKey per l’indicizzazione convenienza
  • bene, le chiavi primarie sono importanti per identificare gli oggetti in modo da aggiornare in seguito, e piuttosto importante per l’appena uscito Reame Oggetto Server di sincronizzazione di logica. Ma che cosa hai impostato come chiave primaria è praticamente fino a voi.
InformationsquelleAutor Maaz Patel | 2016-10-21

 

7 Replies
  1. 39

    In una transazione, è sempre possibile modo affidabile l’accesso alla massima corrente ID, in base alla quale è possibile incrementare e usarlo come base per la prossima 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
         }
     }
    • Semplice e buona risposta. Grazie.
    • BTW questo è un po ‘ più complicato per Sincronizzati Regno dove di solito è consigliabile utilizzare un casuale UUID. O un RealmCounter quando sarà supportato.
    • come si fa a fare questo durante la scrittura di JSON direttamente nel regno e si desidera genera automaticamente i valori di chiave primaria? sarebbe bello se si può solo ad una seconda annotazione, come RealmAutoGenerate
    • Probabilmente non si può fare automaticamente se si utilizza il createAllFromJson e tali metodi.
  2. 10

    Questo è un vecchio e già risposto domanda, ma voglio postare un’altra soluzione che ho usato.
    Si può fare come questo:

    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. 1

    c’è un esempio che effettua una sequenza di implementare un incremento automatico di chiave primaria 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;
  4. 0

    Per reagire nativo

    ...
    //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);
    });
    • che avrebbe dovuto essere ++id invece di id++ no?
  5. 0

    In Kotlin

    Mio Interfacce

    fun getRegistroIdentity(): Int

    Il Mio Metodo

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

    🙂

  6. -3

    Nel mio caso personale, ho impostato l’id Unix valore del tempo. So che non è incremento, ma è unico 🙃

    (int) System.currentTimeMillis() / 1000;
    • In Qualche modo se 2 record vengono inseriti all’interno di un secondo verrà generato un errore.
    • mmm è vero. Proverò a simulare il tuo commento perché nella mia applicazione non inserire 2 oggetti allo stesso tempo.
    • Non si deve cast a int… Quindi è una scelta migliore.
    • Che cosa se l’utente cambia l’orario indietro di un’ora o giù di lì?

Lascia un commento