更新核心数据存储位置以支持应用程序组

2024-03-29


我在 App Store 中已有一个使用核心数据来保存数据的应用程序。
现在,当 iOS 8 即将发布时,我想为其添加一个小部件,因此我必须使用应用程序组在二进制文件之间共享数据。
但有一个问题 - 我需要更改商店位置以支持所有现有用户的应用程序组。
我编写了以下代码,尝试将商店移动到新路径:

// Returns the persistent store coordinator for the application.
// If the coordinator doesn't already exist, it is created and the application's store added to it.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    NSURL *oldStoreURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    oldStoreURL = [oldStoreURL URLByAppendingPathComponent:@"Schooler.sqlite"];


    NSURL *storeURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.schooler.mycontainer"];
    storeURL = [storeURL URLByAppendingPathComponent:@"Schooler.sqlite"];


    if([[NSFileManager defaultManager] fileExistsAtPath:oldStoreURL.path] == YES && [[NSFileManager defaultManager] fileExistsAtPath:storeURL.path] == NO)
    {
        // Prior today extension - Need to move to new directory
        NSError *error = nil;
        if([[NSFileManager defaultManager] moveItemAtURL:oldStoreURL toURL:storeURL error:&error] == YES)
            NSLog(@"Migrated successfully to new database location.");
        else
            NSLog(@"error: %@",error);
    }

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

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }

    return _persistentStoreCoordinator;
}

输出始终是“已成功迁移到新的数据库位置。”,尽管之前保存在应用程序上的所有数据都已被删除,就好像它创建了一个新数据库而不是仅仅移动它一样。

造成问题的原因是什么?我应该如何修复它?
谢谢。


使用默认选项创建的 Core Data NSSQLiteStoreType 存储实际上是几个文件,如中所述技术问答 1809:iOS 7 和 OS X Mavericks 中 Core Data SQLite 存储的新默认日志模式 https://developer.apple.com/library/ios/qa/qa1809/_index.html#//apple_ref/doc/uid/DTS40014115。尝试搬家时记住这一点很重要outside迁移过程的一部分,并且是问题的根源 - 当您需要移动所有文件时,您正在移动一个文件。但是,不建议在没有文件协调器的情况下将文件单独移到 Core Data 之外。最好使用迁移来代替。

迁移将从源存储中获取数据并将其迁移到新的存储位置,实质上是在新位置复制旧数据。旧数据仍将存在于文件系统上。在您的应用程序中,您应该像现在一样执行迁移,但不要尝试自己将旧数据移动到新位置 - 这就是出现问题的地方。

您可以依靠迁移来为您移动数据,而不是自行移动文件。首先,使用源数据的 URL 将存储添加到持久存储协调器。然后您将执行迁移以将该数据移动到新 URL

NSPersistentStore   *sourceStore        = nil;
NSPersistentStore   *destinationStore   = nil;
NSDictionary        *storeOptions       = @{ NSSQLitePragmasOption : @{ @"journal_mode" :
  @"WAL" } };

// Add the source store
if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:oldStoreURL options:storeOptions error:&error]){
    // Handle the error
} else {
    sourceStore = [coordinator persistentStoreForURL:oldStoreURL];
    if (sourceStore != nil){
        // Perform the migration
        destinationStore = [coordinator migratePersistentStore:sourceStore toURL:storeURL options:storeOptions withType:NSSQLiteStoreType error:&error];
        if (destinationStore == nil){
            // Handle the migration error
        } else {
            // You can now remove the old data at oldStoreURL
            // Note that you should do this using the NSFileCoordinator/NSFilePresenter APIs, and you should remove the other files
            // described in QA1809 as well.
        }
    }
}

