É assim que estou inserindo dados no banco de dados usando a Biblioteca de Persistência de Sala:
Entidade:
@Entity
class User {
@PrimaryKey(autoGenerate = true)
public int id;
//...
}
Objeto de acesso a dados:
@Dao
public interface UserDao{
@Insert(onConflict = IGNORE)
void insertUser(User user);
//...
}
É possível retornar o ID do usuário depois que a inserção for concluída no próprio método acima sem escrever uma consulta de seleção separada?
android
persistent-storage
android-room
SpiralDev
fonte
fonte
int
ou emlong
vez devoid
como resultado da@Insert
operação?aSyncTask
? como você está retornando o valor da sua função de repositório?Respostas:
Com base na documentação aqui (abaixo do snippet de código)
Um método anotado com a
@Insert
anotação pode retornar:fonte
@Insert
função pode retornarvoid
,long
,long[]
ouList<Long>
. Por favor, tente isso.fonte
return Single.fromCallable(() -> dbService.YourDao().insert(mObject));
O valor de retorno da inserção para um registro será 1 se sua instrução for bem-sucedida.
Caso deseje inserir uma lista de objetos, você pode:
E execute-o com Rx2:
fonte
Obtenha o ID da linha pelo seguinte sniplet. Ele usa callable em um ExecutorService with Future.
Ref: Tutorial do Java Executor Service para obter mais informações sobre Callable.
fonte
No seu Dao, a consulta de inserção retorna,
Long
ou seja, o rowId inserido.Na sua classe Model (Repository): (MVVM)
Na sua classe ModelView: (MVVM) Manipule LiveData com DisposableSingleObserver.
Referência do sourcing de trabalho: https://github.com/SupriyaNaveen/CookingRecipes
fonte
Depois de muita luta, consegui resolver isso. Aqui está minha solução usando a arquitetura MMVM:
Student.kt
StudentDao.kt
StudentRepository.kt
StudentViewModel.kt
No fragmento:
Eu usei DataBinding. Aqui está o meu XML:
Eu lutei muito para fazer isso com o asynctask, pois a operação de inserção e exclusão de sala deve ser feita em um thread separado. Finalmente capaz de fazer isso com o tipo Single observável no RxJava.
Aqui estão as dependências Gradle para rxjava:
fonte
De acordo com a documentação, as funções anotadas com o @Insert podem retornar o rowId.
O problema que tenho com isso é que ele retorna o rowId e não o id, e ainda não descobri como obter o id usando o rowId.
Infelizmente ainda não posso comentar, porque não tenho 50 reputação, por isso estou publicando isso como resposta.
fonte