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

Posted

技术标签:

【中文标题】试图编辑 SQLiteDatabase 中的特定行,但它会更新数据库中的每个项目【英文标题】:Trying to edit specific row in SQLiteDatabase, but it updates every item in the database 【发布时间】:2018-10-03 13:31:29 【问题描述】:

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

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

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

note 被定义为 MemoItem 对象,即 MemoItem memoItem = new MemoItem(),并具有以下变量:String savedTime、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 )";


我在 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 的 Fragment 中。

重写的 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() 会更新数据库中的所有项目?

有人可以帮忙吗?我已经解决了半天这个问题。提前致谢!

【问题讨论】:

【参考方案1】:

你错了

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

MemoEntry._ID 替换为您的行 id 。喜欢memoItem.id

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

【讨论】:

“[row id 应该在这里]”是什么意思?我对 SQLite 完全陌生,我真的不明白你的意思。 您必须将特定的主键 _ID 作为 Row id 传递 传递这个 memoItem.id 谢谢,但我的 MemoItem 对象没有名为 Id 的变量。它只有 3 个变量:savedTime、memo 和 category。它返回一个错误,说明它无法解析符号 ID、_ID、Id 或其他任何内容。 当您从数据库中检索到 id 时,请带上 id。【参考方案2】:

你可以尝试不同的更新方式

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

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

【讨论】:

我的 MemoItem 对象没有 _ID 变量,因此它返回一个错误,指出它无法解析符号 '_ID'。我能做什么? 在从表中获取数据时,您必须从表中获取“_id”。或者在其他值的基础上更新。 所以其中一个变量是savedTime,我可以像db.update(MemoEntry.TABLE_NAME, values, "_savedTime='" memoItem.savedTime+"'", null); ? 我刚刚尝试过,但现在它根本没有改变内容。【参考方案3】:

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

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

【讨论】:

我的 MemoItem 对象没有名为 _ID 的变量,因此它返回错误。 当想要更新笔记时,您需要获取键值对。那是身份证和备忘录。您应该向您的 memoItem 对象添加一个 id 字段。去更新的时候可以说memoItem.id = MemoEntry.id,那么就可以如上图更新了。

以上是关于试图编辑 SQLiteDatabase 中的特定行,但它会更新数据库中的每个项目的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中编辑文本文件中的特定行

使用该行的 id 编辑表的特定行

突出显示 JTextArea 中的一个特定行/行

更新/编辑数据 - VBA Excel

如何替换 FMDB 中的特定行?

试图只允许在单个特定行上进行滑动行为