2013-02-15 27 views
2

我已經搜索過,仍然沒有發現任何相當有效的東西。問題/答案太舊了,或者它根本不適合我。這是我第一次嘗試「我自己的」應用程序。因爲它似乎是通過的權利,我正在製作一個清單應用程序。下面是我在尋找:iOS核心數據 - 更新多個記錄

我的數據存儲庫包含4個屬性:name, category, isChecked, isActive(更多必將隨之而來,因爲我擴大)

當我的視圖控制器最初的負荷,NSFetchedResultsControllerNSPredicate,僅檢索記錄其屬性isActive爲YES(或[NSNumber numberWithBool:YES)。然後它將這些記錄顯示給用戶的適當單元格。當用戶單擊一個單元時,Data Store會相應地更新並更改isChecked屬性。一切都很好,至此。

我現在需要做的是能夠從列表中刪除項目(1或更多)。具體而言,我需要它將數據存儲屬性isCheckedisActive更新爲NO,只有當它的當前isChecked屬性爲YES時。 (我並不想從數據存儲刪除記錄,因爲它們將被用來建立,爲用戶未來使用的數據庫。)

我用過,除其他事項外:

[[[self fetchedResultsController] fetchedObjects] 
    setValue:[NSNumber numberWithBool:NO] 
    forKey:@"isChecked"]; 

這確實有效,它會刪除選中標記並相應地更新商店。問題是,我不僅向isActive項目的數據存儲庫發出另一個請求,還會搜索已提取的整個「活動列表」,並將它們的每個isChecked屬性設置爲「否」。這對於小列表來說可能不是太大,但是隨着列表的擴展,這可能是一個問題。

另一個問題是,如果我添加:(以及同樣的方法中的第二數據存儲請求)

[[[self fetchedResultsController] fetchedObjects] 
    setValue:[NSNumber numberWithBool:NO] 
    forKey:@"isActive"]; 

它集我名單中所有項目沒有

所以我問題是:如何才能通過列表,找到僅檢查的項目並只更新那些記錄(同時設置isChecked & & isActive attributes = NO),其isChecked屬性爲YES,而不是遍歷整個列表?我試過創建一個單獨的fetchedResultsController專門爲這個按鈕操作,它確實工作(也就是說,它沒有崩潰),但調試器彈出一個相當大的'嚴重的應用程序錯誤'。我不會發布錯誤消息,因爲它很長,很可能與任何解決方案無關。

任何援助將不勝感激。預先感謝,請溫柔: - ]。

編輯

我已經使用for循環,for (NSString *item in fetchedResultsController)嘗試,但我得到的錯誤...may not respond to 'countByEnumeratingWithState:objects:count'

看來各種各樣的循環是這裏的所需要的,但同樣,沒有什麼我能找到的有關或者已經過時了。再次感謝您的幫助。

編輯2

這裏是原來的錯誤我,當我跑第二個單獨的fetchRequestController此按鈕/方法:

An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (4) must be equal to the number of rows contained in that section before the update (4), plus or minus the number of rows inserted or deleted from that section (0 inserted, 3 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). with userInfo (null)

回答

2

你可以在fetchedObjects收集循環,更改託管對象。改變它們之後,你需要重新加載你的列表(我猜你使用了tableview)。

我不知道你的類是如何命名的,但是通常你可以遍歷託管對象的集合並改變它們。請記住,如果要在應用關閉時保留這些更改,則需要保存託管對象上下文。

NSArray* myCollection = [[self fetchedResultsController] fetchedObjects]; 
for(ActiveListData *managedObject in myCollection) 
{ 
    if(managedObject != nil && managedObject.isChecked) 
    { 
     managedObject.isChecked = NO; 
     managedObject.isActive = NO; 
    } 
} 

如果你想要做的數據庫中的所有對象的檢查,你需要在你的NSFetchedResultsController具有謂詞檢查器isChecked,然後遍歷和編輯結果集的新方法。

您可能想要發佈您的錯誤代碼,因爲我們可以指出您做錯了什麼。

編輯:如果你不熟悉使用核心數據的蘋果文檔提供了大量的信息:http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/CoreData/Articles/cdBasics.html

+0

我想這一點,使用'ActiveListData'這是我NSManaged子類的名稱,但得到了錯誤'異常在覈心數據更改處理期間被捕獲。這通常是NSManagedObjectContextObjecsDidChangeNotification觀察者中的一個錯誤。 userInfo(null)在索引0處的索引3處沒有對象。查看我的編輯上面的原始錯誤,我爲此創建了一個單獨的「fetchRequestController」。 – 2013-02-15 09:19:30

+0

是啊,我看着蘋果開發文檔和有信息的TON,但一大堆的理論都要經過找一個實際的例子(如果有曾經是一個例子)。至少在這裏,我可以把我需要的東西放到一個環境中,並得到一個相對直接的答案。我讀了開發文檔盡我所能,但它並不總是最容易的地方的答案 – 2013-02-15 09:25:47

+0

是什麼fetchedObjects返回?它是一個NSArray? – ggfela 2013-02-15 09:44:19

1

感謝@ggfela他的回答。他的回答過程是現場。下面是實際的代碼,我把我的按鈕/方法,在幫助別人,將來別人的,希望:

NSArray *moc = [[self fetchedResultsController] fetchedObjects]; 

for (ActiveListData *item in moc) { 
    if (item != nil && item.isChecked.boolValue == 1) { 
     item.isChecked = [NSNumber numberWithBool:NO]; 
     item.isActive = [NSNumber numberWithBool:NO]; 
    } 
} 

// Call to Data Store to update the list 
NSError *error; 
if (![self.managedObjectContext save:&error]) { 
    FATAL_CORE_DATA_ERROR(error); 
    return; 

說明:

負荷的結果從調用fetchedResultsController方法的內容到一個名爲moc的臨時變量

使用for循環來循環訪問moc的數組。 ActiveListData是我爲Core Data創建的NSManagedObject子類,它是從數據存儲中插入分隔值/屬性的適當位置。從那裏,這很簡單,我確保item不是nil,並且該項目的屬性是我需要的值。

注意

核心數據不存儲布爾值YES和NO,而是1和0,但是當你打電話或者比較值,你根本就不是因爲它是比較item.isChecked值作爲一個bool而不是一個整數傳回給你。你不能簡單地比較item.isChecked == YES,因爲@propertyisCheckedNSNumber。因此,在if的情況下,我放入item.isChecked.boolValue,因爲這會給出它的bool值的表示整數,在這種情況下,我會檢查它是否爲1(是)。 (很抱歉,如果我的解釋是錯誤的和/或混亂,但是這是我的理解它,是這個代碼工作的唯一方式。)

然後,設置這些屬性的新值,就像設置任何時候,你會期望其他變量。這個唯一的「刁鑽」的區別是,NSManagedObject子類設置isCheckedisActive@propertyNSNumber(如前所述),所以爲了正確的價值觀發送回核心數據使用NSNumber類的方法numberWithBool

以防萬一有人被我的FATAL_CORE_DATA_ERROR(error)呼叫混淆這很簡單,就是在該Prefix.pch文件中定義爲從managedObjectContext處理我的錯誤的宏。您可以使用您選擇的任何(或全部)錯誤處理。

再次感謝@ggfela您的幫助!如果其他人有關於如何應用此代碼的其他建議,請讓我知道!

+0

幹得好,我完全忘了CoreData使用NSNumbers代替布爾值。 – ggfela 2013-02-17 08:57:09