2013-01-03 91 views
5

我已經開始使用CoreData編寫iPhone應用程序,並嘗試儘可能地維護我的代碼庫。因此,我想避免硬編碼字符串,如:CoreData NSPredicate屬性名稱

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", aName]; 

相反,我希望能夠寫類似:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", Person.name, aName]; 

這樣,我會得到編譯器檢查是否name是實體Person的財產,並避免拼寫錯誤。

有了這個代碼,雖然我在編譯時得到以下錯誤: 房產name的類型NSManagedObject類型的Person

Person感和Xcode的從我的MyApp.xcdatamodeld自動生成的對象沒有找到。

namePerson

我GOOGLE了起來,已經SOed了相當多的答案,這個具體問題的實體的一個簡單的字符串屬性。我也嘗試過使用property_getNameNSPropertyDescription,但目前爲止還不成功。

在此先感謝您的幫助,

Joss。

+0

它不會這樣工作,您仍然必須爲'@ K'參數提供'@「名稱''。 – Joe

回答

4

如果你使用Mogenerator,每Kendall的指教,在自動生成的類,你會得到在頭聲明瞭三個struct秒 - EntityNameAttributesEntityNameRelationshipsEntityNameFetchedProperties。例如,如果您的實體名稱爲Person,並且具有屬性name,則可以使用PersonAttributes.name訪問密鑰。這將允許您避免在應用程序代碼中使用硬編碼的密鑰名稱。

+0

我不知道這是包含在默認模板中。那是確定的方式。很好的答案!喬斯,你應該接受這個答案(點擊左邊的複選標記,它會標記爲已接受)。 –

+0

@KendallHelmstetterGelner謝謝你! –

+0

@CarlVeazey:精彩的回答!正是我在找什麼。那是我的第一個問題,真的很開心! – Joss

4

首先,Person.name不存在,因爲「名稱」是個人實例的屬性,而不是類級屬性。

我不確定從編譯器檢查的方法名稱到字符串有一個非常清晰的路徑。您始終可以使用較低級別的方法來訪問類中的方法簽名,並從中獲取字符串,但這些方法的起點是未檢查的字符串(C或ObjC)。

如果名稱錯誤,通常使用謂詞會導致錯誤,因此任何使用謂詞的測試都會驗證您的方法名是否正確。

您應該使用Mogenerator生成數據對象以便與您的模型一起使用。在這種情況下,您可以考慮更改模板以添加名爲「stringForMethodNamed * Name *」的方法,並將其作爲格式化謂詞中的一個參數。

+0

感謝您的全面解答肯德爾!我剛剛聽說Mogenerator ;-)。我想是時候看看它了。我希望我能投票答覆你的答案。儘管如此,我還是一個小菜鳥,沒有足夠的聲望。 – Joss

+0

不用擔心,如果您接受答案,您將獲得一定的聲譽。 –