0

我正在尝试通过其唯一对象来获取对象,为此我正在保存插入对象的 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尽管我已存储为属性,但我无法访问我的第二个功能。

4

2 回答 2

1

首先,您是否使用ARC?

那么,这是为什么呢?

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

    return @"true"
}

改用这个

- (BOOL)insertUser
{
    // other code here

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

然后,使用这个方法

- (NSArray *)getUser

- (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 不保证是一致的。它可以根据包括数据迁移和其他因素在内的许多因素而改变。如果您将其用作对象的唯一标识符,请停止。

因此,在您的模型中为实体添加一个属性(一个NSString可能没问题),UserInfo并在您创建新用户和检索用户时设置它。

// insert
user.userIdentifier = // your identifier

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

现在在哪里moid will be

@property (nonatomic, copy) NSString* moid; // also synthesize it (optional)

将被设置为

self.moid = [newUser userIdentifier];

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

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

于 2012-12-13T11:15:55.390 回答
0

对象 ID 有两种形式。首次创建托管对象时,Core Data 为其分配一个临时 ID;只有当它被保存到持久存储时,Core Data 才会为托管对象分配一个永久 ID。您可以轻松发现 ID 是否是临时的:

BOOL isTemporary = [[managedObject objectID] isTemporaryID];

保存上下文后,您的对象 ID 可能会发生变化。

于 2012-12-13T10:53:20.743 回答