2012-02-16 36 views
8

Sau khi đọc Object Mapping-Guide on GitHub cho RestKit vấn đề của tôi đã không biến mất, vì vậy có lẽ ai đó có thể nói nếu RestKit có thể đối phó với ý tưởng sau đây.RestKit Object Mapping mối quan hệ mà không cần KVC

Các đối tượng với mối quan hệ

Company 
- unitID 
- companyID 
- name 
- contacts* (Company -->> Contact | 1:n) 

Contact 
- unitID 
- companyID 
- contactID 
- lastName 
- firstName 
- account* (Contact >--> Company | 1:1) 

JSON (Công ty)

[ 
    { 
     "unitID":"003CABD8DEB5DC13C", 
     "companyID":"BSP-002999", 
     "name":"Testcompany" 
    } 
] 

JSON (Liên hệ)

[ 
    { 
     "unitID":"DAC2ACCC125795D00", 
     "companyID":"BSP-002999", 
     "contactID":"CLP-015468", 
     "firstName":"Mister", 
     "lastName":"Wayne" 
    } 
] 

Do hạn chế, tôi không thể lồng các liên hệ thuộc vào các công ty (nếu không tôi sẽ không viết thư này), vì vậy tôi muốn sử dụng khi dữ liệu được ánh xạ khi nhập.

Câu hỏi

Có thể để ánh xạ mỗi Contact to nó thuộc Công ty (được xác định bởi thuộc tính companyID) về nhập khẩu với các phương pháp do RestKit?

Nếu không, tôi muốn biết giải pháp tốt nhất cho nó. Cảm ơn!


nền

Trong xây dựng đầu tiên của tôi về ứng dụng này tôi đã ánh xạ các đối tượng để các đối tượng nhất định (mà không cần mối quan hệ) và lấy tất cả các địa chỉ liên lạc thuộc về một công ty với vị companyID =% @. Do số lượng dữ liệu (4000+ công ty, 7000+ Danh bạ) tìm nạp tất cả các địa chỉ liên hệ thuộc về mất khoảng một giây - vì vậy tôi đã đưa ra ý tưởng sử dụng quan hệ (hoạt động hoàn hảo với dữ liệu giả cục bộ).


Giải pháp

Với sự giúp đỡ của các câu trả lời đưa ra dưới đây lập bản đồ hiện tại của tôi trông giống như sau (RestKit V.10).

// Setting up Restkit with objectStore 
... 

// Init objectMapping for Class Company 
companyMapping = [RKManagedObjectMapping mappingForClass:[Company class] inManagedObjectStore:objectStore]; 
[companyMapping mapKeyPath:@"unitID" toAttribute:@"unitID"]; 
[companyMapping mapKeyPath:@"companyID" toAttribute:@"companyID"]; 
[companyMapping mapKeyPath:@"name" toAttribute:@"name"]; 
companyMapping.setDefaultValueForMissingAttributes = NO; 
companyMapping.primaryKeyAttribute = @"companyID"; 

// Init objectMapping for Class Contact 
contactMapping = [RKManagedObjectMapping mappingForClass:[Contact class] inManagedObjectStore:objectStore]; 
[contactMapping mapKeyPath:@"unitID" toAttribute:@"unitID"]; 
[contactMapping mapKeyPath:@"companyID" toAttribute:@"companyID"]; 
[contactMapping mapKeyPath:@"contactID" toAttribute:@"contactID"]; 
[contactMapping mapKeyPath:@"lastName" toAttribute:@"lastName"]; 
[contactMapping mapKeyPath:@"firstName" toAttribute:@"firstName"]; 
contactMapping.setDefaultValueForMissingAttributes = NO; 
contactMapping.primaryKeyAttribute = @"contactID"; 

// Init relationships 
[contactMapping mapRelationship:@"company" withMapping:companyMapping]; 
[contactMapping connectRelationship:@"company" withObjectForPrimaryKeyAttribute:@"companyID"]; 

// Get objects from server 
... 

+0

Ông có thể hãy chia sẻ giải pháp làm việc của bạn trong ví dụ này? :) Chỉ cần cho ánh xạ –

+2

Cập nhật mục nhập của tôi ở trên với cấu hình ví dụ. Hy vọng nó giúp! – flashfabrixx

Trả lời

12

Vâng, RestKit thể hydrat mối quan hệ này cho bạn vào thời gian lập bản đồ.Trên RKManagedObjectMapping của bạn cho mô hình liên hệ của bạn, bạn sẽ cần phải làm những việc sau:

  • Thêm một ánh xạ mối quan hệ với công ty mẹ: [objectMapping mapRelationship:@"company" withMapping:companyMapping]
  • Ánh xạ các thuộc tính companyID vào mô hình liên hệ của bạn
  • Đảm bảo rằng bạn có các primaryKeyAttribute cấu hình trên cả hai lớp
  • Hướng dẫn, RestKit để hydrate mối quan hệ: [objectMapping connectRelationship:@"company" withObjectForPrimaryKeyAttribute:@"companyID"];

Sau RestKit có đã hoàn thành ánh xạ một tải trọng, nó sẽ quay trở lại thông qua bộ sưu tập và hydrate bất kỳ mối quan hệ nào. Việc xử lý được hoãn lại cho đến sau khi ánh xạ trong trường hợp tải trọng thực sự tạo ra các đối tượng mà bạn cần để đáp ứng các kết nối.

Trên nhánh phát triển, có một quy trình làm việc thay thế có sẵn cho bạn. Đầu tuần này, tôi đã bổ sung hỗ trợ cho việc hydrating một mối quan hệ có nhiều bằng cách sử dụng một mảng ID trong tải trọng. Điều này sẽ cho phép bạn gửi danh sách Liên hệ thuộc về công ty xuống tải trọng thay thế. Nó có thể hiệu quả hơn cho trường hợp sử dụng của bạn.

chi tiết bổ sung từ bài viết của tôi vào danh sách gửi thư RestKit: http://groups.google.com/group/restkit/msg/416951f86b2862d1

+0

Cảm ơn bạn đã phát lại nhanh - nó hoạt động như một sự quyến rũ! Tôi đang xem projekt trên GitHub/Google bây giờ, bởi vì bạn là ý tưởng thứ hai có vẻ là tuyệt vời cho dự án này. – flashfabrixx

+0

Bạn đã lưu ngày của tôi! :) Có vẻ như bạn cần một khóa ngoại trong thực thể của bạn trỏ đến thực thể cha bạn muốn hydrate. Dù sao, tôi đã đi qua tất cả các loại tài liệu và ví dụ nhưng tôi chỉ không nhận được cách thức hoạt động. Đây là lời giải thích tốt nhất cho đến nay về cách cuối cùng để có được điều này để làm việc! – Hlung

Các vấn đề liên quan