我需要在我的Android应用中包含现有的SQLiteDatabase
,我还希望能够下载并安装新的数据库。我做了一些研究,我的第一个工作解决方案是from here。我不喜欢这个解决方案,首先,它假设数据库总是处于固定的路径和其他奇怪的地方。
因此,我没有将现有的数据库文件放在资产中,而是将数据库导出到SQL文件中,然后将其读入,然后在我onCreate()
的{{1}}方法中,我调用了带有文件数据的打开SQLiteOpenHelper
的新方法updateDatabase
。
我遇到了一些问题,我认为我已经解决了,但我确信我没有想到所有问题,这些问题是:
调用DataInputStream
的{{1}}方法时,数据库已创建,已打开,SQLiteOpenHelper
为onCreate
。因此,如果导入的sql文件包含inTransaction()
,则抛出异常,如果sql String包含创建true
的语句,则会发生另一个异常。因此,我添加了使用BEGIN TRANSACTION
查找这些关键字的简单搜索,并将'android_metadata'
String.contains()
设置为boolean
以避免执行它们。所以问题是,是否有更好的SQL类或方法来过滤它,甚至是更好的正则表达式方法?
在SQL文件中出现意外换行的类似问题。我使用doExecute
阅读文件并查找换行符,我只需在该行上使用false
,然后检查readLine()
。这对我的输入文件设置了一些约束,就像在一行上没有多个语句一样。那么,有没有更好的方法从文件中预处理SQL?
以下是我从String.trim()
资源或下载中获得endsWith(";")
后用于创建数据库的代码:
DataInputStream
答案 0 :(得分:1)
不想让你早早发现这些雄心勃勃和优雅的实施,但如果你已经制作了数据库并使用数据库浏览器进行了检查,那么你是否考虑过SQLite Asset Helper?如果你的主要问题是被迫使用资产文件夹,这个方法lib
让你使用任何指定目录中的文件。此外,它允许处理原始.db
文件。值得一试。