【问题标题】:Deleting row in sqlite database with multiple tables doesn't work在具有多个表的 sqlite 数据库中删除行不起作用
【发布时间】:2016-11-09 23:29:05
【问题描述】:

我正在制作某种旅行应用程序,人们可以在其中添加城市,打开城市页面,在那里添加日记日期,最后在该日期添加文本(突出显示)。 一切正常,除非我尝试从 sqlite 数据库中删除一个城市。 删除一个城市意味着它必须自动删除与该城市相关的日期以及亮点,但不会删除与其他城市相关的日期。

删除似乎确实有效,因为在我调用该方法后,城市、日期和突出显示并没有直接显示在应用程序中。但是,当我创建一个新城市并使用旧城市的 id 并添加旧城市中存在的日期时,日期会显示两次。奇怪,因为高亮似乎确实被删除了。这是删除所有三个元素的代码:

    public void deleteCity(City city){
    SQLiteDatabase db=this.getWritableDatabase();
    List<Diary>diaries=getDiariesByCity(city.getId());
    for(Diary diary: diaries){
        try{ deleteDiary(diary);
        }catch(Exception e){ Log.w(TAG, "There is no diary to delete");
    }}
    db.delete(TABLE_CITY, KEY_ID+" =?", new String[]{String.valueOf(city.getId())});

    Log.i(TAG,"City "+city.getId()+" deleted");
}

    public void deleteDiary(Diary diary){
    SQLiteDatabase db=this.getWritableDatabase();
    try{ deleteHighlight(getHighlightByDiaryId(diary.getId()));
    }catch(Exception e) { Log.w(TAG, "There is no highlight to delete");            
    }
    db.delete(TABLE_DIARY, KEY_ID+" =?", new String[]{String.valueOf(diary.getId())});

    Log.i(TAG, "Diary "+diary.getId()+" deleted");
}

    public void deleteHighlight(Highlight highlight){
    SQLiteDatabase db=this.getWritableDatabase();
    db.delete(TABLE_HIGHLIGHT, KEY_ID+" =?", new String[]{String.valueOf(highlight.getId())});

    Log.i(TAG, "Highlight "+highlight.getId()+" deleted");
}

更奇怪的是日志也告诉我,例如删除城市后,ID 为 1 的日记被删除,当我添加一个新城市时,它说 ID 为 1 的日记已创建。在我看来,这应该意味着确实删除了旧的并添加了新的,但是我删除并添加的城市及其日记越多,旧日记的重复就越多…… 我在这里遗漏了什么吗?

【问题讨论】:

  • 检查db.delete(...)返回的内容,并在每次创建db对象时关闭它。
  • @qbeck db.delete 在所有情况下都返回 1,这意味着它实际上删除了城市、日记和突出显示,对吗?每次创建 db 对象时都关闭它是什么意思?因为当我在调用 .getWritable/.getReadable 数据库的每个方法中关闭它时,它会给我以下错误:“尝试重新打开已经关闭的对象:SQLite 数据库”

标签: android database eclipse sqlite methods


【解决方案1】:

知道了!我使用了我为 SQLiteDatabase 中的多个表找到的教程,但那个是不正确的。我认为问题应该与我将亮点的 ID 链接到日记并将日记链接到城市的表格有关。在本教程中,包含我要删除的 Id 的行仅从包含对象本身的表中删除。因此,将 Id 链接到彼此的表保持不变。只需添加

即可修复它
     db.delete(TABLE_CITY, KEY_ID+" =?", new String[]{String.valueOf(city.getId())});

到 deleteCity() 方法,

    db.delete(TABLE_DIARY_HIGHLIGHT, KEY_DIARY_ID+" =?", new String[]{String.valueOf(diary.getId())});
    db.delete(TABLE_CITY_DIARY, KEY_DIARY_ID+" =?", new String[]{String.valueOf(diary.getId())});

到 deleteDiary() 方法,并且

    db.delete(TABLE_DIARY_HIGHLIGHT, KEY_HIGHLIGHT_ID+" =?", new String[]{String.valueOf(highlight.getId())});

到 deleteHighlight() 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多