Android 从Intent.ACTION\u CREATE\u文档Uri创建数据库

Android 从Intent.ACTION\u CREATE\u文档Uri创建数据库,android,android-intent,android-sqlite,android-external-storage,Android,Android Intent,Android Sqlite,Android External Storage,事实上,我是从那里提出这个问题的,因为我无法在那里发表评论。我使用answer尝试了一些东西,但实现依赖于从scatch构建文件路径。我想知道是否有方法以及如何从ACTION\u CREATE\u文档返回的Uri构建数据库 到目前为止,我已经能够从onActivityResult获取Uri,但是将其传递给数据库创建者会导致错误 下面是我的代码示例 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Inte

事实上,我是从那里提出这个问题的,因为我无法在那里发表评论。我使用answer尝试了一些东西,但实现依赖于从scatch构建文件路径。我想知道是否有方法以及如何从ACTION\u CREATE\u文档返回的Uri构建数据库

到目前为止,我已经能够从onActivityResult获取Uri,但是将其传递给数据库创建者会导致错误

下面是我的代码示例

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (requestCode == REQUEST_CREATE_FILE && resultCode == Activity.RESULT_OK){
        uri = data?.data

        val backupTask = BackupTask(this, null, uri!!.path, getFileName(uri!!))
        backupTask.execute()
    }
    super.onActivityResult(requestCode, resultCode, data)
}
当我尝试创建/访问数据库时,运行应用程序最终崩溃

Failed to open database '/document/home:file_backup.db (1)'.
    android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database

您需要将数据库复制到您控制的某个文件中(例如,在
getFilesDir()
中)。您可以使用
ContentResolver
openInputStream()
Uri
标识的内容上获取
InputStream
。然后,使用该
InputStream
作为数据源复制到一些
FileOutputStream
。然后,您可以将该文件与
SQLiteDatabase
、Room等一起使用。谢谢。我想从主数据库中删除/添加一些列和/或行,因此理想情况下我想创建一个新的数据库,然后写入新行/列。我认为简单地复制数据库不是我想要的。复制它就是创建一个新的数据库。然后,您可以使用
altertable
语句添加列,并使用insert操作添加行。我会尽快给你回复!感谢您的投入,@commonware。我调整了以前的实现。我使用创建数据库的常规方法创建了一个新的数据库(根据您的建议,在我控制的目录中创建一个数据库),然后用主数据库中的值填充它,然后获得一个文件句柄,然后使用您建议的内容解析程序技术将其内容复制到Uri。然后删除了新的数据库。当我复制Uri文件并在PC数据库工具中检查其内容时,它会显示所需的内容。再次非常感谢。
    BackUpTask.doInBackground {
       //i've eliminated unneccessary AsyncTask codes here
       val customContext = DBContext(filePath, contextWeakReference.get())
       val dbh = DBH1(customContext, dbFileName)
    }
class DBContext(private val dbFilePath: String, base: Context?) : ContextWrapper(base){
       override fun getDatabasePath(name: String?): File {
           // **is there a way i can use the uri here?? instead of name?**
           val result = File(name)
           return result
       }

       override fun openOrCreateDatabase(name: String?, mode: Int, factory: SQLiteDatabase.CursorFactory?, errorHandler: DatabaseErrorHandler?): SQLiteDatabase {
           return openOrCreateDatabase(name, mode, factory)
       }

       override fun openOrCreateDatabase(name: String?, mode: Int, factory: SQLiteDatabase.CursorFactory?): SQLiteDatabase {
           val result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(dbFilePath), null)
           return result
       }
   }
Failed to open database '/document/home:file_backup.db (1)'.
    android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database