标签: core-data

使用Core Data实现Enums的最佳方式

将Core Data实体绑定到枚举值的最佳方法是什么,以便我能够为实体分配类型属性?换句话说,我有一个Item带有itemType属性的实体,我希望将其绑定到枚举,实现此目的的最佳方法是什么.

iphone cocoa cocoa-touch core-data objective-c

108
推荐指数
4
解决办法
2万
查看次数

使用Core Data,iCloud和CloudKit进行同步和备份以及它如何协同工作

我正处于创建应用程序的早期阶段,我希望保存,同步和备份数据.该应用程序不会将任何文件仅存储在数据库中.它将是iOS 8及以上,因此我可以使用CloudKit.我做了一些研究,但仍不清楚Core Data,iCloud和CloudKit如何协同工作.

据了解,CloudKit只是一种从云端获取和检索数据的方法.CloudKit是一种与iCloud同步数据的不同方式吗?

我的问题是:

  1. 如果我确实使用CloudKit,我还需要创建本地核心数据库吗?

    • 如果是,它将自动与iCloud同步,或者我必须调用方法存储到这两个地方?
  2. 如果数据仅存储在云中,则当iOS设备未连接到互联网时,用户可以访问该数据.我读到CloudKit只有有限的缓存.

  3. 如果未启用iCloud帐户,该怎么办?

如果有人能够在离线和在线保存和同步核心数据数据库的过程中分解每种技术的作用.

我目前的理解是:

  • 核心数据用于在本地存储数据

  • iCloud将数据和存储同步到云中

  • CloudKit能够在云中存储和管理数据吗?

我希望我提供了足够的信息来解决这个问题.

core-data ios icloud cloudkit

105
推荐指数
2
解决办法
3万
查看次数

Coredata错误"data:<fault>"

我尝试使用以下代码从CoreData中提取数据

NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"Cave" inManagedObjectContext:self.context];
request.predicate = [NSPredicate predicateWithFormat:@"(latitude > 0) AND (longitude > 0)"];

NSError *error;
NSLog(@"%@",[self.context executeFetchRequest:request error:&error]);
NSLog(@"%@",[error localizedDescription]);
Run Code Online (Sandbox Code Playgroud)

CoreData应该有9个匹配的对象,它会找到9个对象.所以谓词应该可以工作,但我在控制台中得到了这个

2011-09-05 07:41:42.267 CaveConditions[6930:11903] (
    "<NSManagedObject: 0x7368060> (entity: Cave; id: 0x7367880 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p31> ; data: <fault>)",
    "<NSManagedObject: 0x73547e0> (entity: Cave; id: 0x7356e20 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p40> ; data: <fault>)",
    "<NSManagedObject: 0x73681e0> (entity: Cave; id: 0x7363e60 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p42> ; data: <fault>)",
    "<NSManagedObject: 0x7368280> (entity: Cave; id: 0x7356be0 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p72> ; data: <fault>)",
    "<NSManagedObject: 0x7368320> (entity: Cave; id: 0x733ad80 …
Run Code Online (Sandbox Code Playgroud)

iphone core-data

103
推荐指数
2
解决办法
4万
查看次数

XCode4和核心数据:如何启用SQL调试

我正在开发一个通用的iOS应用程序,我想在调试时看到日志中的原始SQL.这篇博客文章中有一些关于如何为iOS Core Data开发启用原始SQL日志记录的信息.给出的示例适用于XCode 3,我不清楚如何在XCode 4中启用它.

我尝试了"产品" - >"编辑方案",并将" -com.apple.CoreData.SQLDebug 1 " 添加到"启动时传递的参数",但我仍然没有在日志中看到任何输出.不确定我是在寻找错误的地方还是仅仅错误地传递了参数.

sql core-data ios xcode4

101
推荐指数
3
解决办法
4万
查看次数

如何将类型应用于NSFetchRequest实例?

在Swift 2中,以下代码正在运行:

let request = NSFetchRequest(entityName: String)
Run Code Online (Sandbox Code Playgroud)

但是在Swift 3中它给出了错误:

无法推断通用参数"ResultType"

因为NSFetchRequest现在是通用类型.他们在文件中写道:

let request: NSFetchRequest<Animal> = Animal.fetchRequest
Run Code Online (Sandbox Code Playgroud)

所以如果我的结果类是例如Level我应该如何正确请求?

因为这不起作用:

let request: NSFetchRequest<Level> = Level.fetchRequest
Run Code Online (Sandbox Code Playgroud)

core-data swift swift3

100
推荐指数
5
解决办法
4万
查看次数

在iOS 5上实现快速高效的核心数据导入

问题:如何获取子上下文以查看父上下文中保留的更改,以便它们触发我的NSFetchedResultsController来更新UI?

这是设置:

你有一个下载并添加大量XML数据的应用程序(大约200万条记录,每条记录大致与正常段落的文本大小相同).sqlite文件的大小约为500 MB.将此内容添加到Core Data需要时间,但您希望用户能够在数据以递增方式加载到数据存储中时使用该应用程序.用户必须看不到大量数据被移动,因此没有挂起,没有抖动:滚动像黄油一样.尽管如此,该应用程序更有用,添加的数据越多,因此我们不能永远等待将数据添加到Core Data存储中.在代码中这意味着我真的想在导入代码中避免这样的代码:

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]];
Run Code Online (Sandbox Code Playgroud)

该应用仅限iOS 5,因此需要支持的最慢设备是iPhone 3GS.

以下是我目前用于开发当前解决方案的资源:

Apple的核心数据编程指南:高效导入数据

  • 使用自动释放池来降低内存
  • 关系成本.导入平面,然后在最后修补关系
  • 不要询问你是否可以帮助它,它会以O(n ^ 2)的方式减慢速度
  • 批量导入:保存,重置,排空和重复
  • 导入时关闭撤消管理器

