android - update - incremento automatico en mysql
Cómo establecer el incremento automático de la clave primaria en el reino de Android (7)
Bueno, @PrimaryKey solo indica que el campo es una clave. Pero lo configura usted mismo cuando crea un objeto y lo copia en Realm. Considere usar UUID.random (), o incrementarlo manualmente. (como en la respuesta del comentario): Ejemplo de campo de realreación automática de reino
Quiero establecer el incremento automático de la clave principal para mi tabla.
Aquí está mi clase. He establecido la clave principal, pero quiero que sea una clave principal de incremento automático.
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;
}
}
Gracias por adelantado.
En Kotlin
Mis interfaces
fun getRegistroIdentity(): Int
Mi 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
}}
:)
En mi caso personal, configuro id como valor de tiempo Unix. Sé que no es un incremento pero es único 🙃
(int) System.currentTimeMillis() / 1000;
En una transacción, siempre puede acceder de manera confiable a la ID máxima actual, en función de la cual puede incrementarla y utilizarla como base para la siguiente 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
}
}
Esta es una pregunta antigua y ya contestada, pero quiero publicar otra solución que utilicé. Puedes hacer así:
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
// ...
// ...
}
}
Hay un ejemplo que hace una secuencia para implementar el incremento automático de la id
clave primaria:
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;
Para reaccionar 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);
});