Android-SQLite数据库未更新行

时间:2018-08-26 06:15:07

标签: java android sqlite

在过去的几天里,我查看了过多的类似主题,但似乎没有一个对我的实际情况有所帮助,或者仅仅是我的经验不足。

我有一个执行CRUD操作的简单应用程序。我可以在表中成功输入新行并将其删除,但是我的更新代码出了点问题,我找不到原因。我感到困惑的是它曾经工作过一次,然后再也没有做过,无论我创建新条目还是完全删除数据库然后重新启动。隔离我认为相关代码的操作流程如下。

单个项目位于RecyclerView内部,并从内部类发送到要编辑和更新的活动:

public void onBindViewHolder(@NonNull ContactViewHolder holder, int position) {

        final String contactName = mCursor.getString(mCursor.getColumnIndex(ContactEntry.COLUMN_NAME));
        final int contactNumber = mCursor.getInt(mCursor.getColumnIndex(ContactEntry.COLUMN_PHONE_NUMBER));
        final String contactMail = mCursor.getString(mCursor.getColumnIndex(ContactEntry.COLUMN_EMAIL));
        final int currentPosition = position;

    holder.mEditContact.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(mContext, ContactUpdate.class);
                    intent.putExtra(CONTACT_POSITION, currentPosition);
                    intent.putExtra(EXTRA_NAME, contactName);
                    intent.putExtra(EXTRA_PHONE, contactNumber);
                    intent.putExtra(EXTRA_MAIL, contactMail);
                    mContext.startActivity(intent);
                }
            });

然后我将它们放入检索类中,并将值组织到适当的EditText视图中。我敢肯定有一种更有效的方法,但我仍在学习:

Intent intent = getIntent();
        mPosition = intent.getIntExtra(ContactRecyclerAdapter.CONTACT_POSITION, 0);
        mContactName = intent.getStringExtra(ContactRecyclerAdapter.EXTRA_NAME);
        mContactPhone = intent.getIntExtra(ContactRecyclerAdapter.EXTRA_PHONE, 0);
        mContactMail = intent.getStringExtra(ContactRecyclerAdapter.EXTRA_MAIL);

        mUpdateName.setText(mContactName);
        mUpdatePhone.setText("" + mContactPhone);
        mUpdateMail.setText(mContactMail);

最后我更新行的方法:

private void updateData() {

        String name = mUpdateName.getText().toString();
        String getPhone = mUpdatePhone.getText().toString();
        int phone = Integer.parseInt(getPhone);
        String mail = mUpdateMail.getText().toString();

        SQLiteDatabase db = new ContactOpenHelper(this).getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(ContactEntry._ID, mPosition);
        values.put(ContactEntry.COLUMN_NAME, name);
        values.put(ContactEntry.COLUMN_PHONE_NUMBER, phone);
        values.put(ContactEntry.COLUMN_EMAIL, mail);

        String selection = ContactEntry._ID + " LIKE ?";

        String[] selectionArgs = { String.valueOf(mPosition)};

        db.update(ContactEntry.TABLE_NAME, values, selection, selectionArgs);
        db.close();
        startActivity(new Intent(this, ContactList.class));
    }

正在发生的事情是该行没有被更新。目前,我输入了三个模拟条目。我在update()行上设置了一个断点,以试图找出正在发生的事情。该条目的原始名称为“ ted”,它是列表中的第三个名称。如果我编辑EditText字段并运行updateData()方法,则在击中断点时,它会正确显示编辑后的值以及正确的位置2。但是,数据库实际上并没有更新。我显然误会了这里的工作方式。

为避免肿,我只列出了我认为相关的内容,但是如果需要更多信息,我很乐意添加。

最后,这是调试器在断点处的屏幕快照,显示了我认为是正确的信息,以及我对它为什么不起作用感到完全困惑的地方(我在末尾添加了一些g)名称“ ted”只是为了测试它是否可以正常工作。

enter image description here

4 个答案:

答案 0 :(得分:1)

按如下所示安排您的通话更新

 int count = db.update(ContactEntry.TABLE_NAME, values, selection, selectionArgs);

count表示更新功能影响的行数,这将帮助您确切地知道是否有任何更新的行。

注意:-我们有时会像您有时不完全知道要查询的完整关键字那样使用。例如,您可能知道自己最喜欢的歌曲包含单词“ elevator”,但您却不知道确切的名称。 如果您知道确切的值,请尝试使用:-

String selection = ContactEntry._ID + " =? ";

答案 1 :(得分:0)

String selection = ContactEntry._ID + " LIKE ?";

String[] selectionArgs = { String.valueOf(mPosition)};

将以上代码更新为以下代码

String selection = ContactEntry._ID + " = ?";

String[] selectionArgs = { String.valueOf(mPosition)};

您要更新确切的行。但是“ LIKE”关键字主要用于搜索。

此外,您在更新数据时正在打开活动。更新或插入数据库需要一些时间。当您的下一个活动开始时,数据库可能无法完成其写操作。它可能会导致您看到以前的数据。确保您的数据库已更新,然后更新视图。

从模拟器中查看数据库该数据库是否具有新值。然后做进一步的工作。

答案 2 :(得分:0)

尝试从contentValues中删除_Id:

//values.put(ContactEntry._ID, mPosition);

我认为您无法更改PRIMARY_KEY,而是说您要更新的行:

String[] selectionArgs = { String.valueOf(mPosition)};

答案 3 :(得分:0)

我现在已经解决了这个特殊问题,答案很简单,有点尴尬。我试图将游标位置用于行ID,但没有意识到数据库没有像游标那样使用零基索引,因此主键不匹配。

当我使用RecyclerView时,我将以下行添加到了onBindViewHolder并将变量传递给了我的更新活动,然后可以将其用于selectionArgs

final long id = mCursor.getLong(mCursor.getColumnIndex(ContactEntry._ID));