How to set primary key auto increment in realm android
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
// ...
// ...
}
}
Well, @PrimaryKey is only indicates that field is a key. But you set it yourself when creating object and copying it to Realm. Consider using UUID.random(), ot increment it manually. (as in answer from comment): Realm Auto Increament field example
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
}
}
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;