gpt4 book ai didi

android - 等待数据库完成插入数据,然后再继续下一个 Android Activity

转载 作者:搜寻专家 更新时间:2023-10-30 23:37:28 26 4
gpt4 key购买 nike

我有一个从外部数据库调用 JSON 数据的 Activity 。以下是我的应用的理想案例:

  • 解析 JSON 数据并将其插入到 Android 上的 SQLite 数据库中
  • 开始下一个 Activity ,从 SQLite 数据库中读取新插入的数据

实际发生了什么:

  • 解析 JSON 数据并将其插入到 Android 上的 SQLite 数据库中
  • 下一个 Activity 在数据仍在插入时启动,并在从该 Activity 中我的 ListArray 所需的数据库读取时返回零。

如何强制 Android 等到数据库插入完成后再开始下一个 Activity ?

编辑

我的 doInBackground 如下所示:

@Override
protected String doInBackground(String... params) {

StringRequest strReq = new StringRequest(Request.Method.GET,
str, new Response.Listener<String>() {

@Override
public void onResponse(String response) {

try {
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");

// Check for error node in json
if (!error) {
JSONArray jObjInside = jObj.getJSONArray("service_prov_services");
for (int i = 0; i < jObjInside.length(); i++) {
// Now store the user in SQLite
try {
// JSONObject user = jObj.getJSONObject("user");

String service_prov_type = jObj.getString("service_prov_type");
String service_prov_name = jObj.getString("service_prov_name");
String addr_street = jObj.getString("addr_street");
String addr_num = jObj.getString("addr_number");
String addr_plz = jObj.getString("addr_plz");
String addr_city = jObj.getString("addr_city");
JSONObject elem = jObjInside.getJSONObject(i);

if(elem != null){

String service_id = elem.getString("service_id");
String service_type = elem.getString("service_type");
String service_measure = elem.getString("service_measure");


// Inserting row in userServiceProvServices table
db.addUserServiceProvServices(service_id, service_prov_type,
service_prov_name, addr_street, addr_num, addr_plz, addr_city, service_type, service_measure);
Log.d("post_url for service", addr_plz );
}

} catch (JSONException e) {
// JSON error
e.printStackTrace();
Toast.makeText(getActivity().getApplicationContext(), "Json error: " +
e.getMessage(), Toast.LENGTH_LONG).show();
}
}

} else {
// Error in login. Get the error message
String errorMsg = jObj.getString("error_msg");
Toast.makeText(getActivity().getApplicationContext(),
errorMsg, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
// JSON error
e.printStackTrace();
Toast.makeText(getActivity().getApplicationContext(), "Json error: " +
e.getMessage(), Toast.LENGTH_LONG).show();
}

}
}, new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Login Error: " + error.getMessage());
Toast.makeText(getActivity().getApplicationContext(),
error.getMessage(), Toast.LENGTH_LONG).show();

}
});

Log.d("test string to appcntr",strReq.toString());
// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);




return params[0];

}

onPostExecute 看起来如下:

    @Override
protected void onPostExecute(String Result) {
//super.onPostExecute(Result);
pdLoading.dismiss();
//this method will be running on UI thread

Log.d(TAG, "Stamp: " + Result);
Bundle args = new Bundle();
args.putString("stampID", Result);

ProviderServiceListFragment frag = new ProviderServiceListFragment();
frag.setArguments(args);
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame,
frag)
.commit();



}

按照我现在的做法,我的下一个Fragment已经被调用了,虽然数据还没有完成输入数据库。这意味着由于缺少数据库数据,以下 fragment 中的 ListArray 为空。

最佳答案

我为此工作了一个月,终于自己弄明白了(我真是个笨蛋……)所以这里有一段代码,用于向 sqlite 插入一条记录。

在选定事件(“onClick actionbutton1”)上,使用 doInBackground、onPreExecute 和 onPostExecute 创建一个新的 AsyncTask。

onPreExecute 将 setMessage() 和 show() 将开始旋转的 progressDialog

onPostExecute 将处理新的/下一个 Activity

阅读下面的 doInBackground!!

actionButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

final ProgressDialog progressDialog = new ProgressDialog(AddUpdateEvf.this);

new AsyncTask<Void, Void, Boolean>() {

protected Boolean doInBackground(Void... params) {
doOneThing();
return null;
}

@Override
protected void onPreExecute() {
progressDialog.setMessage("Processing...");
progressDialog.show();

}

protected void onPostExecute(Boolean result) {

evaluationFormOps.close();
progressDialog.dismiss();
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(AddUpdateEvf.this);
alertDialogBuilder.setMessage("Added to Database...")
.setCancelable(false)
.setPositiveButton("Continue", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
i = new Intent(AddUpdateEvf.this, ViewProduct.class);
i.putExtra(EXTRA_ADD_UPDATE, "View");
i.putExtra(EXTRA_PRODUCT_ID, hiddenTextId.getText().toString());
i.putExtra(EXTRA_PRODUCT_NO, productNo_tv.toString());
startActivity(i);
dialog.dismiss();
finish();
}
});

AlertDialog alert = alertDialogBuilder.create();
alert.show();

}
private void doOneThing() {

makeDbRequest();
do {
evfId = newEvf.getEvfId();
}
while (evfId<1);
}

}.execute();




}
});

请注意上面在 doInBackground() 中调用的代码中的这个 fragment :

 private void doOneThing() {

makeDbRequest();
do {
evfId = newEvf.getEvfId();
}
while (evfId<1);
}

注意:makeDbRequest() 通过设置值来处理对 sqlite 的插入,然后将其传递给另一个处理游标并放置值等的类。

这是该类中的一小段相关代码(您应该已经掌握...):

 public Evf addEvf(Evf evf, String dBsuccess){

ContentValues values = new ContentValues();
values.put(TableHelper.PRODUCT_IDE,evf.getPRODUCTId());
values.put(TableHelper.CSCORE,evf.getcScore());
values.put(TableHelper.FSCORE,evf.getfScore());
values.put(TableHelper.TSCORE,evf.gettScore());
values.put(TableHelper.WEIGHT,evf.getWeight());
values.put(TableHelper.TEMP,evf.getTemp());
values.put(TableHelper.STATUS,evf.getStatus());
values.put(TableHelper.TIMESTAMP, String.valueOf(evf.getTimeStamp()));
values.put(TableHelper.LOADED, dBsuccess);
long insertid = database.insert(TableHelper.TABLE_EVFS,null,values);
evf.setEvfId((int) insertid);
return evf;

}

因此,在我的例子中,您可以看到 evaluationform(Evf) 的 ID 被设置为插入 ID。这发生在插入之后,您可以在对象类中设置任何值(带有 getter 和 setter 的对象...Evf())

最后,使用上面的 do...while 语句“监听”对象类中设置的值

这显然只有在插入完成并且 onPosteExecute 负责其余部分时才会发生

希望对您有所帮助,欢迎批评,PEACHES!!

关于android - 等待数据库完成插入数据,然后再继续下一个 Android Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40027672/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com