迁移完成后,您可以删除旧文件。这里的示例明确指定了 SQLite 日志选项,这是为了确保如果将来更改默认选项,代码仍然可以工作。如果您使用不同的选项,则应该使用这些选项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更新核心数据存储位置以支持应用程序组 的相关文章

  • UISearchBar - ReturnKeyType 不适用于 iOS 8

    我在用UISearchbar在故事板的表视图控制器中 和搜索栏returnKeyType is UIReturnKeySearch 它在 iOS7 上运行良好 但是returnKeyType不适用于 iOS8 在iOS8中 键盘上每次都会出
  • existingObjectWithID 与 NPrivateQueueConcurrencyType 发生死锁

    我遇到了冻结 死锁 NSPrivateQueueConcurrencyType并发类型而不是NSMainQueueConcurrencyType 我的上下文初始化 managedObjectContext NSManagedObjectCo
  • 无法在 Simulator XCode 6.0 中运行应用程序

    从 XCode 5 0 迁移到 XCode 6 0 后 项目无法运行并出现以下错误 An error was encountered while running Domain FBSOpenApplicationErrorDomain Co
  • 强制设置核心数据检查点?

    我编写了一个通过 Core Data 搅动大量数据的应用程序 用户在后台退出应用程序后 我会清理这些数据 由于 WAL 检查点似乎是导致 UI 暂停的主要原因 因此我还想强制使用 WAL 检查点 是的 我知道创建第二个核心数据堆栈 这也将完
  • 使用启动屏幕 (.xib) 会停止缩放

    据我了解 iOS 8 的应用程序应该有一个故事板文件作为启动屏幕而不是图像 我创建了一个非常简单的启动屏幕文件 它具有任意宽度和任意高度 并且有一个纯文本标签 上面写着 占位符 并将其设置为我的启动屏幕 然而 当我尝试在 iPhone 6
  • 在您的应用程序 Swift 代码上启动 Youtube 频道

    我花了几天时间找到从我的应用程序打开 youtube 频道的 Swift 代码 但我根本找不到 有人可以帮助我吗 我需要 Swift 中的代码 Swift 3 和 iOS 10 的更新 好的 下面是如何在 Swift 3 中做到这一点 基本
  • 导入 CoreData 时检查重复项

    我正在使用 RestKit 将数据导入到核心数据存储中 并且需要检查重复项 如果该商品已在商店中 我想用最新的属性更新它 如果它是一个新项目 我想创建它 导入速度很慢 所以我使用了 Instruments 发现导入的最长部分是检查该项目是否
  • 修复核心数据失败

    我的应用程序商店中有一个使用 Core Data 的应用程序 我必须在明天之前发布更新 但是 我在使用 Core Data 时遇到了一些问题 我错误地更改了 Core Data 中的模型 现在我的应用程序崩溃了 我尝试迁移数据 但当我在 i
  • 使用每个实体包含许多图像的核心数据?

    我是 Core Data 的新手 正在开发我的第一个个人 iOS 应用程序 我有一个实体 我们称之为Car 其中有一个缩略图以及与其关联的其他图像库 数据使用同步到在线服务ASIHTTPRequest and JSONKit 该应用程序不需
  • Swift NSSet 和 CoreData

    我正在尝试将目标 C 和 CoreData 应用程序移动到 Swift 和 iOS 但在迭代 NSSet 对象时遇到了困难 Xcode 已生成这些类 class Response NSManagedObject NSManaged var
  • 当我不使用 CoreData 时,为什么我的 iOS 或 OSX 应用程序会出现 CoreData 错误?

    我在构建过程中收到以下错误 API 滥用 尝试在非拥有协调器上序列化存储访问 PSC 0x7fb5ae208890 存储 PSC 0x0 CoreData 为什么我的应用程序中出现 CoreData 错误 我没有使用 CoreData 此消
  • “便捷初始化程序缺少对另一个初始化程序的‘自我’调用”

    我正在尝试将我的代码转换为 iOS 8 项目 我需要一些关于如何修复此警告的解释 Convenience initializer missing a self call to another initializer 在此代码上 instan
  • CoreData 多对多添加错误

    不确定我在这里做错了什么 School has a to many to Student and Student has its inverse 一点测试代码如下 class Student interface School NSManag
  • 构建复杂 NSCompoundPredicate 的最佳方法是什么?

    我需要建立一个NSPredicate有很多数据 例如 在 SQL 中我会执行如下操作 SELECT FROM TRANSACTIONS WHERE CATEGORY IN categoryList AND LOCATION IN locat
  • 来自 Popover 的 UIActionSheet 和 iOS8 GM

    有人在尝试从弹出窗口显示 UIActionSheet 时收到此消息吗 您的应用程序呈现了 UIAlertController 样式的 UIAlertControllerStyleActionSheet 具有此样式的 UIAlertContr
  • 应用程序崩溃 - dyld: 未找到符号: _OBJC_CLASS_$_UITraitCollection

    dyld Symbol not found OBJC CLASS UITraitCollection 代码中我引用 UITraitCollection 的唯一地方是 func loadImages imageName NSString va
  • 将实体添加到核心数据

    我们有一个使用核心数据的应用程序 在下一个版本中 我想向现有实体添加一个新实体 只需添加新的然后从软件中填充它就可以了吗 还是有什么我必须考虑的事情 迁移有几种类型 最简单的是使用推断映射模型的轻量级迁移 这意味着您只需告诉它进行迁移 软件
  • CoreData 和 SwiftUI:环境中的上下文未连接到持久存储协调器

    我正在尝试通过构建一个作业管理应用程序来自学核心数据 我的代码构建良好 应用程序运行正常 直到我尝试将新分配添加到列表中 我收到这个错误Thread 1 EXC BREAKPOINT code 1 subcode 0x1c25719e8 在
  • 保存时出现 iphone 核心数据未解决的错误

    尝试保存时 我从核心数据中收到一条奇怪的错误消息 但问题是错误不可重现 在执行不同任务时 它会在不同时间出现 错误消息 Unresolved error Domain NSCocoaErrorDomain Code 1560 UserInf
  • 主队列上的dispatch_sync 与dispatch_async

    请耐心等待 这需要一些解释 我有一个类似于下面的函数 上下文 aProject 是一个名为 LPProject 的核心数据实体 其数组名为 memberFiles 其中包含另一个名为 LPFile 的核心数据实体的实例 每个 LPFile

