Android - база данных SQLite не обновляет строку - PullRequest
0 голосов
/ 26 августа 2018

За последние пару дней я просмотрел множество похожих тем, но, похоже, ни одна из них не помогла моей реальной ситуации или, может быть, это просто моя неопытность.

У меня есть простое приложение, которое выполняет операции 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 в конце имя "Тед" просто для проверки, будет ли оно работать).

enter image description here

Ответы [ 4 ]

0 голосов
/ 28 августа 2018

Я сейчас решил эту конкретную проблему, и ответ был довольно простым и немного смущающим.Я пытался использовать позицию курсора для идентификатора строки, не понимая, что база данных не использует нулевой базовый индекс, как курсор, поэтому первичный ключ не совпадает.

Поскольку я использую RecyclerViewЯ добавил следующую строку в свой onBindViewHolder и передал переменную моей операции обновления, которая затем может быть использована в selectionArgs

final long id = mCursor.getLong(mCursor.getColumnIndex(ContactEntry._ID));
0 голосов
/ 26 августа 2018
String selection = ContactEntry._ID + " LIKE ?";

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

Обновите этот код выше, чтобы этот код ниже

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

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

Вы хотите обновить точную строку.Но ключевое слово «LIKE» в основном используется для поиска.

Кроме того, вы открываете свою деятельность, когда обновляете свои данные.Обновление или вставка в базу данных занимает некоторое время.Когда вы начнете следующее действие, база данных может не завершить операцию записи.Это может привести вас к просмотру предыдущих данных.Убедитесь, что ваша база данных обновлена, а затем обновите представление.

Посмотрите в вашей базе данных из эмулятора, что база данных имеет новое значение или нет.Затем выполните дальнейшую работу.

0 голосов
/ 26 августа 2018

Попытайтесь удалить вас _Id из contentValues:

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

Я думаю, вы не можете изменить PRIMARY_KEY, вы говорите, какую строку вы хотите обновить:

String[] selectionArgs = { String.valueOf(mPosition)};
0 голосов
/ 26 августа 2018

Поменяйте ваш вызов на обновление, как показано ниже

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

, где count показывает количество строк, связанных с функцией обновления, это поможет вам точно знать, была ли обновленная строка или нет.

Примечание: -Мы используем, как, когда, иногда, вы не знаете точно полное ключевое слово, которое вы хотите запросить.Например, вы можете знать, что ваша самая любимая песня содержит слово «лифт», но вы точно не знаете название.Если вы знаете точное значение, попробуйте использовать: -

String selection = ContactEntry._ID + " =? ";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...