如何在没有 entryId 的情况下更新 SQLiteOpenHelper 中的条目?

How to update entry in SQLiteOpenHelper without entryId?

因此,对于我的 android 应用程序,我想更新我最初通过下面的标准方法输入的一行数据,这些数据位于扩展 SQLiteOpenHelper 的 class 中:

public boolean insert(String name, int quantity, double price){
    ContentValues contentValues = new ContentValues();
    contentValues.put(DatabaseContract.Table.COLUMN_NAME_NAME, name);
    contentValues.put(DatabaseContract.Table.COLUMN_NAME_QUANTITY, quantity);
    contentValues.put(DatabaseContract.Table.COLUMN_NAME_PRICE, price);
    long result = db.insert(DatabaseContract.Table.TABLE_NAME, null, contentValues);
    if (result == -1)
        return false;
    else
        return true;
}

public void updateData(int id, String name, int quantity, double price){
        ContentValues contentValues = new ContentValues();
        contentValues.put(DatabaseContract.Table.COLUMN_NAME_ID, id);
        contentValues.put(DatabaseContract.Table.COLUMN_NAME_NAME, name);
        contentValues.put(DatabaseContract.Table.COLUMN_NAME_QUANTITY, quantity);
        contentValues.put(DatabaseContract.Table.COLUMN_NAME_PRICE, price);
        db.update(DatabaseContract.Table.TABLE_NAME, contentValues, "ID = ?", new String[]{Integer.toString(id)});
    } 

在我的实际activity中,我有我想要更改的名称、数量和价格,但我不知道如何去做,我不知道"id" 的任意条目。

提前致谢。

而不是 return 布尔值,我会 return 新记录的 ID。假设您的应用程序与商店有关,您的名称、数量和价格是商品的属性 class,我也会为您的商品添加一个 ID 属性。在保存(创建)时,您可以在项目中设置 ID。这将允许您稍后使用相同的 ID 更新它。如果没有,您将需要一些其他属性作为主键,但这似乎不是您要找的东西,也不是一个很好的选择。

插入方法returns刚刚插入的行的id,如果在插入过程中出错,则为-1。

long id = db.insert(...)

或者更改了你的table的主键,例如:

db.execSQL("CREATE TABLE " + TABLE_NAME + "(name TEXT PRIMARY KEY not null,...

为了方便和灵活,插入行后返回 ID 总是更好。 您可以相应地修改代码以实现该目的。

但是,在当前情况下,如果您没有 ID 但仍想更新行,您可以使用其他列并创建条件组合。

如果您可以指定产品名称(如果它是唯一的),您可以在 update(..) 方法中用产品名称替换 ID。

db.update(DatabaseContract.Table.TABLE_NAME, contentValues, DatabaseContract.Table.COLUMN_NAME_NAME + " = ?", new String[]{name});

或者如果您想使用条件组合:

db.update(DatabaseContract.Table.TABLE_NAME, contentValues, DatabaseContract.Table.COLUMN_NAME_NAME + " = ? AND "+DatabaseContract.Table.COLUMN_NAME_PRICE + " = ?", new String[]{name,price});