尝试在持久性存储协调器中使用以下配置保存托管对象时:
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ParallelPhotosModel.sqlite"];
NSError *error = nil;
NSString *failureReason = @"There was an error creating or loading the application's saved data.";
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
我收到以下错误:
未解决的错误错误域= NSCocoaErrorDomain代码= 134030"保存时发生错误。" UserInfo = {NSFilePath = / var / mobile / Containers / Data / Application / 9FCED2FF-F976-4780-8192-208519C8CD11 / Documents / ParallelPhotosModel.sqlite,NSAffectedStoresErrorKey =( " (URL:file:///var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite)" ),NSUnderlyingError = 0x127335c50 {错误域= NSCocoaErrorDomain代码= 4"文件不存在。" UserInfo = {NSUnderlyingError = 0x12732a670 {错误域= NSPOSIXErrorDomain代码= 2"没有这样的文件或目录" UserInfo = {NSFilePath = / var / mobile / Containers / Data / Application / 9FCED2FF-F976-4780-8192-208519C8CD11 / Documents / ParallelPhotosModel.sqlite}}}}},{ NSAffectedStoresErrorKey =( " (URL:file:///var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite)" ); NSFilePath =" /var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite" ;; NSUnderlyingError ="错误域= NSCocoaErrorDomain代码= 4 \"文件不存在。\" UserInfo = {NSUnderlyingError = 0x12732a670 {错误域= NSPOSIXErrorDomain代码= 2 \"没有这样的文件或目录\"的UserInfo = {NSFilePath =的/ var /移动/容器/数据/应用/ 9FCED2FF-F976-4780-8192-208519C8CD11 /文档/ ParallelPhotosModel.sqlite}}}&#34 ;; }
这里的根本问题是什么?如何避免它?我曾经在某处看到当尝试保存在App捆绑包中时会弹出类似的错误,但我使用的storeURL来自教程(即文档目录)。
更新:
更具体一点,我粘贴NSManagedObjectContext应该允许我保存的位置,但它没有:
NSManagedObjectContext *context = [appDelegate managedObjectContext];
for (DBMetadata *file in metadataContents) {
NSString *photo_info = [file photo_info];
if (photo_info != nil) {
NSNumber *day_taken = [self extractDayFromString: photo_info];
NSNumber *month_taken = [self extractMonthFromString: photo_info];
NSNumber *year_taken = [self extractYearFromString: photo_info];
NSString *db_path = [file path];
NSManagedObject *parallelPhoto = [NSEntityDescription
insertNewObjectForEntityForName:@"ParallelPhotos"
inManagedObjectContext:context];
[parallelPhoto setValue:db_path forKey:@"pathInDropbox"];
[parallelPhoto setValue:day_taken forKey:@"day"];
[parallelPhoto setValue:month_taken forKey:@"month"];
[parallelPhoto setValue:year_taken forKey:@"year"];
NSLog(@"ADDED TO DB: %@ %@ %@", day_taken, month_taken, year_taken);
}
}
NSError *error = nil;
if(![context save:&error]){
NSLog(@"error: %@", error);
答案 0 :(得分:0)
在将URL添加到持久性存储之前,您可能希望确保该目录存在。
public static IEnumerable<Rule> GetRules(Group group)
{
if (group.SubGroups != null)
return group.Rules.Concat(group.SubGroups.SelectMany(g => GetRules(g)));
else
return group.Rules;
}
实际上,您可能希望在返回值之前将此代码添加到[[NSFileManager defaultManager] createDirectoryAtURL:[storeURL URLByDeletingLastPathComponent]
withIntermediateDirectories:YES
attributes:nil
error:NULL];
方法中。如果您这样做,请确保正确处理潜在错误。
修改强>
在线上设置断点
applicationDocumentsDirectory
并逐步完成。检查MOC和PSC的属性。您还应该检查持久性存储所拥有的URL。然后,您应该检查文件系统以查看该目录中的内容。
如果这些都不起作用,请在最初创建MOC / PSC的位置放置一个断点,并确保正确创建它。检查文件系统以确保存储在那里。
然后,在文件和/或文件系统上安装一个观察者,以便在它发生变化时立即得到通知,并查看是否可以捕获正在删除或移动的文件。
答案 1 :(得分:0)
所以,我在实现中改变了一些东西但是为我修复了什么我认为是以下几行:
[newAddress.managedObjectContext save:nil]
而不是 [上下文保存:&amp;错误]这是一个似乎错误的managedObjectContext。 可能是一些重复。因此,我总结一下,总是使用您刚刚对其进行更改的Object拥有的managedObjectContext是一个很好的策略,只是为了安全起见。