从 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 到你的对象。
当您向数据库添加内容时,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();
}
当您从数据库中读取 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
!
不兼容
我正在使用 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 到你的对象。
当您向数据库添加内容时,
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(); }
当您从数据库中读取
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
!