0

我正在一个项目中更新数据库,其中 mainBundle 中的数据库需要更新。正如我们已经知道 mainbundle 中的文件是只读的,我将 mainBundle 中的数据库复制到文档目录以进行更新。更新后,我想将文档目录中的该文件替换为 mainBundle 中的文件。谁能告诉我如何解决这个问题。提前致谢

4

2 回答 2

1

那是做不到的。因为您无法更新任何捆绑文件。不知何故,如果你这样做,你的构建将在下次运行时显示无效的二进制消息。

顺便说一句,为什么你需要从你的主包更新数据库?您的 mainbundle 数据库文件是原始数据库的副本,应将其复制到文档目录中以进行修改。

更新

对于即使在重新启动应用程序后仍希望保留记录的情况,这就是我们使用数据库的原因。为了解决您的问题,请执行以下操作:

NSString *docDirPath = [(NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)) objectAtIndex:0];

这将返回您的文档目录的路径。之后将您的数据库复制到此路径,如下所示:

NSString *dbPath = [strDocPath stringByAppendingPathComponent:@"myDb.sqlite"];
if (![[NSFileManager defaultManager] fileExistsAtPath:dbPath]) {
    [[NSFileManager defaultManager] copyItemAtPath:[[NSBundle mainBundle] pathForResource:@"mydb" ofType:@"sqlite"] toPath:dbPath error:nil];
}

这将检查路径中是否已经存在数据库,而不是用空数据库替换它,如果数据库不存在(即您的第一次运行应用程序),它将复制。

现在您可以访问dbPath以访问文档目录中的数据库,并且即使在重新启动应用程序后也将保持不变。

不要忘记检查您的数据库是否存在,if (![[NSFileManager defaultManager] fileExistsAtPath:dbPath]) {否则您的应用程序将在每次运行时将您的文档目录的数据库替换为原始(空数据库)。

希望这有帮助。

于 2012-05-23T05:33:53.283 回答
0

您的捆绑包是签名副本。如果您尝试更改 Bundle 中的任何资源,其签名将变为无效。因此,您不能将更新的数据库从文档目录复制到 Bundle。您的代码应参考文档目录中的更新副本。

为此,一旦您发现需要更新,请按照以下步骤操作:

  1. 重命名现有文档目录数据库。
  2. 将 Bundle 数据库复制到文档目录。
  3. 使任何一个副本更新一个。
  4. 发布旧副本。
  5. 在任何例外情况下,删除新副本,将旧副本重命名为原始名称。
  6. 不要将您的布尔标志标记为应用程序已成功更新,以便下次它可以进行相同的练习。

希望能帮助到你。

于 2012-05-23T05:40:20.540 回答