随机推荐

  • 使用jquery求div内元素的总和

    我正在对一组用户进行排序 我有 4 个分组 如下所示 显示 2 个 div class groupWrapper div class groupItem div class itemHeader div class first John d
  • 如何在不链接libc.so的情况下访问段寄存器?

    我正在尝试在 Ubuntu 20 10 上使用 NASM 版本 2 15 04 在 64 位程序集中编写一个简单的堆栈金丝雀 执行下面的代码会导致在使用命令进行汇编和链接时出现分段错误nasm felf64 canary asm ld ca
  • Twitter iOS Streaming API:未收到数据

    我正在尝试修改Apple使用Twitter API的示例代码 以便我可以使用流API来过滤推文 我正在尝试实施针对此问题建议的方法 TWRequest 是否适用于 Twitter 流 API https stackoverflow com
  • Twilio:此电话号码无法发送消息

    我现在有一个 Twilio 测试帐户 我获得了一个比利时电话号码 并验证了我自己的手机号码 我正在尝试从分配的 Twilio 号码向我的手机号码发送简单的 SMS 消息 但这不起作用 仪表板显示 此电话号码无法发送消息 但在消息常见问题解答
  • 如何使用 WSDL

    我正在开发 WSDL 应用程序 但实际上我不明白什么是 wsdl 参数以及我将如何处理返回的 XML 例如 https adwords google com api adwords cm v201309 CampaignService ws
  • 如何防止响应式网页上的水平滚动?

    我正在使用 twitter bootstrap 来使我的应用程序具有响应能力 当我将浏览器窗口的宽度缩小到最小尺寸或在移动设备 例如 iPhone 上查看页面时 用户可以水平滚动 水平滚动量很小 但我想将其全部删除 我相信这是由于我包含的
  • 删除R中一组行中的某些行

    假设我有这个数据集 Id Name Price sales Profit Month Category Mode Supplier 1 A 2 0 0 1 X K John 1 A 2 0 0 2 X K John 1 A 2 5 8 3
  • Swift 中设置和读取 Bool 是原子操作吗?

    正如标题所示 很简单 基本上 在这个例子中 我们是否可以获得无效状态 var myBool false Thread 1 while true if randomEvent myBool true Thread 2 while true i
  • 服务器安全和通过 Rest 访问 OrientDB

    我猜这是一个令人尴尬的初学者问题 无论如何 在 OrientDB 文档的 服务器安全 下 我们发现 虽然 OrientDB Server 可以充当常规 Web 服务器 但不建议您将其直接公开到 Internet 或公共网络 相反 始终将 O
  • 在 Java 32 位和 Java 64 位之间切换

    我刚刚发现 如果我使用 64 位 JDK Apache Tomcat 无法作为 Windows 服务运行 因此我在 Windows 上另外安装了 Java 32 位 问题是当我使用 java version 检查 java 版本时 它仍然显
  • 从 wtforms 和flask-sqlalchemy 中的数据库查询中获取选择

    我正在使用 Flask SQLAlchemy 和 WTForms 开发一个 Web 应用程序 我想得到我的选择选择字段通过我的数据库查询 有更多细节 my query my table query with entities My Enti
  • 日志文件的合适大小(以字节为单位)是多少?

    我正在使用蟒蛇logging http docs python org library logging html simple examples模块旋转文件处理器 http docs python org library logging h
  • BasicHttpBinding 端点配置中的 bindingConfiguration 属性负责什么?

    因此 我正在为 WCF 服务配置端点 我对整个服务几乎没有经验 但一直在使用它们的项目中 我大致了解端点中除一个属性之外的每个属性的作用 绑定配置 这是我的代码的模糊版本 实际信息是专有的
  • vuejs - 计算不能与 props 一起使用

    我正在使用 props 来更新子组件中的网站内容 这基本上是这样工作的
  • 在 Firestore 中安全保存数据

    Firestore 文档shows https firebase google com docs firestore security rules query examples https firebase google com docs
  • Groovy:从文件中读取一系列行

    我有一个文本文件 其中包含大约 2 000 000 行的大量数据 使用以下代码片段浏览文件很容易 但这不是我需要的 def f new File input txt f eachLine Some code here 我只需要从文件中读取特
  • 函数指针作为参数

    我尝试调用一个不带参数作为函数指针传递的函数 但我无法使其工作 void disconnectFunc void D setDisconnectFunc void func disconnectFunc func void D discon
  • TPL 是否可以在多个线程上运行任务?

    欢迎特定于 Mono Xamarin 的答案 我正在使用 Task Run 运行 System Threading Tasks TPL 是否会在任务执行的生命周期内将创建的任务分配给单个线程 或者创建的任务是否有可能在运行时被抢占 然后再次
  • Plotly - 如何绘制圆柱体?

    I have a function plotting the cylinder using matplotlib 我想知道如何使用情节来做同样的事情 下面是我绘制圆柱体的 matplotlib 函数 function to plot the
  • 更新核心数据存储位置以支持应用程序组

    我在 App Store 中已有一个使用核心数据来保存数据的应用程序 现在 当 iOS 8 即将发布时 我想为其添加一个小部件 因此我必须使用应用程序组在二进制文件之间共享数据 但有一个问题 我需要更改商店位置以支持所有现有用户的应用程序组