Android – RoomDb – La entidad insertada con éxito no se encuentra en la consulta de selección en otra actividad

Tengo una entidad (código de Kotlin):

@Entity(foreignKeys = arrayOf(ForeignKey(entity = Agent::class, parentColumns = arrayOf("guid"), childColumns = arrayOf("agentGuid"), onDelete = ForeignKey.CASCADE))) data class Client (@PrimaryKey var guid: String = "", var name: String = "", var email: String = "", var phone: String = "", var address: String = "", var agentGuid: String = "") 

Aquí está la class Dao respectiva:

 @Dao public interface ClientDao { @Query("SELECT * FROM Client where guid = :clientGUID LIMIT 1") Client getClient(String clientGUID); @Query("SELECT * FROM Client where agentGuid = :agentGUID") List<Client> getClients(String agentGUID); @Insert void insertClient(Client client); } 

Aquí está la tarea de background en la que estoy realizando la operación de inserción:

 interface UpdateClientTaskResponseHandler { fun clientUpdated(client: Client) fun clientUpdateFailed() } data class ClientData(var client: Client, var documents: ArrayList<Document>) class UpdateClientDataTask(val responseHandler: UpdateClientTaskResponseHandler): AsyncTask<ClientData, Void, Client?>() { override fun doInBackground(vararg params: ClientData?): Client? { params[0]?.let { val clientDao = MyApp.database!!.clientDao() //1: Check if client exists or not val client = clientDao.getClient(it.client.guid) if (client != null) { //TODO: to be handled // Update functionality } else { //2. Insert client clientDao.insertClient(it.client) //3. Insert all documents if (it.documents.size > 0) { val documentDao = MyApp.database!!.documentDao() documentDao.insertDocuments(it.documents) } return it.client } return null } return null } override fun onPostExecute(result: Client?) { result?.let { responseHandler.clientUpdated(it) } ?: responseHandler.clientUpdateFailed() } } 

Estoy usando el código siguiente para insert la entidad:

 public void confirmClient(View view) { // Creating client object Client client = new Client(clientGuid, name, email, phone, address, agentGuid); // Creating client data object ClientData clientData = new ClientData(client, documentsAdapter.documents); UpdateClientDataTask updateClientDataTask = new UpdateClientDataTask(this); updateClientDataTask.execute(clientData); } 

En Success ClientActivity código a continuación para volver a ClientActivity :

 @Override public void clientUpdated(@NotNull Client client) { Intent clientsActivity = new Intent(this,ClientActivity.class); clientsActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP ); clientsActivity.putExtra(IntentKeysKt.getShouldRefreshData(), true); startActivity(clientsActivity); } 

Mi problema es: cuando disparo la consulta de selección en el método onResume() de ClientActivity , no devuelve la entidad insertada. Debajo está el Código:

 private void displayClients() { Intent intent = getIntent(); boolean shouldRefreshData = intent.getBooleanExtra(IntentKeysKt.getShouldRefreshData(),false); Toast.makeText(this, "shouldRefreshData="+shouldRefreshData, Toast.LENGTH_SHORT).show(); if (shouldRefreshData) { //Load data from clients table intent.putExtra(IntentKeysKt.getShouldRefreshData(), false); ClientsRetrievalTask clientsRetrievalTask = new ClientsRetrievalTask(this); clientsRetrievalTask.execute(agentGUID); } } @Override public void clientsRetrieved(@NotNull List<Client> clients) { clientsAdapter.refresh(new ArrayList<>(clients)); recyclerViewClients.setVisibility(View.VISIBLE); frameLayoutPlaceholderFragment.setVisibility(View.INVISIBLE); } 

Sorprendentemente, en la próxima vez que se lanza la aplicación, se muestra el logging insertado. No tengo ni idea, por favor guíame.

Deberías usar;

  1. Database.beginTransaction() antes de la operación de inserción.
  2. Database.setTransactionSuccessful() después de la operación de inserción.
  3. Database.endTransaction() finalmente.

Código de muestra:

 private static void insertData(AppDatabase db, List<ProductEntity> products, List<CommentEntity> comments) { db.beginTransaction(); try { db.productDao().insertAll(products); db.commentDao().insertAll(comments); db.setTransactionSuccessful(); } finally { db.endTransaction(); } } 

Referencia de muestra

  • Cómo implementar promedio ponderado exponencialmente decreciente
  • Errores de estudio de Android Kotlin de data binding
  • ¿Es posible acceder a las tipografías de Kotlin desde Java?
  • La sala no puede elegir un constructor ya que varios constructores son un error adecuado
  • Soporte de transición de fragment 25.1.0 con Recyclerview
  • Cómo desestructurar objects Kotlin en streams
  • ¿Cómo puedo hacer que IntelliJ refactor-> cambie el nombre del parámetro y cambie el nombre de la versión local del mismo? (Kotlin)
  • Error al hacer que Enum sea la key principal en la biblioteca de la database de la sala
  • Inicializar el campo de class abstracta en el constructor del niño
  • Evento táctil de interceptación y networkingirigirlo en function del estado del evento de movimiento
  • Cómo devolver el valor de la function en kotlin