我有一个列表视图,显示存储在数据库中的项目列表。我可以完美地显示和编辑这些项目。 这些项目也可以被删除,但问题出现在我尝试读取事物被删除后的项目。有时错误不会发生,具体取决于你删除的方式,我无法弄清楚发生了什么。
错误的一个例子:
我将有3个项目:a,b,c
如果我从列表中的任何位置删除其中一个项目,那么读取它就可以了,任何组合。但是,如果我要删除b和c然后尝试读取b,我会有一个a,b,b的列表。带有b的副本,表示如果选中则会崩溃。删除的第一个b也将删除它。
如果我删除a,b和c并尝试阅读a然后我会得到一个a的列表,a与另一个重复显示。如果我然后将b添加到列表中,我会得到a,b,a,b,其问题与以前相同。如果我一直在删除这一点,最终当我尝试阅读一个项目时,我会在列表视图中出现越来越多的重复项。
就像我从列表中删除的项目一样多,它会将那么多重复的项目添加到列表的末尾以填充它。除非我一次只删除一个项目。
我不确定在这里输入什么代码。只是显示错误不是问题。数据库正在返回这些重复的列表。好奇,如果有人可能知道发生了什么。我不确定发布什么代码。我的代码基于此处的教程 - http://www.androidhive.info/2013/09/android-sqlite-database-with-multiple-tables/
public long createToDo(Todo todo, long[] tag_ids) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_TODO, todo.getNote());
values.put(KEY_STATUS, todo.getStatus());
values.put(KEY_PRICE, todo.getPrice());
values.put(KEY_CREATED_AT, getDateTime());
values.put(KEY_PURCHASED, todo.getPurchased());
// insert row
long todo_id = db.insert(TABLE_TODO, null, values);
// insert tag_ids
for (long tag_id : tag_ids) {
createTodoTag(todo_id, tag_id);
}
return todo_id;
}
删除返回的todo_id将被发送到此删除方法
public void deleteToDo(long tado_id) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_TODO, KEY_ID + " = ?",
new String[] { String.valueOf(tado_id) });
}
这是我用来获取每个列表的待办事项的函数
public List<Todo> getAllToDosByTag(String tag_name) {
List<Todo> todos = new ArrayList<Todo>();
String selectQuery = "SELECT * FROM " + TABLE_TODO + " td, "
+ TABLE_TAG + " tg, " + TABLE_TODO_TAG + " tt WHERE tg."
+ KEY_TAG_NAME + " = '" + tag_name + "'" + " AND tg." + KEY_ID
+ " = " + "tt." + KEY_TAG_ID + " AND td." + KEY_ID + " = "
+ "tt." + KEY_TODO_ID;
Log.e(LOG, selectQuery);
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (c.moveToFirst()) {
do {
Todo td = new Todo();
td.setId(c.getInt((c.getColumnIndex(KEY_ID))));
td.setNote((c.getString(c.getColumnIndex(KEY_TODO))));
td.setCreatedAt(c.getString(c.getColumnIndex(KEY_CREATED_AT)));
td.setStatus(c.getInt((c.getColumnIndex(KEY_STATUS))));
td.setPrice(c.getInt((c.getColumnIndex(KEY_PRICE))));
td.setPurchased(c.getInt((c.getColumnIndex(KEY_PURCHASED))));
// adding to todo list
todos.add(td);
} while (c.moveToNext());
}
return todos;
}
以下是我在其他活动中展示它们的方式
listOfTodos = db.getAllToDosByTag(nameOfList);
final ListView lv1 = (ListView) findViewById(R.id.listItems);
lv1.setAdapter(new MyCustomBaseAdapter(this, listOfTodos);
-
public long createTodoTag(long todo_id, long tag_id) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_TODO_ID, todo_id);
values.put(KEY_TAG_ID, tag_id);
values.put(KEY_CREATED_AT, getDateTime());
long id = db.insert(TABLE_TODO_TAG, null, values);
return id;
}