0

読み取り専用の Core Data データベースを使用するアプリがあります (つまり、データベースに書き込むことはありません)。いくつかのコア データ エンティティを取得してテーブルに表示するビュー コントローラーがあります。たとえば、 という名前のコア データ エンティティがPhotoあり、View Controller には、たとえば@property (nonatomic, strong) NSArray *photos;Photo オブジェクトのリストである があります。

アプリが新しく起動すると、すべてが正常に機能するようになりました。しかし、そのビューに移動してアプリを終了し(まだバックグラウンドにあるため)、再入力すると、@property設定したのは になりnilます。現在もすべてUITableViewCellの が画面に表示されています。ただし、スクロールしようとすると、アプリがクラッシュします。

Core Data を使用する複数のビューがありますが、一部は問題なく動作します。@propertyアプリがフォアグラウンドに戻ったときに、一部のビュー コントローラーで Core Data オブジェクトの設定が消えてしまうのはなぜだろうと思っています。

ありがとう!

4

2 に答える 2

1

NSFetchedResultsController最初の推奨事項:配列ではなくを使用する必要があります。これははるかに効率的であり、他の多くの利点に加えて、メモリに関するすべての考慮事項を処理します。実際のところ、datasourceCore Data に基づいてテーブル ビューを管理するために特別に設計されました。

それでも配列を使用したい場合は、適切に初期化できなかったと推測されます。

メソッドでは、viewDidLoadコア データから取得した結果を割り当てるだけでなく、適切な初期化を行ってください。

self.photos = [[NSArray alloc] initWithArray:coreDataResults];

これで、配列が持続するはずです。

于 2012-07-31T07:32:55.780 に答える
0

私は自分のコードの何が問題なのかを理解したと思います。だからこれは私がコアデータのものをフェッチするためにしたことです:

[DatabaseHelper openDatabase:@"database" usingBlock:^(UIManagedDocument *document) {
     NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Shop"];
     request.predicate = [NSPredicate predicateWithFormat:@"ecategory = %@", self.category];
     NSError *error = nil;
     NSArray *matches = [document.managedObjectContext executeFetchRequest:request error:&error];
     self.shops = matches;
     [self updateTable];
}];

これは結果を正しくフェッチしますが、問題は、Core Dataオブジェクトを保持していると思いますが、実際にはに属しているため、UIManagedDocumentContext保持していなかったことです。そのため、アプリがフォアグラウンドに戻ると、コンテキストがなくなり、コアデータオブジェクトがnilになります。

だから私がしたことは、新しいプロパティを宣言することです:@property (nonatomic, strong) UIManagedDocument *database;そしてself.database = document;ブロックに設定します。これで、コントローラーはコンテキストを保持し、すべてが正常に機能します。

于 2012-07-31T15:45:24.017 に答える