Android net.sqlcipher.database.SQLiteException:错误代码14:无法打开数据库

Android net.sqlcipher.database.SQLiteException:错误代码14:无法打开数据库,android,sqlite,sqlcipher,Android,Sqlite,Sqlcipher,我正在尝试使用SQLCipher创建本地SQLite数据库 以下是我创建/写入数据库的方法: class DatabaseUtils { val storagePath = Environment.getExternalStorageDirectory() fun storeTransaction(context: Context, password: String, transaction: Transaction) { SQLiteDatabase.loadLibs(conte

我正在尝试使用SQLCipher创建本地SQLite数据库

以下是我创建/写入数据库的方法:

class DatabaseUtils {

val storagePath = Environment.getExternalStorageDirectory()


fun storeTransaction(context: Context, password: String, transaction: Transaction) {
    SQLiteDatabase.loadLibs(context)


    val databaseFile: File = context.getDatabasePath("$storagePath/Test.db")

    if (!databaseFile.exists()) {
        databaseFile.mkdirs()
    }



        val database: SQLiteDatabase = SQLiteDatabase.openOrCreateDatabase(databaseFile, password, null)

        database.execSQL("CREATE TABLE IF NOT EXISTS Transactions(cardNumber INTEGER)")

        database.execSQL("INSERT INTO Transactions(cardNumber) VALUES(${transaction.cardNumber})")

        database.close()

    }
}
我已经宣布

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
该目录已创建,但调用openOrCreateDatabase时仍会出现上述错误。我缺少什么?

问题1:
SQLiteDatabase
需要一个文件,但您将其设置为目录:

if (!databaseFile.exists()) {
    databaseFile.mkdirs()
}
删除这三行,然后删除设备上的目录。或者,不要将
databaseFile
传递给
SQLiteDatabase.openOrCreateDatabase()
,而是传递指向目录内文件的
文件
对象

问题#2:您正试图写入外部存储,但您没有权限<代码>ActivityCompat.requestPermissions()不是阻止调用。当它返回时,您尚未持有权限。然而,在代码中,您正在尝试使用尚未持有的权限

除此之外:

  • 不要使用字符串连接来组装SQL语句,因为您正在进行第二次
    execSQL()
    调用。使用
    作为占位符,并将参数作为第二个参数传递给
    execSQL()
    。这对于字符串尤其重要,因为SQLCipher+SQLite将为您正确地转义特殊字符和内容

  • 您正在主应用程序线程上执行磁盘I/O,这将导致在执行I/O时应用程序的UI冻结


非常感谢您的全面回答。
if (!databaseFile.exists()) {
    databaseFile.mkdirs()
}