Ipad 是一款应用程序';从应用商店更新应用时,是否删除了应用的核心数据数据库?

Ipad 是一款应用程序';从应用商店更新应用时,是否删除了应用的核心数据数据库?,ipad,core-data,ios6,Ipad,Core Data,Ios6,我在app Store上有一个应用程序,现在已经是第二个版本了。该应用程序使用核心数据存储我不希望在安装应用程序升级时丢失的信息 我的问题是,如果用户的iPad上安装了1.0版,并且其核心数据库中存储了数据,那么在下载并安装1.1版更新时,该数据库是否会被删除?这完全取决于您。设置核心数据堆栈时,您可以将NSPersistentStoreCoordinator指向应用程序可写文件夹中您想要的特定文件。您放置该文件的位置决定了它是否在应用程序更新期间被迁移 一个常见的选择是将数据库文件粘贴到用户的

我在app Store上有一个应用程序,现在已经是第二个版本了。该应用程序使用核心数据存储我不希望在安装应用程序升级时丢失的信息


我的问题是,如果用户的iPad上安装了1.0版,并且其核心数据库中存储了数据,那么在下载并安装1.1版更新时,该数据库是否会被删除?

这完全取决于您。设置核心数据堆栈时,您可以将NSPersistentStoreCoordinator指向应用程序可写文件夹中您想要的特定文件。您放置该文件的位置决定了它是否在应用程序更新期间被迁移

一个常见的选择是将数据库文件粘贴到用户的Documents目录中,这将导致iOS在安装应用程序更新时将其复制到应用程序中。然后,在启动时,您负责处理您认为合适的数据库(更新其中的数据,迁移您的模式,等等)。将文件放在其他位置(例如,临时目录中)可能会导致更新过程中丢失文件


有关详细信息,请参阅和。

除非您在委托持久存储方法中取消了Apple代码的注释或自己编写了代码,否则不应删除它。如果您没有删除用户数据库,并且没有编写迁移代码,则应用程序将崩溃(如果您对模型进行了更改)。轻量级迁移非常简单,易于实现。您可以为选项传入字典(见下文)。
您在数据模型中更改了什么

 NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES],     NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES],     NSInferMappingModelAutomaticallyOption, nil];

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                  configuration:nil
                                                      URL:storeUrl
                                                      options:options
                                                      error:&error]) {

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

这与CoreData完全无关,但我认为我应该与大家分享

我有一个应用程序可以下载额外的资源,将它们保存到文档中的子文件夹中,并将它们的路径存储在.plist文件中(也在/Documents中)


因为我存储了完整的路径,并在以后使用它,当用户更新应用程序时,该路径将不再有效(应用程序沙盒的路径中有一个“随机字母/数字”部分,,当您更新应用程序时,该部分将发生更改)

谢谢。我可以澄清一下吗?我的行NSURL*storeURL=[[self-applicationdocumentsddirectory]urlby-byappendingpathcomponent:@“Data.sqlite”];表示数据库位于Documents目录中,因此在更新期间不会删除?我从进一步阅读中了解到,只有在模型没有改变的情况下,才会出现这种情况。如果模型已更改,那么数据库肯定会被删除,无论它位于何处。对吗?不太对。您的数据库位于Documents目录中,因此不会通过应用程序升级删除。如果您在升级过程中更改了模型,您的数据库仍不会被删除-您有责任适当地迁移该数据库中的数据。有关详细信息,请参阅。@Tim由于iOS存储指导原则,我必须将“不备份属性”添加到存储在documents目录中的数据库文件中。因此,是否存在系统在icloud上进行备份后删除我的数据库文件的危险,或者是否有可能丢失我的数据库(数据库文件)?如果是,我应该怎么做才能避免这种情况?@ViruMax如果您将一个文件标记为不需要备份,系统将不会从您的下面删除它;它不会将文件复制到iCloud。由于用户操作(例如,如果用户删除了您的应用程序),您可能会丢失文件;然而,在大多数情况下,你不应该做任何特殊的事情来处理这些情况。不,如果你不尝试删除它,或者找一个不同的地方。当更新发生时,应用程序沙盒中的数据文件只是保留在原位。在最新更新(现在可在应用程序商店上获得)中,模型没有更改,因此从您所说的情况来看,用户不会有问题?不过,我正在开发下一个版本,在这个版本中,我只是向现有实体添加了一个新属性。这就是我需要管理的-对吗?对-如果模型没有更改,您的数据库将在升级后继续工作。添加属性在所谓的“轻量级”迁移下是合法的更改,但您需要更改一两行代码才能启用该功能。如果您所做的更改Xcode无法推断其映射,例如在没有默认值的情况下创建可选属性,则需要进行更多的自定义数据迁移。Richard,回答回答回答的第一部分:是的,如果您的模型没有更改,则不需要迁移。由于您现在正在更改一个属性,因此需要添加我在前面的响应中提供的代码。另外,请确保对模型进行版本设置&不要对现有模型进行任何更改-从文件浏览器中单击model.xcdatamodeld,然后从工具栏中选择“编辑器”>“添加新版本模型”&以当前模型为基础。现在单击xcdatamodeld&从属性单击文件检查器&将模型设置为新版本。这一点很好!升级过程基本上会安装一个新的干净的应用程序副本,然后将所有相关文件(包括文档文件夹中的文件)复制到新安装的应用程序。然后删除应用程序的旧副本。这会更改这些文件的绝对路径,因此您应该(几乎)始终使用相对于应用程序根的路径。