2016-07-07 67 views
0

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

删除似乎工作,因为城市,日期和突出显示在我调用方法后不直接显示在应用程序中。但是,当我建造一个新的城市,并且在旧城区添加一个日期时,该日期会显示两次。奇怪,因为实际上的亮点似乎被删除..下面是删除所有三个要素代码:

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的日记。在我看来,这应该意味着旧的日记确实被删除了,并且新的日记被添加了,但是我删除并添加了一个城市和日记的日子越多,旧日记的重复越多... 我在这里错过了什么吗?

+0

检查'db.delete(...)'返回的内容,并在每次创建时关闭'db'对象。 – Luke

+0

@qbeck db.delete在所有情况下返回1,这意味着它实际上删除了城市,日记和突出显示的权利?每次创建它时关闭数据库对象意味着什么?因为当我在每一个调用.getWritable/.getReadable数据库的方法中关闭它时,它会给我提供以下错误:“尝试重新打开已关闭的对象:SQLite数据库” –

回答

0

Got it!我使用了一个我在SQLiteDatabase中为多个表找到的教程,但那个教程不正确。我认为这个问题应该与表格有关,我把突出显示的标识与日记和日记链接到一个城市。在本教程中,包含我想要删除的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()方法固定它。