从SQLite数据库中删除数据无效

时间:2015-05-20 05:48:11

标签: android android-sqlite

我正在使用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();
}

这是我用来创建表的查询:

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}; 

2 个答案:

答案 0 :(得分:0)

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

取消注释

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

(考虑改为使用cursor.getInt()

可能还会将insert()的返回值存储为食谱ID。

答案 1 :(得分:0)

您的代码中有两个问题可能是错误的来源,但两者都有相同的原因:您让SQLite生成Recipe个对象的ID,但您永远不会将该ID设置为你的对象。

  1. 当您向数据库添加内容时,add()方法将返回为该行生成的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对象。

  3. 请注意您的Recipe对象需要long个ID! int ID与SQLiteDatabase不兼容!