- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我刚刚安装了框架 restkit 0.9.3 并遵循了讨论区示例。嗯,一切都很好,但是当我尝试使用核心数据时,即使在声明了他的 primaryKeyAttribute (userID) 之后,我的 User NSManagedObject 类仍在复制。例如,当我向我的网络服务器发送登录请求时,我返回 {"user":{"id":1, "username":"teste", ...}}
。 . 但它似乎每次调用 objectLoader:didLoadObjects 时都会创建一个新行。
用户表:
示例代码:
~ AppDelegate.m didFinishLaunching
RKManagedObjectMapping* userMapping = [RKManagedObjectMapping mappingForClass:[User class]];
userMapping.primaryKeyAttribute = @"userID";
userMapping.setDefaultValueForMissingAttributes = YES; // clear out any missing attributes (token on logout)
[userMapping mapKeyPathsToAttributes:
@"id", @"userID",
@"email", @"email",
@"username", @"username",
@"password", @"password",
nil];
[objectManager.mappingProvider registerMapping:userMapping withRootKeyPath:@"user"];
~ User.m loginWithDelegate
- (void)loginWithDelegate:(NSObject<UserAuthenticationDelegate>*)delegate {
_delegate = delegate;
[[RKObjectManager sharedManager] postObject:self delegate:self block:^(RKObjectLoader* loader) {
loader.resourcePath = @"/login";
loader.serializationMapping = [RKObjectMapping serializationMappingWithBlock:^(RKObjectMapping* mapping) {
[mapping mapAttributes:@"username", @"password", nil];
}];
}];
}
~ User.m didLoadObjects (RKObjectLoaderDelegate)
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray *)objects {
if ([objectLoader wasSentToResourcePath:@"/login"]) {
[self loginWasSuccessful];
}
NSLog(@"number of user rows: %i", [User findAll].count);
}
我做错了什么?
最佳答案
你是否正确地实现了 RKManagedObjectCache?为了进行调试,我让它简单地返回 nil 而忘记了它。过了一会儿,我发现我也有重复项。
缓存通过获取本地对象并与服务器返回的对象进行比较来工作。任何不在服务器响应中的本地对象都将被删除。在早期版本中,它使用获取请求,但在较新版本中,您必须手动执行请求并返回实际对象。
如果你返回 nil,它认为这个对象不在你的缓存中,将添加一个副本。尝试实现这个方法:
+ (NSManagedObject *)findInstanceOfEntity:(NSEntityDescription *)entity
withPrimaryKeyAttribute:(NSString *)primaryKeyAttribute
value:(id)primaryKeyValue
inManagedObjectContext:(NSManagedObjectContext *)managedObjectContext
例如:
+ (NSManagedObject *)findInstanceOfEntity:(NSEntityDescription *)entity
withPrimaryKeyAttribute:(NSString *)primaryKeyAttribute
value:(id)primaryKeyValue
inManagedObjectContext:(NSManagedObjectContext *)managedObjectContext {
NSFetchRequest* request = [[NSFetchRequest alloc] init];
[request setEntity: entity];
[request setFetchLimit: 1];
[request setPredicate:[NSPredicate predicateWithFormat:@"%K = %@", primaryKeyAttribute, primaryKeyValue]];
NSArray *results = [NSManagedObject executeFetchRequest:request inContext: managedObjectContext];
if ([results count] == 0)
{
return nil;
}
return [results objectAtIndex:0];
}
关于iphone - primaryKeyAttribute 不工作 Restkit/核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7799890/
我刚刚安装了框架 restkit 0.9.3 并遵循了讨论区示例。嗯,一切都很好,但是当我尝试使用核心数据时,即使在声明了他的 primaryKeyAttribute (userID) 之后,我的 U
我是一名优秀的程序员,十分优秀!