【问题标题】:How to pregenerate sqlite database in gradle build script如何在 gradle 构建脚本中预生成 sqlite 数据库
【发布时间】:2017-11-02 18:01:04
【问题描述】:

我的 Android 应用程序在 sqlite 数据库中有一些硬编码数据。 如何预生成 数据库文件在 gradle脚本例如来自包含 sql 命令 的文本文件(或者可能两个,第二个将包含创建 android 特定表 android_metadata)?

我希望该文件将存储在 assets 文件夹中,并在应用程序初始化期间复制到适当的(内部数据库)文件夹中。例如。喜欢这里:

How to use my own sqlite database?

或

What is a Full Android Database Helper class for an existing SQLite database?

我知道我可以在 db 初始化期间运行 sql 命令,但我不想打扰每个设备 cpu 做同样的事情。

【问题讨论】:

  • 您可以在您的开发机器上安装sqlite3 二进制文件并编写一个Gradle 任务来使用它来运行您的SQL 语句并创建您的数据库。或者,您可以找到一个与 SQLite 接口的普通 Java 库,并将其用作自定义 Gradle 插件的一部分。

标签: android sql database sqlite gradle


【解决方案1】:

好的,自己找吧:)

在您应用的build.gradle 中:

...
configurations {
    driver
}

dependencies {
    ...
    driver 'org.xerial:sqlite-jdbc:3.20.1'
    ...
}

URLClassLoader loader = GroovyObject.class.classLoader
configurations.driver.each {File file -> loader.addURL(file.toURI().toURL())}

task createDB << {
    ext.loadScript = { sql, file ->
        println("Applying " + file)
        String[] sqlcmds = file.text.split(";")
        sqlcmds.collect{it.trim()}.findAll{!it.isEmpty() && !it.startsWith("--")}.each{
            try {
                sql.execute(it)
            } catch(java.sql.SQLException e) {
                System.err << "Invalid SQL statement: " + it
                e.printStackTrace(System.err)
                throw.e
            }
        }
    }

    def sql = groovy.sql.Sql.newInstance('jdbc:sqlite:path/to/asset/folder/dbfile','','','org.sqlite.JDBC')
    new File("path/to/sql/init/files").eachFileMatch(~/.*\.sql/) {loadScript(sql, it)}
    sql.close()
}
preBuild.dependsOn createDB

别忘了添加android特定的创建sql脚本:

CREATE TABLE IF NOT EXISTS "android_metadata" ("locale" TEXT DEFAULT 'en_US');
INSERT OR REPLACE INTO "android_metadata" (ROWID, "locale") VALUES ((SELECT ROWID FROM "android_metadata" WHERE "locale" = 'en_US'), 'en_US');

您还必须处理娱乐(例如,在创建 db 文件之前删除它,或者放入安全的 sql 语句,如 CREATE TABLE IF NOT EXISTS 或 INSERT OR IGNORE INTO intu init 脚本)

回答了如何在应用程序中加载它,例如这里: Copy SQLite database from assets folder

【讨论】:

    猜你喜欢
    • 2015-05-04
    • 2011-09-19
    • 2015-04-19
    • 2019-04-30
    • 1970-01-01
    • 2018-03-30
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多