在具有多个表的 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 更新行不起作用并且没有显示错误
在使用多个数据库时将记录插入表的 ManyToMany 字段