1

プロジェクトの Core Data を定義し、 という ENtity:attribute を実装しました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 は、各セルのコンテンツの上を決定します。したがって、tableView と同じ値を getAllRecords に設定する必要があります。そうしないとクラッシュします。

メモリ内とデータベース内の 2 つのソースを使用する他の提案されたソリューションも可能ではないようです。1 つの TableView に 2 つのソースを供給するにはどうすればよいですか?

更新 2:

恥ずかしい見落としがありました。コンテキストからレコードを削除するだけでは不十分です。また、配列から削除する必要がありました。

[allRecords removeObjectIdenticalTo:record];

したがって、私はそれを取り戻します。マーティンのソリューションは完璧に機能します。ただし、他のソリューションで提案されているように、UITableView を実際に 2 つのソース (db/memory) から駆動できるかどうかを知りたいと思っています。ありがとう

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

管理対象オブジェクトのコンテキストを保存すると、そのコンテキストに加えられたすべての変更が保存されます。一部のオブジェクトを保存操作から除外することはできません。

「非現実的な」オブジェクトへのすべての変更を元に戻すには、サブクラスの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 に答える
0

これを行うための組み込みの方法があるとは思いません。保存する前にそれらを削除するか、クリーンアップ コードを記述して後で見つけて削除する必要があると思います。

于 2013-10-11T17:16:44.163 に答える