Voici comment j'insère des données dans une base de données en utilisant Room Persistence Library:
Entité:
@Entity
class User {
@PrimaryKey(autoGenerate = true)
public int id;
//...
}
Objet d'accès aux données:
@Dao
public interface UserDao{
@Insert(onConflict = IGNORE)
void insertUser(User user);
//...
}
Est-il possible de renvoyer l'ID d'utilisateur une fois que l'insertion est terminée dans la méthode ci-dessus sans écrire une requête de sélection séparée?
Basé sur la documentation ici (sous l'extrait de code)
Une méthode annotée avec l'annotation @Insert
peut renvoyer:
long
pour une opération d'insertion simplelong[]
ouLong[]
ouList<Long>
pour plusieurs opérations d'insertionvoid
si vous ne vous souciez pas des identifiants insérés
La fonction @Insert
peut renvoyer void
, long
, long[]
ou List<Long>
. S'il vous plaît essayez ceci.
@Insert(onConflict = OnConflictStrategy.REPLACE)
long insert(User user);
// Insert multiple items
@Insert(onConflict = OnConflictStrategy.REPLACE)
long[] insert(User... user);
La valeur de retour de l'insertion pour un enregistrement sera 1 si votre instruction réussit.
Si vous souhaitez insérer une liste d'objets, vous pouvez utiliser:
@Insert(onConflict = OnConflictStrategy.REPLACE)
public long[] addAll(List<Object> list);
Et exécutez-le avec 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.
}
});
Obtenez l'ID de la ligne par le sniplet suivant. Il utilise callable sur un ExecutorService avec 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;
}
Réf .: Didacticiel du service d'exécution Java pour plus d'informations sur Callable.
En vous Dao, la requête insérée retourne Long, c'est-à-dire le rowId inséré.
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(recipes: CookingRecipes): Long
Dans votre classe Model (Repository): (MVVM)
fun addRecipesData(cookingRecipes: CookingRecipes): Single<Long>? {
return Single.fromCallable<Long> { recipesDao.insertManual(cookingRecipes) }
}
Dans votre classe ModelView: (MVVM) Gérez LiveData avec DisposableSingleObserver.
Référence de travail du fournisseur: https://github.com/SupriyaNaveen/CookingRecipes