如何使用 sqldelight 读取位于资产中的 db 文件 - Android

Posted

技术标签:

【中文标题】如何使用 sqldelight 读取位于资产中的 db 文件 - Android【英文标题】:How to read the db file located in assets using sqldelight - Android 【发布时间】:2020-06-14 05:39:33 【问题描述】:

我有大量的数据库,我只需要在安装应用程序后创建,这就是我将数据库文件放在资产文件夹中的原因,但我不确定如何使用 SQLDELIGHT 从中读取,有什么想法吗?

【问题讨论】:

你找到解决办法了吗? 【参考方案1】:

是的,这是可能的。

在创建驱动程序实现之前,在此代码上方:

val driver: SqlDriver = androidSqliteDriver (Database.Schema, context, "test.db")

您的预填充数据库必须以指定的名称(此处为“test.db”)放入 Android 存储数据库的目录中:

// 1. get the database file from the application context obtained in the DatabaseDriverFactory constructor
val database = context.getDatabasePath("test.db")

// 2. check the database file (in first launch the app it does not exist yet)
if (!database.exists()) 
    
    // 3. copy your pre-populated database from resources into the Android database directory
    val inputStream = context.assets.open("dbFileName")
    val outputStream = FileOutputStream(database.absolutePath)
    
    inputStream.use  input: InputStream ->
        outputStream.use  output: FileOutputStream ->
            input.copyTo(output)
        
    


// 4. create the driver
val driver: SqlDriver = AndroidSqliteDriver(Database.Schema, context, "test.db")

请注意:

    放置在assets中的资源可能会被Android强行压缩(我 没有检查,因为我的项目是在 Kotlin Multiplatform Mobile 上 我从共享的 moko 资源中读取了数据库文件)。其他 人们建议将资产中的数据库文件名扩展为 不可压缩(例如 .pgn)。 虽然 SQLDelight 不应该尝试 每次按照 .sq 文件中的说明创建数据库, 它尝试...我踩到了这个耙子。补充您的 SQL 语句 在 .sq 文件中使用 IF NOT EXISTS 创建(表、索引等) 说明。

【讨论】:

以上是关于如何使用 sqldelight 读取位于资产中的 db 文件 - Android的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Kotlin 从 android 中的资产中读取 json 文件?

为啥我无法加载位于资产目录中的图像?

如何显示从资产目录中的文本文件中读取的“®”?

如何在 Kotlin 协程中使用 Sqldelight

SQLDelight:如何动态创建表?

Flutter - 从资产中读取文本文件