【问题标题】:SQLite Update Method for AndroidAndroid 的 SQLite 更新方法
【发布时间】:2012-05-28 11:28:52
【问题描述】:

我的问题是如何调用这样的方法。我已经知道如何实现它。以下是方法内容:

 public boolean updateDebt(long updateId, String debtName, String debtTotal,
        String debtApr, String paymentGoal) {

     ContentValues values = new ContentValues();
     values.put(MySQLiteHelper.COLUMN_DEBT_NAME, debtName);
     values.put(MySQLiteHelper.COLUMN_DEBT_TOTAL, debtTotal);
     values.put(MySQLiteHelper.COLUMN_APR, debtApr);
     values.put(MySQLiteHelper.COLUMN_PAYMENT, paymentGoal);
     String whereClause = MySQLiteHelper.COLUMN_ID + " = ?";
     String[] whereArgs = new String[]{ String.valueOf(updateId) };
     return database.update(MySQLiteHelper.TABLE_DEBT, values, whereClause, whereArgs) > 0;

我的问题在于调用这个 updateDebt 方法。

想象一个带有四个字段和一个更新按钮的对话框。这些字段预先填充了表格数据。用户更改字段数据并点击更新,表格应更改。

这是调用之前的代码。请记住,我是通过 onListItemClick 内的对话框中的 onClick 调用它的。

(我已经编辑了很多不相关的东西)

List<Debt> values;
MyArrayAdapter adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.debts);

    datasource = new DebtDataSource(this);
    datasource.open();
    values = datasource.getAllDebt();
    adapter = new MyArrayAdapter(this, values);
    setListAdapter(adapter);

  }

 protected void onListItemClick(ListView l, View v, final int position, long id) {

    Debt item = values.get(position);

    final long boxId = item.getId();
    final String BoxName = item.getName();
    final String BoxBalance = item.getBalance();
    final String BoxApr = item.getApr();
    final String BoxPayment = item.getPayment();

 // (edited out: setting up EditText fields here with data from above)

    // set up button
    Button button = (Button) dialog.findViewById(R.id.button1);
    button.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {


            datasource.updateDebt(Long.valueOf(boxId), BoxName, BoxBalance,
                    BoxApr, BoxPayment);
            values = datasource.getAllDebt();
            adapter.notifyDataSetChanged();
            dialog.dismiss();

        }
    });

    dialog.show();
}

简单地说,当我点击更新时没有任何反应。对话框消失了,就是这样。 logcat中什么都没有。我已经在 updateDebt() 方法中的更新方法之前注销了变量。我已经把它们烤回来了,所有的变量都完美匹配。数据库没有改变! 这几天苦苦挣扎....

【问题讨论】:

  • 你还没有展示你的数据库结构......你可能违反了约束吗?
  • 没有任何迹象或我可以看到的任何冲突。所有列也设置为 Not Null。
  • 所以 onClick() 被调用,因为那是对话框被关闭的地方。你通过代码调试了吗?
  • 尝试将更新方法更改为使用updateWithOnConflict 并添加参数CONFLICT_FAIL... 如果存在某种约束违规而不是静默失败,则会引发错误跨度>
  • 我已经从方法的开始到结束注销了每个变量(还没有真正记录返回的布尔值)。变量都是应有的。您看到的 onClick 是否有问题?

标签: android sqlite methods


【解决方案1】:

试试这个:

public boolean updateDebt(long updateId, String debtName, String debtTotal, 
    String debtApr, String paymentGoal) {
    ContentValues values = new ContentValues();
    values.put(MySQLiteHelper.COLUMN_DEBT_NAME, debtName);
    values.put(MySQLiteHelper.COLUMN_DEBT_TOTAL, debtTotal);
    values.put(MySQLiteHelper.COLUMN_APR, debtApr);
    values.put(MySQLiteHelper.COLUMN_PAYMENT, paymentGoal);
    return mDb.update(MySQLiteHelper.TABLE_DEBT, values, MySQLiteHelper.COLUMN_ID + "=" + updateId, null) > 0;

并检查返回的布尔值。

【讨论】:

  • 我进行了更改并记录了另一端出现的布尔值,它说“真”。只是为了仔细检查问题不是我打印出的结果不正确,而是数据库本身,我进入数据库并且我更改的数字没有通过。
  • 更新:也许简单地删除行并插入一个新行会更容易?该对话框确实包含来自所有列的数据并且是预先填充的——因此不会留下任何空白。虽然不符合原则,但我想知道这里发生了什么。至少我认为这显然是逻辑上的缺陷。
【解决方案2】:

我终于找到了答案。这就是我正在做的事情:

  1. 为特定债务行中的每一列创建一个字符串变量。
  2. 使用该变量预填充对话框中的字段。
  3. 然后将相同的变量传递给更新方法

例如(简体):

 String name = null;
 EditText et;

 name = debt.getName();
 et.setText(name);

 onclick {
     datasource.updateDebt(name);
 }

我错过了 2 到 3 之间的步骤。 在 onClick 方法中再次设置变量。一旦用户按下更新按钮,该变量必须重新设置为 EditText 字段的新值。像这样:

 String name = null;
 EditText et;

 name = debt.getName();
 et.setText(name);
 onclick {
     ***name = et.getText().toString();***
     datasource.updateDebt(name);
 }

【讨论】:

    猜你喜欢
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 2018-11-11
    • 2011-08-24
    相关资源
    最近更新 更多