从 SQLite 数据库中删除数据不起作用

Deleting data from SQLite Database is not working

我正在使用 SQLite,但在删除数据时遇到问题。
首先,这是我将数据添加到数据库的方式:

public void addRecipe (QueryVars Recipee){
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_Recipe, Recipee.getRecipe());

    db.insert(TABLE_Recipes, null, values);
    db.close();
}

这就是我从数据库中获取数据的方式:

public List<QueryVars> getAllBooks() {
    List<QueryVars> recipes = new LinkedList<QueryVars>();

    String query = "SELECT  * FROM " + TABLE_Recipes;

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(query, null);

    QueryVars Recipe = null;
    if (cursor.moveToFirst()) {
        do {
            Recipe = new QueryVars();
            // Recipe.setId(Integer.parseInt(cursor.getString(0)));
            Recipe.setRecipe(cursor.getString(1));
            recipes.add(Recipe);
        } while (cursor.moveToNext());
    }

    return recipes;
}

保存和查询数据工作得很好,但是当我尝试使用以下代码删除行时它不起作用。

public void deleteRecipes(QueryVars Recipe) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_Recipes, KEY_ID + " = ?", new String[] { String.valueOf(Recipe.getId()) });
    db.close();
}

这是我用来创建 table:

的查询
private static final String CREATE_BOOK_TABLE = 
        "CREATE TABLE Recipes ("
            + "id INTEGER PRIMARY KEY AUTOINCREMENT, "
            + "Recipe TEXT"
        + ")";

我在上面的代码中使用的常量定义如下:

private static final TABLE_Recipes = "Recipes";
private static final String KEY_ID = "id"; 
private static final String KEY_Recipe = "Recipe"; 
private static final String[] COLUMNS = {KEY_ID,KEY_Recipe}; 

您没有获取数据库生成的食谱 ID,该 ID 为零。它与删除中的任何行都不匹配。

取消注释

// Recipe.setId(Integer.parseInt(cursor.getString(0)));

(考虑改用 cursor.getInt()

可能还会将 insert() 的 return 值存储为配方 ID。

您的代码中有两个问题可能是错误的根源,但都有相同的原因:您让 SQLite 生成 Recipe 对象的 ID,但您从未设置它id 到你的对象。

  1. 当您向数据库添加内容时,add() 方法 returns 为该行生成的 ID。您可以将此 ID 设置为 Recipe 对象,否则 Recipe 对象将没有 ID,直到您从数据库中重新加载它。

    public void addRecipe (QueryVars Recipee){
        SQLiteDatabase db = this.getWritableDatabase();
    
        ContentValues values = new ContentValues();
        values.put(KEY_Recipe, Recipee.getRecipe());
    
        final long id = db.insert(TABLE_Recipes, null, values);
        Recipee.setId(id);
    
        db.close();
    }
    
  2. 当您从数据库中读取 Recipe 对象时,您没有在该对象上设置 id 值,因此您从数据库中读取的 Recipe 对象没有一个id 这意味着你不能从数据库中删除它们。修复也非常简单:

    public List<QueryVars> getAllBooks() {
        List<QueryVars> recipes = new LinkedList<QueryVars>();
    
        String query = "SELECT  * FROM " + TABLE_Recipes;
    
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query, null);
    
        final int idIndex = cursor.getColumnIndex(KEY_ID);
        final int recipeIndex = cursor.getColumnIndex(KEY_Recipe);
    
        QueryVars Recipe = null;
        if (cursor.moveToFirst()) {
            do {
                Recipe = new QueryVars();
                Recipe.setId(cursor.getLong(idIndex));
                Recipe.setRecipe(cursor.getString(recipeIndex));
                recipes.add(Recipe);
            } while (cursor.moveToNext());
        }
    
        return recipes;
    }
    

    这使用 getColumnIndex() 可靠地获取每一列的正确索引,然后从游标读取 id 和配方并将它们设置到 Recipe 对象。


请注意您的Recipe对象需要有一个long ID! int ID 与 SQLiteDatabase!

不兼容