2013-10-07 46 views
8

我有一個可運行的應用程序,它使用數據庫和SQLiteAssetHelper。數據庫文件(sql.sqlite)被壓縮(sql.sqlite.zip)並放入資產/數據庫文件夾中。未知錯誤(代碼14):無法打開數據庫

該程序工作得很好。當運行一秒/三分之一/四分之一時間時,它會很快啓動。但如果我做一個「強制停止」後面跟着一個「清除數據」然後再運行它,然後當我運行它(查看日誌)時,我看到一個錯誤「未知錯誤(代碼14):無法打開數據庫」...但後來我等了幾秒鐘,所有加載和完美的作品。

的日誌如下:

W/SQLiteAssetHelper(18393): could not open database SQL.sqlite - unknown error (code 14): Could not open database 
W/SQLiteAssetHelper(18393): copying database from assets... 
W/SQLiteAssetHelper(18393): extracting file: 'sql.sqlite'... 
W/SQLiteAssetHelper(18393): database copy complete 
I/SQLiteAssetHelper(18393): successfully opened database SQL.sqlite 

所以它看起來像它在某種程度上試圖找到數據庫,失敗,崩潰,然後修復本身。所以我的問題是,我怎麼能避免笨拙的開始和幾秒鐘的延遲?

編輯:我的第一個參考數據庫,在我的代碼是...

public class Globals extends Application 
{ 
    Custom_SQLiteAssetHelper db; 
    public void onCreate() 
    { 
     super.onCreate(); 
     db = new Custom_SQLiteAssetHelper(this); 
     cursor = db.get_first_species_common_name(); 

,我有...

public class Custom_SQLiteAssetHelper extends SQLiteAssetHelper 
{ 
    public Custom_SQLiteAssetHelper(Context context) 
    { 
     super(context, "SQL.sqlite", null, 1); 
    } 
    public Cursor get_first_species_common_name() 
    { 
     SQLiteDatabase db = getReadableDatabase(); 
     SQLiteQueryBuilder querything = new SQLiteQueryBuilder(); 
      // etc... 
+0

這個過程就像你試圖首先訪問數據庫(有錯誤),然後你創建它並再次訪問它。猜猜你需要重新安排你做到這一點的方式。 – LightYearsBehind

+0

查看編輯OP ...也許這會更清晰。 – Mick

+0

您可以嘗試使用Context.getDatabasePath(dbName).exists()來確定您的數據庫是否已經存在。至於延遲的秒數,我相信它是因爲你有一個大型的數據庫,它需要時間來解壓縮和複製。如果是因爲解壓縮,請不要從頭開始壓縮。如果需要花費時間進行復制,請增加每次複製操作的字節數。 – LightYearsBehind

回答

-1
public Custom_SQLiteAssetHelper(Context context) 
{ 
    super(context, "SQL.sqlite", null, 1); 
} 

更改爲

public Custom_SQLiteAssetHelper(Context context) 
{ 
    super(context, "SQL.sqlite", null, 1); 
    close(); 
} 

@ haike0 0他使用的是SQLiteAssetHelper,它是一個庫,它支持您在第一次運行應用程序時將預先填充的sqlite數據庫複製到內部/外部存儲。當使用這個庫,你必須壓縮你的sqlite文件,沒有其他選項。

0

嘗試改變

super(context, "SQL.sqlite", null, 1); 

super(context, "SQL", null, 1); 
相關問題