我正在使用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};
答案 0 :(得分:0)
您没有捕获数据库生成的食谱ID,ID为零。它不匹配删除中的任何行。
取消注释
// Recipe.setId(Integer.parseInt(cursor.getString(0)));
(考虑改为使用cursor.getInt()
)
可能还会将insert()
的返回值存储为食谱ID。
答案 1 :(得分:0)
您的代码中有两个问题可能是错误的来源,但两者都有相同的原因:您让SQLite生成Recipe
个对象的ID,但您永远不会将该ID设置为你的对象。
当您向数据库添加内容时,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();
}
当您从数据库中读取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
不兼容!