iDeveloper TV - 核心数据性能

  • 使用3种上下文:Master,Main和Confinement上下文类型

iDeveloper TV - 适用于Mac,iPhone和iPad更新的核心数据

  • 使用performBlock在其他队列上运行保存会使事情变得更快.
  • 加密会减慢速度,如果可以,请将其关闭.

Marcus Zarra在核心数据中导入和显示大型数据集

  • 您可以通过为当前运行循环提供时间来减慢导入速度,因此用户感觉很顺利.
  • 示例代码证明可以执行大型导入并保持UI响应,但不能像使用3个上下文和异步保存到磁盘一样快.

我目前的解决方案

我有3个NSManagedObjectContext实例:

masterManagedObjectContext - 这是具有NSPersistentStoreCoordinator的上下文,负责保存到磁盘.我这样做,所以我的保存可以是异步的,因此非常快.我在发布时创建它,如下所示:

masterManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[masterManagedObjectContext setPersistentStoreCoordinator:coordinator];
Run Code Online (Sandbox Code Playgroud)

mainManagedObjectContext - 这是UI在任何地方使用的上下文.它是masterManagedObjectContext的子代.我像这样创建它:

mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[mainManagedObjectContext setUndoManager:nil];
[mainManagedObjectContext setParentContext:masterManagedObjectContext];
Run Code Online (Sandbox Code Playgroud)

backgroundContext - 此上下文在我的NSOperation子类中创建,该子类负责将XML数据导入Core Data.我在操作的main方法中创建它并将其链接到那里的主上下文.

backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[backgroundContext setUndoManager:nil];
[backgroundContext setParentContext:masterManagedObjectContext];
Run Code Online (Sandbox Code Playgroud)

这实际上非常非常快.只需通过这3个上下文设置,我就可以将导入速度提高10倍以上!老实说,这很难相信.(此基本设计应该是标准Core Data模板的一部分......)

在导入过程中,我保存了两种不同的方式.我在背景上下文中保存的每1000个项目:

BOOL saveSuccess …
Run Code Online (Sandbox Code Playgroud)

core-data nsfetchedresultscontroller nsmanagedobjectcontext ios

98
推荐指数
1
解决办法
1万
查看次数

我需要做些什么才能让Core Data自动迁移模型?

我已经阅读了关于Core Data模型的自动/轻量级迁移的文档 - 但是在实现它的过程中遇到了问题.

据我所知,应用程序应该注意到它所拥有的模型和设备上存在的模型已经不一样了.如果您只添加了属性或关系以及类似的简单更改,则应自动升级模型.

任何指针 - 我需要在xCode中设置一些东西吗?

core-data

95
推荐指数
3
解决办法
3万
查看次数

无法使用nil模型创建NSPersistentStoreCoordinator

我在Core Data上遇到了我的第一个破解,当我在我的设备上运行代码时出现以下错误,但它在模拟器上工作正常.

*由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'无法使用nil模型创建NSPersistentStoreCoordinator'

我的一些方法可能导致问题:

    - (NSManagedObjectContext *)managedObjectContext
{
    if (__managedObjectContext != nil)
    {
        return __managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        __managedObjectContext = [[NSManagedObjectContext alloc] init];
        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return __managedObjectContext;
}

/**
 Returns the managed object model for the application.
 If the model doesn't already exist, it is created from the application's model.
 */
- (NSManagedObjectModel *)managedObjectModel
{
    if (__managedObjectModel != nil)
    {
        return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"RugbyOnTv" withExtension:@"momd"]; …
Run Code Online (Sandbox Code Playgroud)

core-data objective-c ios

95
推荐指数
9
解决办法
5万
查看次数

iPhone上的JSON和核心数据

我有一个核心数据对象图(由两个由多对多关系链接的实体组成).

我很好奇,作为一个相对缺乏经验的iPhone开发人员,是否有人可以推荐一种方法,以及适合iPhone的JSON实现,这将允许我:

  1. 将核心数据记录转换为JSON字符串(同时保持实体之间的关系); 和

  2. 将JSON字符串转换回核心数据对象(再次保留实体之间的关系).

我已经在这一点上搜索了一个教程/代码示例,但没有成功,所以我将非常感激地收到任何帮助.

iphone json core-data objective-c

93
推荐指数
4
解决办法
4万
查看次数

CoreData:警告:无法加载命名的类

我正在使用Xcode 6.1将现有的Objective-C电视节目应用程序复制到新的Swift版本,并且我在使用CoreData时遇到了一些问题.

我创建了一个包含4个实体的模型,创建了它们的NSManagedObject子类(在Swift中),并且所有文件都设置了适当的应用程序目标(用于"编译源代码").

每当我尝试插入一个新实体时,我仍然会收到此错误:

CoreData:警告:无法为实体"显示"加载名为"显示"的类.找不到类,而是使用默认的NSManagedObject.

一些评论:

保存到Core Data时,我使用父子上下文方式来允许背景线程.我这样做是通过使用以下方法设置ManagedObjectContext:

lazy var managedObjectContext: NSManagedObjectContext? = {
  // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
  let coordinator = self.persistentStoreCoordinator
  if coordinator == nil {
    return nil
  }
  var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
  managedObjectContext.persistentStoreCoordinator = coordinator
  return managedObjectContext
}()
Run Code Online (Sandbox Code Playgroud)

并使用以下方法保存数据:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, …
Run Code Online (Sandbox Code Playgroud)

multithreading core-data nsmanagedobject swift

91
推荐指数
6
解决办法
3万
查看次数