如何在gradle构建脚本中预生成sqlite数据库

时间:2017-11-02 18:01:04

标签: android sql database sqlite gradle

我的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做同样的事情。

1 个答案:

答案 0 :(得分: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 EXISTSINSERT OR IGNORE INTO intu init脚本)

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