gpt4 book ai didi

ios - 如何保存持久存储

转载 作者:行者123 更新时间:2023-11-29 04:59:14 30 4
gpt4 key购买 nike

我遇到以下问题:

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

因此,当我从头开始启动应用程序(没有保存数据等)并添加一个条目时,也会创建 persistenceStore,当我单击 tableViewCell 时,我可以将数据保存在这个生成的 persistenceStore 中。如果我正在创建一个条目并在一次运行期间观看该条目,则效果很好。

但是

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

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

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

所以看来我想添加一个实际上为零的商店,因为(我猜是这样)系统在这个给定的storeURL下找不到任何商店(这与我在第一次运行)。

所以我猜第二次运行时持久存储不存在,因此它在创建它的第一次运行中没有正确保存。

添加持久性存储后,如何将其保存到持久性存储协调器中?

更新:

我想我已经确定了主要问题。第一次运行后,perpetitiveStoreCoordinator 发生了变化。那么,在关闭应用程序之前,如何保存所有这些内容(managementObjectContext、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、perherentStoreCoordinator 或存储的 SAVING 相关。

我是否应该更改应用程序委托(delegate)中的任何设置来设置 ManagedObjectContext 或 persistenceStoreCoordinator?

谢谢!

最佳答案

您表达问题的方式让我怀疑存在某种困惑。

that persistentStore is changing after each restart. Is this the usual case?

是的,就是这样! NSPersistentStore 与任何其他对象一样都是 Objective-C 对象。因此,它在启动过程中并不持久。您每次都需要重新创建它。

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

那么如何设置 storeURL 变量呢?

关于ios - 如何保存持久存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7326823/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com