【问题标题】:sqlite database inserts the same value everytime errorsqlite数据库每次错误插入相同的值
【发布时间】:2015-06-13 23:05:42
【问题描述】:

正在显示来自远程服务器的随机复选框,如果用户选中一个复选框,则将该值存储在 sqlite 数据库中,并在下一次加载时检查该值是否存在于数据库中,如果存在,则默认情况下它将检查复选框。我的问题是每次我尝试向 sqlite 插入一个值时,它总是采用第一个选中的复选框值。但是,如果我使用 toast 来检查我的代码,则会得到相应的复选框值。但这不适用于 sqlite

这是在 clicklistener 上显示复选框和设置的方式

  rl = (LinearLayout) getView().findViewById(R.id.linearmain);
            HashMap<String, String> resultp = new HashMap<String, String>();
            sqlcon = new SQLController(context);
            sqlcon.open();
            CheckBox[] cb = new CheckBox[arraylist.size()];

            Cursor c = sqlcon.readEntry();
            int rows = c.getCount();
            int cols = c.getColumnCount();


            for(int i = 0; i < arraylist.size(); i++) {
                resultp = arraylist.get(i);

                cb[i] = new CheckBox(getActivity());
                cb[i].setText(resultp.get(Fltrsubfragment.SUB));
                cb[i].setId(i);
                cb[i].setOnClickListener(handleOnClick(cb[i]));
                rl.addView(cb[i]);
                for ( int ikv = 0; ikv < rows; ikv++) {

                    // inner for loop
                    for (int j = 0; j < cols; j++) {
                        String iv;
                        iv=c.getString(j);

                        if(iv==null){
                            Toast.makeText(context, " Empty " + rows, Toast.LENGTH_LONG).show();
                        }
                       else if(iv.equals(cb[i].getText().toString())){
                            cb[i].setChecked(true);

                            Toast.makeText(context, " Checked " + rows, Toast.LENGTH_LONG).show();
                        }

                        else{
                            cb[i].setChecked(false);

                        }

                    }
                }


   View.OnClickListener handleOnClick(final CheckBox button) {
        return new View.OnClickListener() {
            public void onClick(View v) {
                if(button.isChecked()){
                    if(barraylist.contains(button.getText().toString())){
                        Toast.makeText(context, " Already added " + button.getText().toString(), Toast.LENGTH_LONG).show();
                    }
                    else {

                        brandarraylist.add(button.getText().toString());
                        name=button.getText().toString();

                        new MyAsync().execute();

                        Toast.makeText(context, " Stored " + button.getText().toString(), Toast.LENGTH_LONG).show();

                    }

                }
                else{
                    if(barraylist.contains(button.getText().toString()))
                    {

                        barraylist.remove(button.getText().toString());
                        name=button.getText().toString();

                        new MyAsyncS().execute();
                        sqlcon.deleteTData(button.getText().toString());
                        Toast.makeText(context, "Removed this " + button.getText().toString(), Toast.LENGTH_LONG).show();

                    }
                    else {
                        Toast.makeText(context, "Unchecked this " + button.getText().toString(), Toast.LENGTH_LONG).show();
                    }
                }
            }
        };

AsyncTask 代码插入值

private class MyAsync extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();

        PD = new ProgressDialog(context);
        PD.setMessage("Loading...");
        PD.setCancelable(false);
        PD.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        if(name==null){
            return null;
        }
        // inserting data
        else{
            sqlcon = new SQLController(context);
            sqlcon.open();

            sqlcon.insertData(name);
            sqlcon.close();
            // BuildTable();
            return null;
        }
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        PD.dismiss();
    }
}

这里是插入数据代码

 public void insertData(String name) {
    // TODO Auto-generated method stub

    ContentValues cv = new ContentValues();
    cv.put(MyDbHelper.LT_VAL, name);
    database.insert(MyDbHelper.LTE, null, cv);

}

请提出错误的地方。

【问题讨论】:

  • 尝试将name 发送到MyAsync 的构造函数并再次在MyAsync 中初始化它。然后在MyAsync中使用那个新的
  • 还是同样的问题

标签: android sqlite checkbox


【解决方案1】:

new MyAsync().execute();里面放name

我建议在所有用户输入中使用.trim()。您可以轻松地将其链接到:

name=button.getText().toString().trim();


new MyAsync().execute(name);

然后使用:

  @Override
    protected String doInBackground(String... params) {
        String name = params[0];

我们通过将代码更改为:

@Override
protected String doInBackground(String ... params) {
    String name = params[0];
    if(name==null){
        return null;
    }else{
        return name;
    }
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);      
        sqlcon = new SQLController(context);
        sqlcon.open();

        sqlcon.insertData(result);
        sqlcon.close();
        // BuildTable();

    PD.dismiss();
}

【讨论】:

  • 那么 System.out.println(params[0]) 上显示了什么值?
  • 如果您在将 name 变量发送到 async 之前将它的值与 async 内部的值不同?
  • 奇怪的部分是它显示了相应的复选框值,但只添加了第一个选中的复选框值.. insertData 函数中是否有任何错误?
  • Yes onPostExecute(String result),将包含来自 doInBackground 的返回值。我只是想让你测试一下,以排除 doInBackground 中的上下文导致问题。
  • sql连接打开关闭或插入数据时是否有错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 2012-10-30
  • 1970-01-01
  • 2017-06-03
  • 2013-07-28
  • 1970-01-01
相关资源
最近更新 更多