当ACTION_OPEN_DOCUMENT_TREE选择文件夹中打开一个SQLite数据库 [英] open a sqlite database when choosing folder with ACTION_OPEN_DOCUMENT_TREE
问题描述
我有一个已经存在的SQLite数据库文件夹中的 /sdcard/myfolder/db/mydb.db
。
我的应用程序显示一个对话框,选择一个文件夹:
意向意图=新的意图(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(意向,42);
对话框弹出,我可以选择的文件夹:
我选择的文件夹/ SD卡/ MyFolder中/ DB /和preSS选择/ OK。
我的onActivityResult被调用。我经历的所有文件,如果该文件是我的mydb.db然后我尝试打开与SQLiteDatabase.openDatabase SQLite数据库();我得到一个错误(见下文)
我的问题的猜测: 这是行不通的,因为预期的openDatabase的完整路径分贝像/sdcard/myfolder/db/mydb.db
保护无效onActivityResult(INT申请code,INT结果code,意图数据){
//如果(要求code == REQUEST_QUICKLIST){
如果(结果code == Activity.RESULT_OK){
如果(要求code == 42){
// TreeDialog的选择Installdirectory
乌里treeUri = data.getData();
DocumentFile pickedDir = DocumentFile.fromTreeUri(这一点,treeUri);
对于(DocumentFile文件:pickedDir.listFiles()){
如果(file.getName()。等于(mydb.db)){
SQLiteDatabase sqliteTest = SQLiteDatabase.openDatabase(file.getUri()getPath(),空,SQLiteDatabase.OPEN_READONLY。);
}
Log.d(调试文件,找到的文件+ file.getName()+,大小+ file.length()++ file.getParentFile()的getName());
}
file.getUri()getPath()
的值: /树/主:MyFolder中/数据库/文件/主:MyFolder中/ DB / mydb.db
如何打开SQLite数据库?
堆栈跟踪:
java.lang.RuntimeException的:不提供结果ResultInfo {谁= NULL,请求= 42,结果= -1,数据=意向{DAT =内容://com.android。 externalstorage.documents /树/主:MyFolder中/ DB FLG = 0xc3}}到活动{mycompany.browser / mycompany.browser.browser}:android.database.sqlite.SQLiteCantOpenDatabaseException:未知错误(code 14):无法打开数据库
在android.app.ActivityThread.deliverResults(ActivityThread.java:3976)
在android.app.ActivityThread.handleSendResult(ActivityThread.java:4019)
在android.app.ActivityThread.access $ 1400(ActivityThread.java:172)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1471)
在android.os.Handler.dispatchMessage(Handler.java:102)
在android.os.Looper.loop(Looper.java:145)
在android.app.ActivityThread.main(ActivityThread.java:5834)
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1388)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
致:android.database.sqlite.SQLiteCantOpenDatabaseException:未知错误(code 14):无法打开数据库
在android.database.sqlite.SQLiteConnection.nativeOpen(本机方法)
在android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:318)
在android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:228)
在android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:512)
在android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:206)
在android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:178)
在android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:891)
在android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:861)
在android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:696)
在android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:671)
在mycompany.browser.browser.onActivityResult(browser.java:1533)
在android.app.Activity.dispatchActivityResult(Activity.java:6475)
在android.app.ActivityThread.deliverResults(ActivityThread.java:3972)
我没有测试过,由于棒棒糖没有可用的设备,此时但这应该工作,让我知道如果任何问题!
如果(file.getName()。等于(mydb.db)){
开放的我们的uri = file.getUri();
乌里docUri = DocumentsContract.buildDocumentUriUsingTree(URI,
DocumentsContract.getTreeDocumentId(URI));
字符串路径= ASFUriHelper.getPath(这一点,docUri);
SQLiteDatabase sqliteTest = SQLiteDatabase.openDatabase(路径,空,
SQLiteDatabase.OPEN_READONLY);
}
ASFUriHelper.getPath()方法的中间方法的要点可以在这里找到: ASFUriHelper .getPath()
I have an already existing sqlite database in a folder /sdcard/myfolder/db/mydb.db
.
My app shows a dialog to choose a folder:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, 42);
The Dialog pops up and I can choose the folder:
I choose the folder /sdcard/myfolder/db/ and press choose/ok.
My onActivityResult gets called. I go through all files and if the file is my "mydb.db" then I try to open the sqlite database with SQLiteDatabase.openDatabase(); and I get an error (see below)
My guess of the problem: This will not work, because the openDatabase expects the full path to the db like /sdcard/myfolder/db/mydb.db
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// if (requestCode == REQUEST_QUICKLIST) {
if (resultCode == Activity.RESULT_OK) {
if(requestCode==42){
// TreeDialog for choosing the Installdirectory
Uri treeUri = data.getData();
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
for (DocumentFile file : pickedDir.listFiles()) {
if(file.getName().equals("mydb.db")){
SQLiteDatabase sqliteTest= SQLiteDatabase.openDatabase(file.getUri().getPath(), null, SQLiteDatabase.OPEN_READONLY);
}
Log.d("DEBUG FILE", "Found file " + file.getName() + " with size " + file.length() + " " + file.getParentFile().getName());
}
file.getUri().getPath()
has the value : /tree/primary:myfolder/db/document/primary:myfolder/db/mydb.db
How to open the sqlite Database ?
Stacktrace:
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=42, result=-1, data=Intent { dat=content://com.android.externalstorage.documents/tree/primary:myfolder/db flg=0xc3 }} to activity {mycompany.browser/mycompany.browser.browser}: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
at android.app.ActivityThread.deliverResults(ActivityThread.java:3976)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4019)
at android.app.ActivityThread.access$1400(ActivityThread.java:172)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1471)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5834)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
Caused by: 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:318)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:228)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:512)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:206)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:178)
at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:891)
at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:861)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:696)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:671)
at mycompany.browser.browser.onActivityResult(browser.java:1533)
at android.app.Activity.dispatchActivityResult(Activity.java:6475)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3972)
I haven't tested, due to Lollipop device not available at this time but this should work, let me know if any issues!
if(file.getName().equals("mydb.db")){
Uri uri = file.getUri();
Uri docUri = DocumentsContract.buildDocumentUriUsingTree(uri,
DocumentsContract.getTreeDocumentId(uri));
String path = ASFUriHelper.getPath(this, docUri);
SQLiteDatabase sqliteTest= SQLiteDatabase.openDatabase(path, null,
SQLiteDatabase.OPEN_READONLY);
}
The gist of ASFUriHelper.getPath() method with intermediate methods can be found here: ASFUriHelper.getPath()
这篇关于当ACTION_OPEN_DOCUMENT_TREE选择文件夹中打开一个SQLite数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!