Iphone 将NSManagedObjectID用作属性时出现问题
我试图通过它唯一的对象来获取对象,为此我保存了插入对象的id,我将使用该id来获取它,这是我的代码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
@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];