За последние пару дней я просмотрел множество похожих тем, но, похоже, ни одна из них не помогла моей реальной ситуации или, может быть, это просто моя неопытность.
У меня есть простое приложение, которое выполняет операции CRUD. Я могу успешно вводить новые строки в таблицу, а также удалять их, однако что-то не так с моим кодом обновления, и я не могу найти, почему. Что меня озадачило, так это то, что это сработало один раз, а потом никогда не сработало, независимо от того, создаю я новые записи или полностью удаляю базу данных и начинаю снова. Выделение того, что я считаю соответствующим кодом, было бы следующим:. 1003 *
Отдельные элементы находятся внутри 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()
, чтобы попытаться выяснить, что происходит. Оригинальное имя для этой записи - "Тед", и это третье место в списке. Если я редактирую поле EditText и запускаю метод updateData()
, при достижении точки останова он правильно показывает отредактированное значение, а также правильную позицию 2. Однако база данных фактически не обновляется. Я явно не понимаю, как что-то здесь работает.
Чтобы избежать раздувания, я включил только то, что считаю уместным, но если больше информации требуется, я с удовольствием добавлю.
Наконец, вот снимок экрана отладчика в точке останова, показывающий то, что я воспринимаю как правильную информацию, и где я совершенно сбит с толку относительно того, почему она не работает (я добавил кучу g в конце имя "Тед" просто для проверки, будет ли оно работать).
