我的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做同样的事情。
答案 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 EXISTS
或INSERT OR IGNORE INTO
intu init脚本)
如何在应用程序中加载它,例如这里: Copy SQLite database from assets folder