繁体   English   中英

Android-SQLite数据库未更新行

[英]Android - SQLite database not updating row

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

我有一个执行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, ”来测试它是否可以正常工作)。

在此处输入图片说明

按如下所示更改您的通话以进行更新

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

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

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

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

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

将上面的代码更新为下面的代码

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

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

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

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

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

尝试从contentValues中删除_Id:

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM