在具有多个表的 sqlite 数据库中删除行不起作用

Posted

技术标签:

【中文标题】在具有多个表的 sqlite 数据库中删除行不起作用【英文标题】:Deleting row in sqlite database with multiple tables doesn't work 【发布时间】: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 数据库” 【参考方案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() 方法。

【讨论】:

以上是关于在具有多个表的 sqlite 数据库中删除行不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在具有多个表的 sqlite 数据库中检索链接对象列表的查询是啥?

Android SQLite 更新行不起作用并且没有显示错误

SQLITE DB如何将多个表的数据保存在一个文件中?

在使用多个数据库时将记录插入表的 ManyToMany 字段

如何使用引用多个表的 WHERE 子句删除 sqlite 中的行?

SQLITE3 - 删除具有相同值的多个列的行