Android – RoomDb – 实体插入成功找不到另一个活动中的选择查询
我有一个实体(科特林代码):
@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 = "")
这里是相应的Dao类:
@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); }
这里是我正在执行插入操作的后台任务:
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() } }
我正在使用下面的代码来插入实体:
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); }
在成功我在调用下面的代码跳回到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); }
我的问题是 – 当我在ClientActivity
onResume()
方法中选择查询时,它不返回插入的实体。 以下是代码:
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); }
令人惊讶的下一次应用程序启动它显示插入记录。 我很笨,请指导我。
你应该使用;
- 插入操作前的
Database.beginTransaction()
。 - 插入操作后的
Database.setTransactionSuccessful()
。 -
Database.endTransaction()
最后。
示例代码:
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(); } }
样品参考
- kotlin android – Xposed IllegalArgumentException'android.content.res.CoollifeUITpedArray'
- 最佳和节省时间的方式编码在android studio
- 如何将Firebase中的文本文件读取到Android应用程序
- Android库模块在使用纯Kotlin模块的类时不会编译
- 如何使用RemoteViews在Android小部件中旋转图像
- permissionsdispatcher和多个@ NeedsPermission与kotlin
- 在Kotlin中,表达式不能是一个选择符(出现在一个点之后)
- 在Kotlin中绑定具有多个参数的适配器
- 如何在Android Studio中配置AspectJ