android - example - room persistence library
Sala de Android: obtenga la identificación de la nueva fila insertada con generación automática (5)
El valor de retorno de la inserción para un registro será 1 si su estado de cuenta es exitoso.
En caso de que desee insertar una lista de objetos, puede ir con:
@Insert(onConflict = OnConflictStrategy.REPLACE)
public long[] addAll(List<Object> list);
Y ejecútelo con Rx2:
Observable.fromCallable(new Callable<Object>() {
@Override
public Object call() throws Exception {
return yourDao.addAll(list<Object>);
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<Object>() {
@Override
public void accept(@NonNull Object o) throws Exception {
// the o will be Long[].size => numbers of inserted records.
}
});
Así es como estoy insertando datos en la base de datos usando la Biblioteca de persistencia de sala:
Entidad:
@Entity
class User {
@PrimaryKey(autoGenerate = true)
public int id;
//...
}
Objeto de acceso a datos:
@Dao
public interface UserDao{
@Insert(onConflict = IGNORE)
void insertUser(User user);
//...
}
¿Es posible devolver la identificación del usuario una vez que se completa la inserción en el método anterior sin escribir una consulta de selección por separado?
En su Dao, la inserción de la consulta devuelve Long, es decir, el rowId insertado.
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(recipes: CookingRecipes): Long
En su clase de Modelo (Repositorio): (MVVM)
fun addRecipesData(cookingRecipes: CookingRecipes): Single<Long>? {
return Single.fromCallable<Long> { recipesDao.insertManual(cookingRecipes) }
}
En su clase ModelView: (MVVM) Maneje LiveData con DisposableSingleObserver.
Referencia del proveedor de trabajo:
https://github.com/SupriyaNaveen/CookingRecipes
Obtenga la ID de fila por el siguiente fragmento. Utiliza invocables en un ExecutorService con Future.
private UserDao userDao;
private ExecutorService executorService;
public long insertUploadStatus(User user) {
Callable<Long> insertCallable = () -> userDao.insert(user);
long rowId = 0;
Future<Long> future = executorService.submit(insertCallable);
try {
rowId = future.get();
} catch (InterruptedException e1) {
e1.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return rowId;
}
Ref: Tutorial de Java Executor Service para obtener más información sobre Callable.
Según la documentación here (debajo del fragmento de código)
Un método anotado con la anotación
@Insert
puede devolver:
long
para operación de inserción únicalong[]
oLong[]
oList<Long>
para múltiples operaciones de inserciónvoid
si no le importan las identificaciones insertadas
@Insert
función
@Insert
puede devolver
void
,
long
,
long[]
o
List<Long>
.
Por favor intente esto.
@Insert(onConflict = OnConflictStrategy.REPLACE)
long insert(User user);
// Insert multiple items
@Insert(onConflict = OnConflictStrategy.REPLACE)
long[] insert(User... user);