CoreData“验证商店网址时出错”

Posted

技术标签:

【中文标题】CoreData“验证商店网址时出错”【英文标题】:CoreData "Error validating url for store" 【发布时间】:2010-09-30 16:54:57 【问题描述】:

我的应用程序出现问题,CoreData 在模拟器中正常工作,但在设备上却没有。

我收到一个

2010-09-30 12:45:07.500 CoreDataTutorial_ios[130:307] Unresolved error Error Domain=NSCocoaErrorDomain Code=513 "The operation couldn’t be completed. (Cocoa error 513.)" UserInfo=0x1412a0 NSUnderlyingException=Error validating url for store, 
    NSUnderlyingException = "Error validating url for store";

我在这个函数中调用 PersistentStoreCoordinator(抛出上面的错误):

-(NSPersistentStoreCoordinator*)persistentStoreCoordinator

    if(persistentStoreCoordinator_ != nil) 
        return persistentStoreCoordinator_;

    NSURL *aStoreURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingFormat:@"corebase.sqlite"]];
    NSError *anError = nil;

    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if(![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:aStoreURL options:nil error:&anError])
    
        NSLog(@"Unresolved error %@, %@", anError, [anError userInfo]);
        abort();
    

    return persistentStoreCoordinator;

我在“objc_exception_throw”上设置了一个断点,以查看 aStoreURL 是什么,它是: 文件://localhost/var/mobile/Applications/BE9A2982-BDC3-405D-A201-FB78E9E0790B/Documentscorebase.sqlite

我注意到它本身并不是在“/Documents”之后添加最后的“/”。 当我以这种方式创建 URL 时

NSURL *aStoreURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingFormat:@"/corebase.sqlite"]];

它似乎奏效了,或者至少通过了那部分。 这个函数不应该附加那个部分吗?

-(NSString*) applicationDocumentsDirectory

    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

在模拟器中运行良好,正确的做法是什么?

【问题讨论】:

【参考方案1】:
NSURL *aStoreURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
                  stringByAppendingFormat: @"corebase.sqlite"]];

应该是

NSURL *aStoreURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] 
           stringByAppendingPathComponent: @"corebase.sqlite"]];

stringByAppending*PathComponent* 而不是 stringByAppending*Format*。 这个不错的小错误是由自动完成带给你的 :-)

为什么它在模拟器中工作?我猜是因为您可以在硬盘上的任何地方创建文件。因此模拟器在您的应用程序目录中创建了 Documentscorebase.sqlite。你应该检查它是否在那里。

在 iphone 上,您仅限于 Documents 目录,并且不允许在任何地方创建文件。

【讨论】:

以上是关于CoreData“验证商店网址时出错”的主要内容,如果未能解决你的问题,请参考以下文章

CoreData(IOS)多列的唯一约束?

数据导入CoreData期间如何显示progressBar?

在 Swift 中将 CoreData 保存/同步到 iCloud

如何在 Swift 4 CoreData 中设置合并策略

从 CoreData 获取数据时出现“'[AnyObject]' 不可转换为 '[Dog]?'”错误

ios coredata 会在新版本中更改实体属性导致崩溃