[英]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.