2012-07-19 70 views
2

我有一個Parent模型,從NSManagedObject繼承,Child模型繼承自ParentRestkit - 子映射不會繼承其父映射嗎?

這裏是Parent映射:

RKManagedObjectStore* store = [RKObjectManager sharedManager].objectStore; 
RKManagedObjectMapping* mapping = [RKManagedObjectMapping mappingForEntityWithName:@"Parent" inManagedObjectStore:store]; 
[mapping mapKeyPath:@"id" toAttribute:@"id"]; 
[[RKObjectManager sharedManager].mappingProvider addObjectMapping:mapping]; 

而且Child映射:

RKManagedObjectStore* store = [RKObjectManager sharedManager].objectStore; 
RKManagedObjectMapping* mapping = [RKManagedObjectMapping mappingForEntityWithName:@"Child" inManagedObjectStore:store]; 
[[RKObjectManager sharedManager].mappingProvider setMapping:mapping forKeyPath:@"child"]; 

然後,當我嘗試以下JSON對象映射到一個Child實例:

{ 
    "child": { 
    "id": 7 
    } 
} 

在RestKit跟蹤中,我看到以下mappin爲Child GS:

mappings =>() 

爲什麼不Child映射從Parent映射繼承?如何使映射繼承工作?

回答

2

總之,它不工作,因爲RestKit不支持它,在我看來不應該。

如果您希望子映射具有父映射,您也可以將其添加到子映射中,如果您單獨編寫這些代碼,或者只使用一些額外字符mapKeyPathsToAttributes:方法。

關於您的具體示例有一點很重要。一個是你不應該使用'id'作爲你的屬性名稱,因爲id是在ObjC中保留的(我不是積極的,它實際上會導致問題,但是至少在代碼中看到它是令人困惑的)。

因此,存在在RestKit稍微標準慣例來映射「ID」特性,這是將實體的名稱前加上所述屬性,即Parent將具有parentID屬性和Child將具有childID屬性。這就說明了爲什麼繼承這些屬性(特別是主鍵!)在一般情況下不是一個好主意。

此外,爲RESTful服務器提供某種基於SQL的後端是很常見的,這可能會或可能不會支持Core Data所具有的實體繼承類型,因此會旋轉對象從設備映射到數據的方式在服務器上。例如,Rails在一定程度上處理了STI,但比這更復雜的事情需要寶石或黑客。

編輯:(從GitHub問題所採取的) 如果有人認爲這在尋找一種方式來繼承,有一個比較簡單的方法基於其他映射,以創建映射:

RKManagedObjectMapping* parentMapping = [RKManagedObjectMapping mappingForEntityWithName:@"Child" inManagedObjectStore:store]; 
parentMapping.primaryKeyAttribute = @"parentID"; 
[parentMapping mapKeyPathsToAttributes: @"id", @"parentID", @"property_one", @"propertyOne", @"parent_only_property", @"parentOnlyProperty"]; 
[[RKObjectManager sharedManager].mappingProvider setMapping:mapping forKeyPath:@"parent"]; 

RKManagedObjectMapping* childMapping = [parentMapping copy]; 
childMapping.primaryKeyAttribute = @"childID"; 
[childMapping removeMapping:[childMapping mappingForAttribute:@"parentID"]]; 
[childMapping removeMapping:[childMapping mappingForAttribute:@"parentOnlyProperty"]; 
[childMapping mapKeyPathsToAttributes:@"id", @"childID", @"child_only_property", @"childOnlyProperty"]; 
[[RKObjectManager sharedManager].mappingProvider setMapping:childMapping forKeyPath:@"child"]; 
+0

你解釋清楚爲什麼使孩子繼承其父映射沒有任何意義。謝謝 ! ;) – 2012-07-19 19:20:13