2013-10-11 27 views
1

我已經爲我的項目定義了一個核心數據,並實施了一個稱爲isRealEntry的ENtity:屬性。如何自定義保存在覈心數據?

@interface FTRecord : NSManagedObject 

@property (nonatomic) NSTimeInterval lastUpdated; 
@property (nonatomic) BOOL isRealEntry; 

@end 

現在,當我保存上下文(NSManagedObjectContext *context;

NSError *error = nil; 
BOOL successful = [context save:&error]; 

我想只保存具有真isRealEntry的實體,否則條目將被忽略或撤消。

我該如何做到這一點?

更新:

起初,我發現馬丁的解決方案非常有前途的。不過,我得到一個非常討厭的副作用,當我保存在進入後臺我的數據:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    [[FTRecordStore sharedStore] saveChanges]; 
} 

當我恢復應用程序,所有以前刪除的記錄不會永遠消失真實的,但標記將被刪除。該陣列似乎仍然擁有所有這些(在我的情況下是真實還是不真實)。這些單元格完全堅固並且對所有記錄顯示爲空。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    FTRecord *record = [[[FTRecordStore sharedStore] getAllRecords] objectAtIndex:[indexPath row]]; 

FTRecordCellView *cell = [tableView dequeueReusableCellWithIdentifier:@"FTRecordCellView"]; 

    [[cell notesLabel] setText:[record notes]]; 

return cell; 
} 

我不知道如何解決這個問題。我的商店是一個單身人士。 getAllRecords決定每個單元格的內容。因此,我需要在tableView中具有與getAllRecords相同的值,否則會崩潰。

其他建議解決方案有兩個來源之一在內存和分貝似乎也不可能,我如何提供一個TableView與兩個來源?

更新2:

我有一個尷尬的監督。從上下文中刪除記錄是不夠的。我也必須從數組中刪除它。

[allRecords removeObjectIdenticalTo:record]; 

因此我收回。馬丁的解決方案是完美的。但是我仍然很想知道,如果其他解決方案中提出的UITableView確實可以從兩個源(db/memory)驅動。謝謝

回答

0

保存管理對象上下文保存全部對該上下文進行的更改。 不能從保存操作中排除某些對象。

要撤消所有更改「虛幻」的對象,你可以實現的NSManagedObject子類的willSave 方法:

- (void)willSave 
{ 
    if (![self.isRealEntry boolValue]) { 
     if (self.isInserted) { 
      // Object was inserted, remove it again: 
      [self.managedObjectContext deleteObject:self]; 
     } else if (self.isUpdated) { 
      // Object was modified, undo all changes: 
      [self.managedObjectContext refreshObject:self mergeChanges:NO]; 
     } 
    } 
} 

(我從來沒有在一個真正的項目做了這一點,但我建立了一個小測試應用程序和 它似乎工作。)

+0

對不起馬丁,你警告,這引起了一些問題,我在我的更新都給予。你有關於UITableView共享兩個資源(內存/分貝)的其他想法嗎? – Houman

+0

@Kave:看一看http://stackoverflow.com/questions/14004055/how-to-use-core-data-models-without-saving-them/14005159#14005159。這與Duncan的建議類似,但只使用一個託管對象上下文和兩個存儲:「真實」對象分配給SQLite存儲,「虛幻」對象分配給內存存儲。 –

0

我不認爲有內置的方式來做到這一點。我相信你要麼在保存之前刪除它們,要麼編寫清理代碼來稍後查找並刪除它們。

2

我不得不做只停留在內存的項目之前,類似這樣的東西,我走近它是有項目,我打算堅持一個單獨的管理對象上下文的方式,和其他。

我通過擁有獨立的持久性存儲cordinator以及僅存在於內存中的單獨的託管對象上下文來解決這個問題,因此當項目保存到其中時,它們不會與您所描述的一起持久保存到數據庫作爲真實的物品。

可以創建一個在memeory持久存儲協調器是這樣的:

inMemoryPersistentStoreCoordinator = [[NSPersistentStoreCoordinator的alloc] initWithManagedObjectModel:[自managedObjectModel]];

[inMemoryPersistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:& error];

如果你想改變非實時物品進入真正的項目,你可以將它們複製到時,它的保存,這將持續的項目數據庫中的其他管理對象上下文。

這裏的一個顯而易見的問題是,搜索是在單個託管對象上下文上完成的,因此如果您希望通過持久存儲器和內存對象進行搜索,那麼您需要按照Arkadiusz在其答案中建議的內容。

+1

+1。您甚至可以使用* one * context,* one * persistent store coordinator和* 2 * stores(內存中的sqlite +),然後將對象與一個商店或另一個商店相關聯:http://stackoverflow.com/a/14005159/1187415。 - 很明顯,我從一年前就忘記了自己的答案:-) –

+0

感謝Martin,很好的補充!我沒有意識到你可以這樣做 – Duncan

+0

雖然這是一個有效的解決方案,但我相信Martin接受的其他解決方案並不複雜。重寫'WillSave'遠比控制兩組存儲更可行。 :) – Houman