2017-09-02 92 views
0

我正在關注this建議使用指南來創建一個包含預加載數據的SQLite數據庫;但我不明白如何生成所需的數據庫文件(.db)。如何導入SQL數據庫文件

我已經使用「DB Browser for SQLite」軟件寫出我的數據庫,但似乎只能將該文件保存爲創建數據庫的命令(CREATE TABLE IF NOT EXISTS等)。

如何將我的文件保存爲所需的.db格式?

This網站的解決方案是爲什麼我認爲我的文件格式不正確。

對於背景下,我遇到了錯誤如下:

09-02 23:47:58.681 19704-19704/company.app W/SQLiteAssetHelper: copying database from assets... 
09-02 23:47:58.682 19704-19704/company.app W/SQLiteAssetHelper: database copy complete 
09-02 23:47:58.684 19704-19704/company.app E/SQLiteLog: (26) file is encrypted or is not a database 
09-02 23:47:58.684 19704-19704/company.app E/DefaultDatabaseErrorHandler: Corruption reported by sqlite on database: /data/user/0/company.app /databases/app .db 
09-02 23:47:58.684 19704-19704/company.app E/DefaultDatabaseErrorHandler: deleting the database file: /data/user/0/company.app /databases/app .db 
09-02 23:47:58.686 19704-19704/company.app E/SQLiteLog: (14) cannot open file at line 32504 of [bda77dda96] 
09-02 23:47:58.686 19704-19704/company.app E/SQLiteLog: (14) os_unix.c:32504: (2) open(/data/user/0/company.app /databases/app .db) - 
09-02 23:47:58.687 19704-19704/company.app E/SQLiteDatabase: Failed to open database '/data/user/0/company.app /databases/app .db'. 
                     android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database 
                      at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method) 
                      at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209) 
                      at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) 
                      at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) 
                      at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) 
                      at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) 
                      at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:808) 
                      at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:796) 
                      at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:696) 
                      at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:671) 
                      at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.returnDatabase(SQLiteAssetHelper.java:408) 
                      at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.createOrOpenDatabase(SQLiteAssetHelper.java:401) 
                      at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:176) 
                      at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:254) 
                      at company.app .MyDatabase.randomiseItBro(MyDatabase.java:33) 
                      at company.app .MainActivity.randomise(MainActivity.java:55) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at android.view.View$DeclaredOnClickListener.onClick(View.java:4695) 
                      at android.view.View.performClick(View.java:5612) 
                      at android.view.View$PerformClick.run(View.java:22285) 
                      at android.os.Handler.handleCallback(Handler.java:751) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:154) 
                      at android.app.ActivityThread.main(ActivityThread.java:6123) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 
09-02 23:47:58.688 19704-19704/company.app W/SQLiteAssetHelper: could not open database app .db - unknown error (code 14): Could not open database 
09-02 23:47:58.689 19704-19704/company.app D/AndroidRuntime: Shutting down VM 
09-02 23:47:58.689 19704-19704/company.app E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: company.app , PID: 19704 
                     java.lang.IllegalStateException: Could not execute method for android:onClick 
                      at android.view.View$DeclaredOnClickListener.onClick(View.java:4700) 
                      at android.view.View.performClick(View.java:5612) 
                      at android.view.View$PerformClick.run(View.java:22285) 
                      at android.os.Handler.handleCallback(Handler.java:751) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:154) 
                      at android.app.ActivityThread.main(ActivityThread.java:6123) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 
                     Caused by: java.lang.reflect.InvocationTargetException 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at android.view.View$DeclaredOnClickListener.onClick(View.java:4695) 
                      at android.view.View.performClick(View.java:5612)  
                      at android.view.View$PerformClick.run(View.java:22285)  
                      at android.os.Handler.handleCallback(Handler.java:751)  
                      at android.os.Handler.dispatchMessage(Handler.java:95)  
                      at android.os.Looper.loop(Looper.java:154)  
                      at android.app.ActivityThread.main(ActivityThread.java:6123)  
                      at java.lang.reflect.Method.invoke(Native Method)  
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)  
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)  
                     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.database.sqlite.SQLiteDatabase.getVersion()' on a null object reference 
                      at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:178) 
                      at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:254) 
                      at company.app .MyDatabase.randomiseItBro(MyDatabase.java:33) 
                      at company.app .MainActivity.randomise(MainActivity.java:55) 
                      at java.lang.reflect.Method.invoke(Native Method)  
                      at android.view.View$DeclaredOnClickListener.onClick(View.java:4695)  
                      at android.view.View.performClick(View.java:5612)  
                      at android.view.View$PerformClick.run(View.java:22285)  
                      at android.os.Handler.handleCallback(Handler.java:751)  
                      at android.os.Handler.dispatchMessage(Handler.java:95)  
                      at android.os.Looper.loop(Looper.java:154)  
                      at android.app.ActivityThread.main(ActivityThread.java:6123)  
                      at java.lang.reflect.Method.invoke(Native Method)  
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)  
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)  

回答

1

當您單擊「新建數據庫」工具欄按鈕,創建一個SQLite數據庫文件。當你創建表格和東西時,然後單擊「寫入更改」工具欄按鈕,更新該數據庫文件。一旦你擁有了你想要的數據庫文件,那就是你在中包含的文件,供SQLiteAssetHelper使用。

用於SQLite的DB瀏覽器的Linux版本默認情況下不會將文件擴展名應用於該文件。您將在創建數據庫文件時自己添加.db,或者在創建數據庫文件後重命名它。

+0

我已經試過這個,但仍然會出錯。我的研究使我相信我的數據庫文件格式不正確;你是說這個文件是以「CREATE TABLE」的形式出現的? –

+0

@TomJames:不需要。如果按照我列出的說明進行操作,您將獲得一個SQLite數據庫文件,SQLite客戶端除了DB Browser for SQLite(例如'sqlite3'命令行工具)以外,還可以使用它。關於你的堆棧跟蹤,完全卸載應用程序,然後嘗試重新安裝並運行它。另外,FWIW,你的'applicationId'和數據庫文件名似乎都有空格,但我的猜測是,這是你如何將材料發佈到你的問題的一個人爲因素。 – CommonsWare

+0

我現在明白了,你已經解決了我的問題。感謝您的耐心;是的,那只是我匆匆粘貼申請和公司名稱而已。 –

0

您可以創建就像一個myfunc.js文件或index.html文件,但是這個人是mydb.sql與代碼。普通的Word文件前:

CREATE DATABASE activedb; CREATE TABLE table_name ( column1 datatype, column2 datatype, column3 datatype, .... );

那麼你可以使用database_name < mydb.sql 我認爲這是你正在嘗試做的。我不確定。

0

如果你在你的應用程序正確地照顧到從資產數據庫傳輸到您的數據庫目錄,那麼你很可能缺少以下兩個條件之一:

  1. 主鍵需要被命名_id
  2. 數據庫需要,你需要一個瞭解創建特定的表:CREATE TABLE android_metadata (_id INTEGER PRIMARY KEY, locale TEXT)
相關問題