How to set primary key auto increment in realm android

后端 未结 8 573
眼角桃花
眼角桃花 2020-12-14 07:13

I want to set primary key auto increment for my table.

Here is my Class. I have set primary key but I want it to be auto increment primary key.

publ         


        
相关标签:
8条回答
  • 2020-12-14 07:43

    This is an old and already answered question, but I want to post another solution that I used. You can do like this:

    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 讨论(0)
  • 2020-12-14 07:47

    In Kotlin

    My Interfaces

    fun getRegistroIdentity(): Int
    

    My Method

    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 讨论(0)
  • 2020-12-14 07:48

    A shorter answer can be something like this:

        Person person = new Person();
        person.setName("UserName");
    
        realm.beginTransaction();
    
        Number newId = realm.where(Person.class).max("id");
        person.setId(newId.intValue()+1);
    
        realm.copyToRealm(person);
        realm.commitTransaction();
    
    0 讨论(0)
  • 2020-12-14 07:49

    In a transaction, you can always reliably access the current maximum ID, based on which you can increment that and use it as the basis for the next 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)
  • 2020-12-14 07:50

    there is an example that make a sequence to implement auto increment of primary key 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;
    
    0 讨论(0)
  • 2020-12-14 07:55

    In my personal case, I set id as Unix time value. I know isn't increment but is unique

    0 讨论(0)
提交回复
热议问题