试图编辑 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 中的特定行,但它会更新数据库中的每个项目的主要内容,如果未能解决你的问题,请参考以下文章