首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSManagedObject不储蓄

NSManagedObject不储蓄
EN

Stack Overflow用户
提问于 2011-09-06 14:13:47
回答 2查看 983关注 0票数 0

很抱歉,如果这个问题已经得到了回答,但我找不到任何参考。我第一次尝试可可/可可。我正在尝试开发一个应用程序,它将通过http ( la s3)与远程备份系统同步,并在一些基本的核心数据问题上步履蹒跚。

我已经创建了一个实体,并且可以在没有问题的情况下调用它。当我调用NSManagedObjectContext上的保存时,问题就出现了。

我不打算包含调用对象上下文/模型所涉及的所有方法,因为日志输出应该(我认为)验证它是否正常工作。

最好用代码和适当的日志条目来描述。

*首先,为了说明,我正在调用托管对象:*

代码语言:javascript
复制
- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel != nil) {
        return managedObjectModel;
    }

    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    
    NSLog(@"The managed object model is defined as follows:\n%@",     managedObjectModel);
    return managedObjectModel;
}

和上面NSLog:的日志输出

代码语言:javascript
复制
2011-09-06 14:31:38.322 TryAgain[18885:a0f] The managed object model is defined as follows:
(<NSManagedObjectModel: 0x2000e2b00>) isEditable 1, entities {
        BackupItinerary = "(<NSEntityDescription: 0x20020e9e0>) name BackupItinerary, managedObjectClassName NSManagedObject, renamingIdentifier 
            BackupItinerary, isAbstract 0, superentity name (null), properties {\n    \"file_url\" = \"(<NSAttributeDescription: 0x2000faec0>), name
            file_url, isOptional 0, isTransient 0, entity BackupItinerary, renamingIdentifier file_url, validation predicates (\\n), warnings (\\n),
            versionHashModifier (null), attributeType 700 , attributeValueClassName NSString, defaultValue (null)\";\n    \"last_sync_date\" =
            \"(<NSAttributeDescription: 0x2000faf60>), name last_sync_date, isOptional 1, isTransient 0, entity BackupItinerary, renamingIdentifier
            last_sync_date, validation predicates (\\n), warnings (\\n), versionHashModifier (null), attributeType 900 , attributeValueClassName
            NSDate, defaultValue (null)\";\n}, subentities {\n}, userInfo {\n}, versionHashModifier (null)";
}, fetch request templates {
}

,这看上去很成功。没有引发异常或警告。

现在,当我调用对象上下文的保存时,实际的问题就出现了。我有一个NSOpenPanel,它允许选择dir /文件进行备份(所有这些都连接在一起并正常工作)。在用户选择dir/file时,我要设置值,因此我:

代码语言:javascript
复制
NSArray *paths = [panel URLs];
NSURL *filePath = [paths objectAtIndex:0];
[directories addObject:filePath];
[directories setArray:[[NSSet setWithArray: directories] allObjects]];  
NSEntityDescription *BackupItineraryEntity = [[self.managedObjectModel  entitiesByName] objectForKey:@"BackupItinerary"];
NSManagedObject* BackupItinerary = [[NSManagedObject alloc]
                    initWithEntity:BackupItineraryEntity
    insertIntoManagedObjectContext:self.managedObjectContext];
[BackupItinerary setValue:[filePath absoluteString] forKey:@"file_url"];
NSLog(@"entity:\n%@", BackupItinerary);

和对NSLog的调用表示(选择了NSLog)

代码语言:javascript
复制
2011-09-06 14:31:38.328 TryAgain[18885:a0f] entity:
<NSManagedObject: 0x200216c80> (entity: BackupItinerary; id: 0x200090860 <x-coredata:///BackupItinerary/t0C005B39-D185-454B-B364-31314EEB10F02> ;     
        data: {
            "file_url" = "file://localhost/Users/rick/selenium2-webdriver/";
            "last_sync_date" = nil;
        })

,那么,file_url似乎被填充了,是吗?但当我:

代码语言:javascript
复制
NSError *error;
if (![[self managedObjectContext] save:&error]) {
    NSLog(@"Unresolved error %@, %@, %@", error, [error userInfo],[error localizedDescription]);
}

日志上写着:

代码语言:javascript
复制
2011-09-06 14:31:38.330 TryAgain[18885:a0f] Unresolved error Error Domain=NSCocoaErrorDomain Code=1570 UserInfo=0x2000cc4e0 "file_url is a required  
value.", {
    NSLocalizedDescription = "file_url is a required value.";
    NSValidationErrorKey = "file_url";
    NSValidationErrorObject = "<NSManagedObject: 0x20020f660> (entity: BackupItinerary; id: 0x20008faa0 <x-coredata:///BackupItinerary/t0C005B39
            D185-454B-B364-31314EEB10F03> ; data: {\n    \"file_url\" = nil;\n    \"last_sync_date\" = nil;\n})";
}, file_url is a required value.

所以基本上:

我似乎可以(?)调用一个实体并在其上设置一个值,但是当涉及到保存它时,没有设置值。上面的代码是内联执行的,我使用的是垃圾收集。

感觉像是一个全新的男孩错误问题,但对于我的生活,我看不出我错过了文档,高级教程和示例代码。

指针很感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-06 14:51:45

您正在查看两个不同的托管对象实例。具有其file_url属性集的实例是<NSManagedObject: 0x200216c80>,而报告错误的实例是<NSManagedObject: 0x20020f660>

在某个地方,您正在插入一个实例,而不是给它一个file_url值。在给定的代码中,如果用户在NSOpenPanel中选择cancel,则可能会发生这种情况。

票数 0
EN

Stack Overflow用户

发布于 2011-09-06 14:54:21

从NSLog的输出来看,我认为BackupItinerary对象在保存上下文时是不同的。在不同的场合检查此输出:

插入和设置值时:

代码语言:javascript
复制
entity:
<NSManagedObject: 0x200216c80>

储蓄时:

代码语言:javascript
复制
NSValidationErrorObject = "<NSManagedObject: 0x20020f660>

正如您所看到的,实例的地址不同,因此您正在插入一个实例,但保存另一个实例。希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7321350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档