Попытка редактировать определенную строку в SQLiteDatabase, но она обновляет каждый элемент в базе данных - PullRequest
0 голосов
/ 03 октября 2018

Как заголовок, я пытаюсь обновить определенные данные, хранящиеся в SQLiteDatabase, но он обновляет каждый элемент в нем.

Я пытаюсь сделать приложение для создания заметок.Пока он сохраняет то, что я хочу сохранить правильно, но когда я пытаюсь редактировать заметку, возникает проблема.

Она изменяет все сохраненные заметки, когда я нажимаю кнопку редактирования, включая заметку, которую я хотел отредактировать.

Примечание определено как объект MemoItem, т.е. MemoItem memoItem = new MemoItem (), и имеет следующие переменные: String saveTime, memo и category.

Когда я нажимаю на заметку, я хочу редактироватьон успешно принимает сохраненные значения, но да.

И на всякий случай, если это необходимо, вот что объявлено в моем классе SQLiteOpenHelper:

public class MemoListDbHelper extends SQLiteOpenHelper {

    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "MemoListDB.db";

    public static class MemoEntry implements BaseColumns {
        public static final String TABLE_NAME = "entry";

        public static final String COLUMN_CATEGORY = "category";
        public static final String COLUMN_SAVED_TIME = "savedTime";
        public static final String COLUMN_MEMO = "memo";
    }

    private static final String SQL_CREATE_ENTRIES = "CREATE TABLE " + MemoEntry.TABLE_NAME + " (" +
        MemoEntry._ID + " INTEGER PRIMARY KEY," +
        MemoEntry.COLUMN_CATEGORY + " TEXT," +
        MemoEntry.COLUMN_SAVED_TIME + " TEXT," +
        MemoEntry.COLUMN_MEMO + " TEXT )";

}

Я создал метод updateNote ()внутри вспомогательного класса:

public void updateNote(MemoItem memoItem) {

    if (memoItem == null) {
        return;
    }

    SQLiteDatabase db = getReadableDatabase();

    ContentValues values = new ContentValues();

    values.put(MemoEntry.COLUMN_MEMO, memoItem.memo);

    db.update(MemoEntry.TABLE_NAME, values, "_id=" + MemoEntry._ID, null);

}

И кнопка редактирования находится внутри фрагмента с именем MemoFragment.

В переопределенном методе onClick есть другой метод с именем updateMemoOnClick (), который я сделал.

Когда кнопка нажата, она создаст новый объект MemoItem с категорией, памяткой и сохраненным временем, который пользователь поместил и передал объект методу updateNote ().выше:

private void updateMemoOnClick() {

    MemoItem memoItem = new MemoItem();
    memoItem.memo = memoEditText.getText().toString();
    memoItem.category = selectedBodyPartTextView.getText().toString();
    memoItem.startedTime = startTimeTextView.getText().toString();

    memoListDbHelper.updateMemo(memoItem);

}

Почему мой SQLite update () обновляет все элементы базы данных?

Может кто-нибудь помочь?Я был на этой проблеме в течение половины дня.Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Вы можете попробовать другой способ обновления

db.update(MemoEntry.TABLE_NAME, values, "_id=?", new String[]
    {String.valueOf(memoItem._ID)});

ИЛИ

db.update(MemoEntry.TABLE_NAME, values, "_id='" + memoItem._ID+"'", null);
0 голосов
/ 03 октября 2018

Я предполагаю, что вы отображаете записи заметок в представлении переработчика, поэтому для этого вам нужно много объектов MemoEntry.Вам не нужен объект memoItem.

Вы можете получить список записей с помощью метода, подобного следующему:

public ArrayList<MemoEntry> getMemoEntries(SQLiteDatabase db){
    ArrayList<MemoEntry> entries = new ArrayList<>();
    Cursor c;

    c = db.rawQuery("SELECT * FROM " + ENTRY_TABLE, null)
    if(c != null && c.moveToFirst()){
        while(!c.isAfterLast()){
            MemoEntry entry = new MemoEntry();
            entry.setId(c.getInt(c.getColumnIndex(Memo_Entry._ID)));
            entry.setCategory(c.getString(c.getColumnIndex(Memo_Entry.COLUMN_CATEGORY)));
            entry.setMemo(c.getString(c.getColumnIndex(Memo_Entry.COLUMN_MEMO)));
            entries.add(entry);
            c.moveToNext();
        }
        c.close();
    }

    return entries;

При переходе к редактированию записи вы можете ссылаться на поле идентификатора объекта.,Затем вы можете использовать приведенный ниже запрос после сохранения пользователем.

db.RawQuery("UPDATE " + MemoEntry.TABLE_NAME + " SET " + MemoEntry.COLUMN_MEMO + " = " MemoEntry.memo + " WHERE " + MemoEntry.COLUMN_ID+ " = " + memoEntry._id ,null);

Я думаю, что путаница заключается в том, что вы помещаете имена столбцов в объект MemoEntry?

Также может быть хорошей идеей обновить сохраненное время.

0 голосов
/ 03 октября 2018

Здесь вы делаете ошибку

  db.update(MemoEntry.TABLE_NAME, values, "_id=" + MemoEntry._ID, null);

замените MemoEntry._ID на ваш идентификатор строки.как memoItem.id

 db.update(MemoEntry.TABLE_NAME, values, "_id=" + [row id should be here], null);
...