教程:初始化可写的 SQLite 数据库

教程:初始化可写的 SQLite 数据库

使用 SQLite 可能具有挑战性,但 Corona 开发人员遇到的一个特定问题是将预先存在的数据库放入可以读取插入/更新数据的位置。

问题源于这样一个事实:当您为 iOS 创建应用程序包或为 Android 创建 APK 文件时,它是一个自包含的“文件夹”,其中包含安装到设备的文件。这恰好是只读的,因此您无法更新其中包含的数据库。此应用程序包在代码中被有效地引用为 system.ResourceDirectory

除了 system.ResourceDirectory 之外,您的应用程序还有三个您可以写入文件的文件夹,包括更新这些文件夹中的数据库。它们是 system.DocumentsDirectorysystem.CachesDirectorysystem.TemporaryDirectory。对于您计划更新的数据库,这些文件夹的逻辑位置是 system.DocumentsDirectory。为什么?因为与“缓存”和“临时”文件夹不同,此文件夹是一个持久文件夹,只要应用程序仍然安装在设备上,它就会存在。

初始化数据库

当用户首次安装您的应用程序时,system.DocumentsDirectory 文件夹基本上是空的。如果您的应用程序需要访问初始信息的数据库,您首先需要将该数据库从只读空间 (system.ResourceDirectory) 移动到“documents”文件夹,在该文件夹中可以插入/更新记录。如果它是一个非常简单的数据库,您实际上可以使用 Corona 的 sqlite3.* 调用在 system.DocumentsDirectory 中创建一个全新的数据库,然后插入您的记录。但是,对于具有多个表和大量记录的更复杂的数据库,这个概念变得更加困难和不实用。因此,更简单的方法是一次性复制整个预先存在的数据库。

考虑以下名为 copyDBto.lua 的模块

在模块的主函数 (copyDatabaseTo()) 中,您传入数据库的名称,该名称被假定为您应用程序捆绑包中的现有数据库文件 (system.ResourceDirectory)。此外,您还传入一个包含 filenamebaseDir 的表格,您希望将数据库移动到该位置,在本例中为 system.DocumentsDirectory,如上所述。

假设没有错误,这将把整个数据库从您的资源捆绑包复制到您指定为 filename 的可写文件夹。当然,此操作只应在应用程序的**首次**运行时发生,以便数据库不会每次都被替换/覆盖。

考虑在 main.lua 中对以上 2 行进行更彻底的实现

在第 2 行,我们 require() copyDBto.lua 模块。在第 4 和 5 行,我们设置数据库文件的名称和目标位置,并在第 8 行,我们为其创建内部路径引用。

第 10-16 行检查数据库是否已存在于您期望的位置。如果不存在(首次运行),我们会在第 12 行调用该函数来复制数据库。之后,我们像往常一样打开数据库并处理它——在此示例中,这包括一个在用户退出应用程序时关闭数据库的函数,以及一个测试 for 循环来显示数据库中的一些数据。

结论

如您所见,创建一个预先存在且预先填充的数据库非常容易,将其捆绑在您的应用程序资源中,并快速将其复制到可写文件夹。请注意,此功能同样适用于文本文件和 JSON 文件,它们也可用于跟踪/存储应用程序中的持久数据,如高分、设置等。


Rob Miracle
[email protected]

Rob 是 Corona Labs 的开发者关系经理。除了热衷于帮助其他开发者使用 Corona 制作出色的游戏外,他还喜欢在业余时间制作游戏。Rob 从 1979 年开始编写游戏代码,从个人电脑到大型机都有涉猎。他在游戏行业拥有超过 16 年的专业经验。

1 条评论
  • Ed Maurina
    发布于 09:57,5 月 21 日

    好文章,Rob。这应该有助于为那些最近一直在与数据库问题和 R/W 访问作斗争的人们澄清问题,并为未来遇到同样难题的开发者解答疑问。