我为我的项目定义了一个核心数据,并实现了一个名为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];
因此我收回了它。 Martin的解决方案非常完美。但是我仍然很想知道UITableView是否确实可以从其他解决方案中建议的两个源(db / memory)驱动。感谢
答案 0 :(得分:2)
我以前必须做类似的事情,我接触它的方式是为我要坚持的项目设置一个单独的托管对象上下文,另一个用于仅留在内存中的项目。
我通过拥有一个单独的持久存储cordinator以及仅在内存中的单独的托管对象上下文来实现它,因此当项目保存到其中时,它们不会被持久化到数据库中真实物品。
您可以像这样创建一个内存持久性商店协调员:
inMemoryPersistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
[inMemoryPersistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:& error];
如果要将非实际项目更改为实际项目,可以将它们复制到其他托管对象上下文中,这样可以在项目保存时将项目保留到数据库中。
这里显而易见的问题是搜索是在一个托管对象上下文中完成的,所以如果你希望搜索持久化和内存中的对象,那么你需要做更多的事情,就像Arkadiusz在他的回答中所建议的那样。
答案 1 :(得分:0)
我不相信有一种内置的方法可以做到这一点。我相信你要么在保存之前删除它们,要么写清理代码以便以后查找和删除它们。
答案 2 :(得分:0)
保存托管对象上下文会将所有更改保存到该上下文中。你不能 从保存操作中排除一些对象。
要撤消对“虚幻”对象的所有更改,您可以实现willSave
NSManagedObject
子类的方法:
- (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];
}
}
}
(我从来没有在一个真实的项目中做到这一点,但我建立了一个小的测试应用程序和 它似乎工作。)