2013-03-30 81 views
0

我目前正在使用一個SQLite數據庫的Android應用程序。Android SQLite OnUpgrade錯誤

首先,我想知道是否有適當的方式來升級基於新信息的SQLite數據庫。目前,我的信息存儲在一個文本文件中,數據庫的行數作爲第一行。我讀了第一行,看看數據庫中有多少行。如果文本文件中有更多行,則我升級數據庫並將所有內容重新添加到數據庫中。

這是目前我的代碼:

try { 
     InputStream is = getResources().getAssets().open("Questions"); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
     AssistedMemDB db = new AssistedMemDB(this); 
     db.open(); 
     int tempNum = db.getNumber(); 
     String line = ""; 
     line = reader.readLine(); 
     if (Integer.decode(line) > tempNum) { 
      db.close(); 
      db.upgrade(); 
      db.open(); 
      while ((line = reader.readLine()) != "") { 
       String list[] = line.split("\\<>"); 
       db.createEntry(list[0], list[1]); 
      } 
     } 
     db.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

我收到一個錯誤說:

java.lang.IllegalStateException:嘗試重新打開已關閉的對象:SQLiteDatabase

預先感謝您!

回答

0

您不會升級數據庫以向其中添加新行。當您添加新表格或新列時,可以升級數據庫。添加行時,您只需執行插入操作並將新數據與舊數據一起放入。

另外,db helper會自動爲您調用onUpgrade。所有你必須做的事情是,當你想改變模式時,增加數據庫版本。

+0

雖然我遇到的問題是我從文本文件添加到數據庫中,因此我擁有文件中的所有信息。所以,當我向文件添加更多信息時,我只需更改文件頂部的數字,然後刪除所有行並重新添加它們。我相信有更好的方法來做到這一點,有什麼建議嗎? –

+0

只需循環執行INSERT或IGNORE的所有行。如果它們不存在,將會添加行。或者,而不是分發巨大的文本文件只是分發差異(可能或不可行,取決於您的應用程序)。如果您確實需要刪除所有內容並進行讀取,則正確的方法是調用刪除表並重新創建它們,而不是嘗試執行onUpgrade - 該函數不打算從類似的用戶代碼中調用。 –

+0

好的,這是有道理的。非常感謝Gabe Sechan。 INSERT或IGNORE會如下所示: 「INSERT OR IGNORE INTO TABLE ...」 –