1

我为我的项目定义了一个核心数据并实现了一个名为isRealEntry.

@interface FTRecord : NSManagedObject

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

@end

现在当我保存上下文时(NSManagedObjectContext *context;

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

我只想保存那些具有 true 的实体isRealEntry,否则该条目将被忽略或撤消。

我怎样才能做到这一点?

更新:

起初,我发现 Martin 的解决方案非常有前途。但是,当我在进入后台保存数据时,我得到了一个非常讨厌的副作用:

- (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 确定每个单元格的内容。因此,我需要为 getAllRecords 设置与 tableView 中相同的值,否则它会崩溃。

另一种建议的解决方案在内存和数据库中有两个来源似乎也不可能,我如何为一个 TableView 提供两个来源?

更新 2:

我有一个令人尴尬的疏忽。从上下文中删除记录是不够的。我还必须从数组中删除它。

[allRecords removeObjectIdenticalTo:record];

因此我收回它。Martin 的解决方案非常完美。但是,我仍然很想知道 UITableView 是否确实可以按照其他解决方案中的建议从两个源(数据库/内存)驱动。谢谢

4

3 回答 3

2

我之前不得不做类似的事情,我接近它的方式是为我要持久化的项目提供一个单独的托管对象上下文,而另一个只用于仅保留在内存中的项目。

我通过拥有一个单独的持久存储协调器以及一个仅在内存中的单独的托管对象上下文来解决这个问题,因此当将项目保存到其中时,它们不会像您所描述的那样被持久保存到数据库中作为真实项目。

您可以像这样创建内存持久存储协调器:

inMemoryPersistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

[inMemoryPersistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType 配置:nil URL:nil 选项:nil 错误:&error];

如果要将非真实项目更改为真实项目,可以将它们复制到其他托管对象上下文中,该上下文将在保存项目时将其持久保存到数据库中。

这里明显的问题是搜索是在单个托管对象上下文中完成的,因此如果您希望搜索持久对象和内存对象,那么您需要按照 Arkadiusz 在他的回答中建议的内容做更多的事情。

于 2013-10-11T17:48:28.913 回答
0

我不相信有内置的方法可以做到这一点。我相信您要么必须在保存之前删除它们,要么编写清理代码以便稍后查找和删除它们。

于 2013-10-11T17:16:44.163 回答
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];
        }
    }
}

(我从未在实际项目中这样做过,但我构建了一个小型测试应用程序,它似乎可以工作。)

于 2013-10-11T17:34:40.027 回答