删除项目然后尝试添加更多内容时的Android数据库错误

时间:2014-03-19 18:26:23

标签: android database sqlite

我有一个列表视图,显示存储在数据库中的项目列表。我可以完美地显示和编辑这些项目。 这些项目也可以被删除,但问题出现在我尝试读取事物被删除后的项目。有时错误不会发生,具体取决于你删除的方式,我无法弄清楚发生了什么。

错误的一个例子:

我将有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;
}

0 个答案:

没有答案