tutorial room library example ejemplo android persistent-storage android-room

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 única
  • long[] o Long[] o List<Long> para múltiples operaciones de inserción
  • void 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);