在过去的几天里,我查看了过多的类似主题,但似乎没有一个对我的实际情况有所帮助,或者仅仅是我的经验不足。
我有一个执行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”只是为了测试它是否可以正常工作。
答案 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));