如何导入SQL数据库文件
问题描述:
我正在关注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)
答
当您单击“新建数据库”工具栏按钮,创建一个SQLite数据库文件。当你创建表格和东西时,然后单击“写入更改”工具栏按钮,更新该数据库文件。一旦你拥有了你想要的数据库文件,那就是你在中包含的文件,供SQLiteAssetHelper
使用。
用于SQLite的DB浏览器的Linux版本默认情况下不会将文件扩展名应用于该文件。您将在创建数据库文件时自己添加.db
,或者在创建数据库文件后重命名它。
答
您可以创建就像一个myfunc.js文件或index.html文件,但是这个人是mydb.sql与代码。普通的Word文件前:
CREATE DATABASE activedb; CREATE TABLE table_name ( column1 datatype, column2 datatype, column3 datatype, .... );
那么你可以使用database_name < mydb.sql
我认为这是你正在尝试做的。我不确定。
答
如果你在你的应用程序正确地照顾到从资产数据库传输到您的数据库目录,那么你很可能缺少以下两个条件之一:
- 主键需要被命名
_id
- 数据库需要,你需要一个了解创建特定的表:
CREATE TABLE android_metadata (_id INTEGER PRIMARY KEY, locale TEXT)
我已经试过这个,但仍然会出错。我的研究使我相信我的数据库文件格式不正确;你是说这个文件是以“CREATE TABLE”的形式出现的? –
@TomJames:不需要。如果按照我列出的说明进行操作,您将获得一个SQLite数据库文件,SQLite客户端除了DB Browser for SQLite(例如'sqlite3'命令行工具)以外,还可以使用它。关于你的堆栈跟踪,完全卸载应用程序,然后尝试重新安装并运行它。另外,FWIW,你的'applicationId'和数据库文件名似乎都有空格,但我的猜测是,这是你如何将材料发布到你的问题的一个人为因素。 – CommonsWare
我现在明白了,你已经解决了我的问题。感谢您的耐心;是的,那只是我匆匆粘贴申请和公司名称而已。 –