【问题标题】:asynctask sqlite doesnt updateasynctask sqlite 不更新
【发布时间】:2015-03-26 14:58:27
【问题描述】:

我正在为我的项目制作一个注册屏幕。注册数据发送到网络数据库后,我希望应用程序也更新本地 sqlite 数据库,以便用户下次打开应用程序时,如果注册成功,他/她不需要执行相同的操作。我的应用程序正在毫无问题地更新 Web 数据库,但是当我尝试使用第二个异步任务进行 sqlite 更新时,它不会更新 sqlite,我错过了什么? :(

这是我的代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.register);

    final EditText vmail=(EditText) findViewById(R.id.editText1);
    final EditText vpassword=(EditText) findViewById(R.id.editText2);
    final EditText vnickname=(EditText) findViewById(R.id.editText3);




    Button button2=(Button) findViewById(R.id.button1);
    button2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            mail=vmail.getText().toString();
            password=vpassword.getText().toString();
            mynickname=vnickname.getText().toString();
            new AsyncTaskClass().execute();
        }
    });
}
class AsyncTaskClass extends AsyncTask<Void, Void, String> {

    @Override
    protected void onPreExecute() {


    }
    @Override
    protected String doInBackground(Void... params) {
        String reverseString =null;

        try
        {
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("mail",mail));
            nameValuePairs.add(new BasicNameValuePair("password",password));
            nameValuePairs.add(new BasicNameValuePair("mynickname",mynickname));
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("wwwmysite.php");
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String response = httpclient.execute(httppost, responseHandler); 
            reverseString = response;
        } catch (ClientProtocolException e) {
            Log.e("log_tag", "Error converting result " + e.toString());
        } catch (IOException e) {
            Log.e("log_tag", "Error converting result " + e.toString());
        }

        return reverseString;
    }


    protected void onPostExecute(String reverseString) {
         if (reverseString.contains("success")){
             new AsyncTaskClass2().execute();                
        }else{
            Toast.makeText(getApplicationContext(), reverseString, Toast.LENGTH_LONG).show();
        }
    }
}
class AsyncTaskClass2 extends AsyncTask<Void, Void, String> {

    @Override
    protected void onPreExecute() {


    }
    @Override
    protected String doInBackground(Void... params) {
        String reverseString =null;
        try
        {
            KayitEkle(Array.get(nameValuePairs, 0).toString(),Array.get(nameValuePairs, 1).toString(),Array.get(nameValuePairs, 2).toString());
        } catch (Exception e) {
            Log.e("log_tag", "Error converting result " + e.toString());
        }
        return reverseString;
    }


    protected void onPostExecute(String reverseString) {
        startActivity(new Intent(registergame.this, (mygamescreen.class)));
    }
}
 private void KayitEkle(String nick, String mail, String password){       
     SQLiteDatabase db = users.getWritableDatabase();
     ContentValues veriler = new ContentValues();
     veriler.put("nick", nick);
     veriler.put("mail",mail);
     veriler.put("password",password);
     db.insertOrThrow("ogrenciisim", null, veriler);
 }

}

【问题讨论】:

  • 第一个 AsyncTask 的结果是什么?是“成功”吗?你的第二个 AsyncTask 被调用了吗?
  • 它上升到这个命令 startActivity(new Intent(registergame.this, (mygamescreen.class)));
  • 这里出错; KayitEkle(Array.get(nameValuePairs, 0).toString(),Array.get(nameValuePairs, 1).toString(),Array.get(nameValuePairs, 2).toString());说 logcat 中的数组为空,我该如何解决这个问题?

标签: android sqlite android-asynctask


【解决方案1】:

放置一个调试器,看看它是否真的在调用 AsyncTaskClass2 doInBackground() 方法。如果是,则检查方法 insertOrThrow() 返回的值。如果返回值为-1,那么您需要检查它。这个link 会给你一些见解

【讨论】:

  • 我发现这里出错了; protected String doInBackground(Void...params) { String reverseString =null;尝试 { KayitEkle(Array.get(nameValuePairs, 0).toString(),Array.get(nameValuePairs, 1).toString(),Array.get(nameValuePairs, 2).toString()); } catch (Exception e) { Log.e("log_tag", "错误转换结果" + e.toString()); } 返回反向字符串;它说 Error conversion result java.lang.NullPointerException: array == null at logcat
  • 如果你看到一个异常,检查它为什么抛出它。此外,如果您根据数据库中的主键字段插入值,它将不会再次插入。尝试从 DB 中读取以查看之前是否已插入值。我希望它有所帮助。如果我的回答帮助您解决问题,请点赞或标记为正确。谢谢
  • 我改成了 KayitEkle(nameValuePairs.get(0).getValue(),nameValuePairs.get(1).getValue(),nameValuePairs.get(2).getValue());但它给出了 nullpointerexception :( 我不明白数组有什么问题
【解决方案2】:

您仅在第一个 AsyncTask 的 doInBackground-Method 中声明了 nameValuePairs-variable:

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

如果你使用你的类属性 nameValuePairs,你可以简单地解决它:

nameValuePairs = new ArrayList<NameValuePair>();

但作为一般方面,我看不出为什么您应该使用第二个 AsyncTask。为什么不调用方法

KayitEkle(Array.get(nameValuePairs, 0).toString(),Array.get(nameValuePairs, 1).toString(),Array.get(nameValuePairs, 2).toString());

在您的第一个 AsyncTask 的 doInBackground-Method 中?

【讨论】:

    猜你喜欢
    • 2017-06-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多