私はエンティティ(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 = "")
それぞれの 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);
}
私の問題は -onResume()
メソッドで選択クエリをClientActivity
起動すると、挿入されたエンティティが返されないことです。以下はコードです:
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);
}
驚くべきことに、次回アプリを起動すると、挿入されたレコードが表示されます。私は無知です私を導いてください。