2012-01-03 68 views
0

在將其保存到核心數據之前,我們如何驗證上下文?我的想法是我應該有一些驗證之前,將其保存到核心數據,如果值不符合驗證coredata不應該保存值。舉例來說,我擁有像實體候選人的名字,班級,年齡等屬性。我應該驗證值不應該爲零。如果它是零,則不應保存其他值。如何在保存到核心數據之前驗證上下文中的值

任何人可以幫助我在這方面

編輯: 我只需要在保存時進行檢查,並應與核心數據進行

回答

0

我喜歡做包羅萬象的驗證在保存常規。在實際執行保存上下文的調用之前,請循環遍歷它的insertedObjects數組並確保它們符合您的要求。如果不是,您可以刪除它們或提醒用戶他們需要完成某些操作(如果後者退出該方法,請給用戶一個修復問題的機會)。

當您從某個文本框或複選框獲取值以指定給您的託管對象時,其他驗證應該位於輸入點。如果出現問題,請立即告知用戶。

也檢出NSNumberFormatter,它可以應用於字段,防止用戶做出不正確的條目開始。

+0

說例如,我需要一個屬性作爲關鍵,如果該屬性不是零,那麼只有上下文中的其他值應保存到核心數據。有沒有這樣的事情? @Wienke – Vijay 2012-01-03 03:21:07

+0

對,我誤解了你的問題。我已在下面發佈了另一個答案。 – Wienke 2012-01-05 17:54:01

0

Coredata在插入其值時驗證自身。在managedObject類中,我們可以編寫自定義驗證,以便coredata在保存值之前檢查驗證。如果該值無效,那麼上下文中的這些值將不會保存到coredata。

在這裏,我加入

@interface 
-(BOOL) validateForInsert:(NSError **)error; 

@implementation 
-(BOOL) validateForInsert:(NSError **)error { 
    // check the value of the field with validation 
    if(condition == true) { 
     return Yes; 
    } 
return NO; 
} 

(NSError **)是一個特殊的參數,使coredata調用此方法彷彿像一個委託方法

+0

這裏有一些困惑:保存對象是保存上下文中的對象 - 除非對象已經插入到上下文中,否則不會發生。此外,NSError不會調用該方法。您通過引用傳遞一個空的NSError,如果發生錯誤,該方法將填充它。 – Wienke 2012-01-05 18:24:06

0

對不起,我還沒有看過你的問題當我做出第一個答案時,小心謹慎。您沒有驗證個人帳戶的單個條目是否正確,相反,除非爲該對象填充了所有 attrs,否則不應保存更改。

縱觀蘋果的文檔「Model Object Validation」,你所關心的 - 特性的驗證,沒有屬性驗證,你是在正確的軌道上進行考慮使用validateForInsert:用於此目的的。

該文檔還提供了示例。這裏是一個可能的實現爲您所描述的特定實體:

- (BOOL)validateForInsert:(NSError **)error { 
if (self.name && self.class && self.age) 
    return [super validateForInsert:error]; 
else 
    return NO; 
} 

然而,這種方法發生在插入階段,而不是在保存階段。

如果您一次收集新實體的條目,則在插入階段進行驗證會有意義 - 如果該對象註定要被丟棄爲不完整,則不要向該上下文添加新對象。 如果您正在收集對現有對象進行更改的條目,並且您希望確保所有這些更改在接受任何更改之前一起工作,那麼validateForUpdate:就會有意義 - 但無法將對象恢復到其原始狀態除非通過在不保存的情況下重新打開上下文,除非您在其他地方緩存了原始值。 如果您想單獨收集attrs並在保存對象之前等待檢查它們全部完成,我認爲您會按照我第一次建議的方式執行操作:在實際保存上下文之前,循環上下文的insertedObjects並處理驗證。沒有現有的validateForSave:方法可以覆蓋,但可以添加一個方法。

您也可以結合使用這些技術:收集條目並創建新對象而不插入它們,但將所有這些對象緩存在數組中。當需要保存時,只需通過validateForInsert:即可遍歷緩存並將對象插入到上下文中;然後保存上下文。

很顯然,我正在和你一起學習,所以上面可能不完全是cookie。希望Apple文檔足以讓你開始。

+0

新的鏈接是:[對象驗證](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/ObjectValidation.html#//apple_ref/doc/uid/TP40001075-CH20-SW4 )。另外,在validateForInsert:的前兩行中,你混淆了屬性級驗證('[super validateForInsert:error]')和和屬性間或一致性驗證(self.name && self.class && self.age) 。首先進行屬性級驗證,然後*檢查一致性。隨着您的代碼現在,無論是名稱,班級還是年齡都無法設置。 – 2017-06-12 14:01:07