首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用as属性时的NSManagedObjectID问题

使用as属性时的NSManagedObjectID问题
EN

Stack Overflow用户
提问于 2012-12-13 18:17:08
回答 2查看 707关注 0票数 0

我正在尝试通过唯一的对象来获取对象,为此我保存了插入对象的id,我将使用它来获取它,这是我的代码。

代码语言:javascript
复制
@implementation UserInfoDOA
@synthesize firstName,lastName,userName,bDate,department,searchByDept,searchByName,moid,uriData,uri;

- (NSString *)insertUser
{    
    UserInfoAppDelegate *delegate = (UserInfoAppDelegate *)[[UIApplication sharedApplication] delegate];
    UserInfo *newUser = [NSEntityDescription insertNewObjectForEntityForName:@"UserInfo"
                                  inManagedObjectContext:delegate.managedObjectContext];


    Department *dept = [NSEntityDescription insertNewObjectForEntityForName:@"Department"
                                                   inManagedObjectContext:delegate.managedObjectContext];

    moid = [newUser objectID];
    NSLog(@"IN INSERTUSER %@", moid);  // moid displays its value

    if(dept!=nil) {
        dept.id=@"1001";
        dept.name=department;
        dept.location=@"ahmedabad";
        dept.post=@"developer";        
    }

    if (newUser != nil) {
        newUser.firstName =firstName;
        newUser.lastName =lastName;
        newUser.userName=userName;
        newUser.bDate = bDate ;
        newUser.dept=dept;

        NSError *savingError = nil;

        if ([delegate.managedObjectContext save:&savingError]) {
            NSLog(@"Successfully saved the context.");
        }
        else {       
            NSLog(@"Failed to save the context. Error = %@", savingError);
        }
    }
    else {        
        NSLog(@"Failed to create the new person.");
    }

    NSLog(@"IN INSERTUSER after %@",moid);

    return @"true";
}

- (NSArray *) getUser
{
    NSLog(@"IN GETUSER %@", moid); //NOT WORKING, moid is NULL here

    UserInfoAppDelegate *delegate = (UserInfoAppDelegate *)[[UIApplication sharedApplication] delegate];


    NSEntityDescription *entity = [NSEntityDescription entityForName:@"UserInfo"
                                              inManagedObjectContext:delegate.managedObjectContext];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:entity];


    NSPredicate *predicate=[NSPredicate predicateWithFormat:@"(objecId = %@)",moid];


    [fetchRequest setPredicate:predicate];

    NSError *requestError = nil;
    NSArray *users = [delegate.managedObjectContext executeFetchRequest:fetchRequest                     
                                                                  error:&requestError];

    return users;    
}

那么这里到底出了什么问题呢?我不能在我的第二个函数中访问moid,尽管我已经存储为属性。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-13 19:15:55

首先,你是否在使用ARC?

那么,为什么是这样呢?

代码语言:javascript
复制
- (NSString *)insertUser
{
    // other code here

    return @"true"
}

改用这个

代码语言:javascript
复制
- (BOOL)insertUser
{
    // other code here

    return YES // or NO based on the insertion result
}

然后,使用此方法

代码语言:javascript
复制
- (NSArray *)getUser

使用

代码语言:javascript
复制
- (UserInfo *)getUser
{
    // other code here

    // maybe you should add some code for error handling...you haven't set up any code there...
    return [users objectAtIndex:0];
}

关于你的问题,你不应该依赖NSManagedObjectID

正如@MarcusS.Zarra建议的那样

不保证NSManagedObjectID是一致的。它可能会根据许多因素而变化,包括数据迁移和其他因素。如果将其用作对象的唯一标识符,请停止。

因此,在模型中为UserInfo实体添加一个属性( NSString就可以了),并在创建新用户和检索用户时设置它。

代码语言:javascript
复制
// insert
user.userIdentifier = // your identifier

// retrieve
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(userIdentifier == %@)", self.moid];

现在moid will be在哪里?

代码语言:javascript
复制
@property (nonatomic, copy) NSString* moid; // also synthesize it (optional)

它将被设置为

代码语言:javascript
复制
self.moid = [newUser userIdentifier];

要创建一个新的标识符,您可以查看CORE DATA objectId changes constantly或创建自己的算法来生成它。

附言:我认为你没有使用ARC,因为编译器会抱怨newUser

票数 1
EN

Stack Overflow用户

发布于 2012-12-13 18:53:21

对象ID有两种形式。首次创建托管对象时,Core Data会为其分配临时ID;只有将其保存到永久存储区后,Core Data才会为托管对象分配永久ID。您可以很容易地发现ID是否是临时的:

代码语言:javascript
复制
BOOL isTemporary = [[managedObject objectID] isTemporaryID];

保存上下文后,您的对象id可能会发生更改。

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

https://stackoverflow.com/questions/13857635

复制
相关文章

相似问题

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