尝试在SQLiteDatabase中编辑特定行,但它会更新数据库中的每个项目

时间:2018-10-03 13:31:29

标签: android sqlite android-sqlite sqliteopenhelper

作为标题,我试图更新存储在SQLiteDatabase中的特定数据,但它会更新其中的每个项目。

我正在尝试做一个做笔记应用程序。到目前为止,它可以保存我想要正确保存的内容,但是当我尝试编辑便笺时,问题就来了。

当我按下“编辑”按钮时,它会更改所有已保存的笔记,包括要编辑的笔记。

该注释定义为MemoItem对象,即MemoItem memoItem = new MemoItem(),并且具有以下变量:字符串saveTime,备忘录和类别。

当我点击要编辑的便笺时,便成功保存了保存的值,是的。

以防万一,在我的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 )";

}

我在Helper类中做了一个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 :(得分:2)

  

您在这里犯错

cout << (void*)ptr << endl;

用您的行ID替换 db.update(MemoEntry.TABLE_NAME, values, "_id=" + MemoEntry._ID, null); 。像MemoEntry._ID

memoItem.id

答案 1 :(得分:1)

您可以尝试其他更新方式

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

OR

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

答案 2 :(得分:0)

我假设您正在回收站视图中显示备忘录条目,因此,为了做到这一点,您需要许多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;

当您编辑条目时,可以引用对象ID字段。 然后,用户保存后即可使用以下查询。

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

我认为这里的困惑在于您是否将列名放在MemoEntry对象中?

更新节省的时间可能也是个好主意。