我将尝试尽可能描述这个问题......
方案
假设我有一个NSManagedObject'用户'
@class Premise;
@interface User : NSManagedObject
@property (nonatomic, retain) NSNumber * identifier;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSSet *premises;
@end
@interface User (CoreDataGeneratedAccessors)
- (void)addPremisesObject:(Premise *)value;
- (void)removePremisesObject:(Premise *)value;
- (void)addPremises:(NSSet *)values;
- (void)removePremises:(NSSet *)values;
@end
我还有一个NSManagedObject'前提'
@class User;
@interface Premise : NSManagedObject
@property (nonatomic, retain) NSNumber * identifier;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) User *user;
@end
基于它,我正在创建一个关系路由,将'Premise'的JSON数组映射到'User'对象的'premises'属性。
这是路线:
let getPremisesRoute = RKRoute(relationshipName: "premises",
objectClass: User.self,
pathPattern: "user/:identifier/premises",
method: .GET)
这是JSON响应(/ user / 1 / premises):
[
{
"id": 35,
"name": "Icaraí"
},
{
"id": 32,
"name": "Remanso"
}
]
这是响应描述符:
let getPremisesResponseDescriptor = RKResponseDescriptor(mapping: premiseMapping, method: .GET, pathPattern: "user/:identifier/premises", keyPath: nil, statusCodes: RKStatusCodeIndexSetForClass(.Successful))
以下是“用户”和“前提”的相应映射
let userMapping = RKEntityMapping(forEntityForName: "User", inManagedObjectStore: moc)
userMapping.addAttributeMappingsFromDictionary(["id":"identifier", "name":"name"])
userMapping.identificationAttributes = ["identifier"]
userMapping.addPropertyMapping(RKRelationshipMapping(fromKeyPath: nil, toKeyPath: "premises", withMapping: premiseMapping))
let premiseMapping = RKEntityMapping(forEntityForName: "Premise", inManagedObjectStore: moc)
premiseMapping.addAttributeMappingsFromDictionary(["id":"identifier", "name":"name"])
premiseMapping.identificationAttributes = ["identifier"]
现在问题
显然,Restkit在映射过程中有点困惑。这是请求后的数据库:
用户表:
前提表:
请注意,实体之间没有创建关系。
现在,如果我将响应描述符的映射从前提更改为用户映射,则数据库将更改为:
用户表:
前提表:
我对发生的事情感到很困惑,我尝试了很多解决方案但没有成功。
JSON响应是否超出模式或我做错了什么? JSON响应似乎是一种常见模式,具有零密钥路径。
答案 0 :(得分:1)
您正在接近映射错误,或者至少您的映射对于您正在执行的操作是错误的。考虑响应是用户,但只是用户的前提,而不是像现在一样将其视为简单的前提列表。然后映射到用户并插入前提。类似的东西:
$back
以下是“用户”和“前提”的相应映射
if (isset($_POST['add_artimage'])) {
$front = $back = 'not uploaded';
if ($_FILES["front"])
$front = upload_file("front");
if ($_FILES["back"])
$back = upload_file("back");
echo "image_front is $front <br> image_back is $back";
}
您在响应中没有用户名,因此您无法映射它,并且用户ID实际上在请求中,因此您需要使用元数据来提取它。
答案 1 :(得分:1)
好的,我找到了一个基于@Wain使用外键解决方案的解决方案。
我向'Premise'实体添加了一个新属性'userID',并使用元数据将其映射到URL上的标识符
let premiseMapping = RKEntityMapping(forEntityForName: "Premise", inManagedObjectStore: moc)
premiseMapping.addAttributeMappingsFromDictionary(["id":"identifier", "name":"name", "@metadata.routing.parameters.identifier":"userID"])
然后我添加了与'premiseMapping'的关系连接
premiseMapping.addConnectionForRelationship("user", connectedBy: ["userID":"identifier"])
如果有人有更优雅的解决方案,请与我们分享。