2011-09-05 58 views
0

我有5000個地區和城市對。我想把這5000個地區劃分爲Coredata。每個地區都有一個城市,每個城市都可以有很多地區。我有2個實體,即區和城市對。我如何有效地做到這一點?如何製作對象並正確使用coredata?

for (int i=0; i<[IndonesiaDistrictToSave count]; i++) { 

    int index; 
    for (int j=0; j<[[IndonesiaDistrictToSave objectAtIndex:i] length]; j++) { 
     if([[IndonesiaDistrictToSave objectAtIndex:i] characterAtIndex:j]==','){ 
      index=j; 
     } 
    } 

    NSString * DistrictName=[[IndonesiaDistrictToSave objectAtIndex:i] substringToIndex:index]; 
    NSString * CityName=[[IndonesiaDistrictToSave objectAtIndex:i] substringFromIndex:index+1]; 

    District * theDistrict = (District *)[GrabClass getObjectWithStringOfValue:DistrictName fromTable:@"District" withAttribut:@"Name"]; 
    theDistrict.City= (City *)[GrabClass getObjectWithStringOfValue:CityName fromTable:@"City" withAttribut:@"Name"]; 
} 

getObjectWithStringOfValue是查找該對象是否已經存在,它會返回它的方法,但如果對象不存在,這將是使一個新的,並返回

,然後我使用該代碼來保存所有印度尼西亞地區,現在有超過4500個地區,如果我使用時間間隔,每個地區我得到0.013773,但它仍然很慢,我怎麼能使它更快?

有沒有辦法獲得搜索結果的可變陣列代理?

+1

有一個以'-get *'開頭的函數的特殊用法。我建議你使用不同的前綴。 –

+0

Alexsander是對的:當我們在ManagedObject子類上使用-get *和-add *前綴方法時,遇到了很大的麻煩。 – vikingosegundo

回答

1

由於您似乎將您的實體視爲sql表,我相當懷疑您的提取是有效設置的。

核心數據不是SQL。實體不是表格。對象不是行。屬性不是列。關係不是連接。核心數據是一個對象圖管理系統,它可能會或可能不會持久化對象圖,並且可能會或可能不會在後臺使用SQL來做到這一點。試圖用SQL語言來思考覈心數據會導致你完全誤解核心數據,並導致很多悲傷和浪費時間。

如果您有一批可能的屬性值進行查找,請在謂詞中使用IN運算符來查找所有匹配項,例如

NSArray *newName=[NSArray arrayWithObject:@"Tom",@"Dick",@"Harry",nil]; 
NSPredicate *p=[NSPredicate predicateWithFormat:@"name NOT IN %@",newName]; 

...然後使用該謂詞進行提取。任何返回的對象在新數據中都有屬性值,您可以跳過爲它們創建新對象。

+0

我有5000個地區和城市對。我想把這5000個地區劃分爲Coredata。每個地區都有一個城市,每個城市都可以有很多地區。我有2個實體,即區和城市對。我如何有效地做到這一點? –

+0

我想最有效的方法是在sqlite存儲中填充一次,將其複製回Xcode項目並將其包含到捆綁包中。並在用戶設備上首次運行時,將其複製到「文檔」文件夾,因爲您無法更改軟件包中的任何內容。 – vikingosegundo

+0

你是否在開發中僅僅使用了一次商店,或者這是用戶經常需要做的事情? – TechZen