繁体   English   中英

如何保存一个PersistentStore

[英]How to save a PersistentStore

我有以下问题:

我有一个以UITableView作为根视图的应用程序。 在此tableView中,有不同的条目,并且对于每个条目(可由用户创建),我还向我的应用添加了持久存储。

因此,当我从头启动应用程序(不保存数据等)并添加条目时,也会创建persistentStore,并且当我单击tableViewCell时,可以将数据保存在此生成的persistentStore中。 如果我要创建一个条目,并且在一次运行中也要监视该条目,则此方法效果很好。

如果我关闭该应用程序并重新启动,请单击同一条目,我将收到以下错误消息:

NSFetchRequest *allUsers = [[NSFetchRequest alloc] init];
[allUsers setAffectedStores:[NSArray arrayWithObject:[[self.tableViewContext persistentStoreCoordinator] persistentStoreForURL:storeURL]]];

*由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'* -[NSArray initWithObjects:count:]:尝试在对象[0]上插入零对象

因此,似乎我想添加一个实际上为零的商店,因为(我猜是这样),系统无法在此给定的storeURL下找到任何商店(这与我在第一次运行中创建商店的商店相同) 。

因此,我猜想persistentStore在第二次运行中不存在,因此在创建它的第一次运行中未正确保存。

那么,在添加了persistentStore之后,如何将其保存到persistentStoreCoordinator?

更新:

我认为我已经确定了主要问题。 第一次运行后,persistentStoreCoordinator已更改。 那么在关闭应用程序之前如何保存所有这些东西(managedObjectContext,persistentStoreCoordinator)?

有人可以帮我吗?

更新2

这是我创建商店的方法:

    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [searchPaths objectAtIndex:0];
    NSString* storeFileName = [NSString stringWithFormat:@"%@",newItem.name];
    NSURL *storeURL = [NSURL fileURLWithPath:[documentPath stringByAppendingPathComponent:storeFileName]];                            
     NSError* saveToStoreError;
    if(![[self.addContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&saveToStoreError]){
     NSLog(@"Error: %@, %@", saveToStoreError, [saveToStoreError userInfo]);
     abort();
    }
    else
    {
      NSError *saveStoreError;
      if(![self.addContext save:&saveStoreError])
      {
           NSLog(@"Saving Data wasn't possible!");
      }
    }

更新3因此,经过大量测试,这是我的结果:

  • 创建商店很好。 我可以创建多个商店,并且只要我一次运行应用程序就可以访问并填充它们。

因此,随着我的应用重启,情况发生了变化。 我认为该错误必须与managedObjectContext,persistentStoreCoordinator或商店的保存相关联。

我是否应该在我的应用程序委托中更改任何设置来设置managedObjectContext或persistentStoreCoordinator?

谢谢!

您表达问题的方式使我怀疑某种混乱。

每次重新启动后,persistentStore都会更改。 这是通常情况吗?

是的! NSPersistentStore与其他任何对象一样都是Objective-C对象。 因此,它在发射之间不是持久的。 您需要每次重新创建它。

NSPersistentStore的持久性是它指向的文件。 但是,每次运行应用程序时,都必须重新创建一个新的NSPersistentStore对象,该对象可能指向同一文件(由initWithPersistentStoreCoordinator:configurationName:URL:options:url参数定义)。

那么,如何设置storeURL变量?

看一下Xcode模板中基于Window的应用程序。

这将为您创建一个完整的Core-Data堆栈-持久性存储,持久性存储协调器和托管对象上下文。

假设您的应用程序没有特别要求,则您应该只有一个持久性存储。 实际上,这是写入数据的文件。 查看您的代码,似乎您每次保存数据时都试图创建自己的商店。

您应该从我上面建议的模板中复制核心数据堆栈方法。 您不需要自己引用持久性存储或持久性存储协调器。 您所需要做的就是由应用程序委托创建的托管对象上下文。

要保存托管对象上下文,请在添加新的持久性存储之后和关闭应用程序之前使用NSManagedObjectContext的“ save:”方法。 然后,要检查是否正确添加了持久性存储,请使用NSPersistentStoreCoordinator“ persistentStores”方法来确定可用的有效存储。

我想知道问题是否不是核心数据调用是否像被调用时那样?

当您“关闭应用程序并重新启动”时...该应用程序是在两者之间终止还是在后台运行? IIRC会微妙地影响您在应用程序委托中调用的内容。 根据WRT核心数据在其中的排列方式,可能会意外地调用(或遗漏)某些内容。

如果您在App Delegate(或它们可能位于的任何位置)中跟踪与每个单独的Core Data相关的方法,那么我会很感兴趣,以查看是否可以更轻松地捕获它。 (如果某个地方发布了一个最小的测试用例,请分享!)

这很简单。

重新启动后,在试图从该存储中获取数据的视图中,我没有设置addPersistentStoreWithType

对不起,这篇文章。 简单单;-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM