Iphone 将NSManagedObjectID用作属性时出现问题

Iphone 将NSManagedObjectID用作属性时出现问题,iphone,core-data,nsmanagedobject,Iphone,Core Data,Nsmanagedobject,我试图通过它唯一的对象来获取对象,为此我保存了插入对象的id,我将使用该id来获取它,这是我的代码 @implementation UserInfoDOA @synthesize firstName,lastName,userName,bDate,department,searchByDept,searchByName,moid,uriData,uri; - (NSString *)insertUser { UserInfoAppDelegate *delegate = (Us

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

@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

对象ID有两种形式。首次创建托管对象时,核心数据会为其分配一个临时ID;只有将其保存到持久性存储时,核心数据才会为托管对象分配永久ID。您可以很容易地发现ID是否是临时的:

BOOL isTemporary = [[managedObject objectID] isTemporaryID];

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

首先,是否使用ARC

那么,为什么会这样

- (NSString *)insertUser
{
    // other code here

    return @"true"
}
用这个代替

- (BOOL)insertUser
{
    // other code here

    return YES // or NO based on the insertion result
}
然后,使用这个方法

- (NSArray *)getUser

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

正如@MarcusS.Zarra建议的那样

NSManagedObjectID不保证一致。它可以 基于多种因素的变化,包括数据迁移和其他 因素。如果您使用此作为您的 物体,停下

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

// insert
user.userIdentifier = // your identifier

// retrieve
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(userIdentifier == %@)", self.moid];
其中现在的
moid将是

@property (nonatomic, copy) NSString* moid; // also synthesize it (optional)
这将被设置为

self.moid = [newUser userIdentifier];
要创建新的标识符,您可以查看或创建自己的生成算法


另外,我认为您没有使用ARC,因为编译器会抱怨
newUser

我在保存newUser后检查了这一点,它给出了NULL!BOOL isTemporary=[[newUser objectID]isTemporaryID];NSLog(@“是温度:%@”,是临时的);实际上,%@用于打印引用处的对象。所以NSLog(@“是TEMP:%@”,isTemporary);这是错误的。由于No返回0,并且在(地址)处发现Null。这意味着您的isTemprory返回NOyes。我正在启用ARC的环境中工作,我尝试保存唯一id,稍后使用该id获取对象以进行更新。
self.moid = [newUser userIdentifier];