次の問題があります。
ルート ビューとして UITableView を持つアプリがあります。この tableView にはさまざまなエントリがあり、エントリ (ユーザーが作成できます) ごとに、persistentstore もアプリに追加します。
そのため、アプリをゼロから開始して (保存されたデータなどはありません)、エントリを追加すると、persistentStore も作成され、tableViewCell をクリックすると、この生成された persistStore にデータを保存できます。これは、エントリを作成していて、1 回の実行中にエントリを監視している場合でも問題なく機能します。
しかし
アプリを閉じて再起動すると、同じエントリをクリックすると、次のエラー メッセージが表示されます。
NSFetchRequest *allUsers = [[NSFetchRequest alloc] init];
[allUsers setAffectedStores:[NSArray arrayWithObject:[[self.tableViewContext persistentStoreCoordinator] persistentStoreForURL:storeURL]]];
* キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '* -[NSArray initWithObjects:count:]: オブジェクト [0] に nil オブジェクトを挿入しようとしています'
したがって、実際には nil であるストアを追加したいと思われます。これは、システムがこの指定された storeURL の下にストアを見つけることができないためです (これは、最初の実行でストアを作成したストアと同じです)。 .
したがって、persistentStore は 2 回目の実行では存在しないと思います。そのため、作成された最初の実行では適切に保存されません。
では、persistentStore を追加した後、persistentStoreCoordinator に保存するにはどうすればよいでしょうか?
アップデート:
私は主な問題を特定したと思います。最初の実行後に、persistentStoreCoordinator が変更されました。では、アプリを閉じる前にこれらすべて (managedObjectContext、persistentStoreCoordinator) を保存するにはどうすればよいでしょうか?
誰か助けてくれませんか?
更新 2
ストアを作成する方法は次のとおりです。
NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [searchPaths objectAtIndex:0];
NSString* storeFileName = [NSString stringWithFormat:@"%@",newItem.name];
NSURL *storeURL = [NSURL fileURLWithPath:[documentPath stringByAppendingPathComponent:storeFileName]];
NSError* saveToStoreError;
if(![[self.addContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&saveToStoreError]){
NSLog(@"Error: %@, %@", saveToStoreError, [saveToStoreError userInfo]);
abort();
}
else
{
NSError *saveStoreError;
if(![self.addContext save:&saveStoreError])
{
NSLog(@"Saving Data wasn't possible!");
}
}
Update 3 だから、多くのテストの後、ここに私の結果があります:
- ストアの作成は正常に機能します。アプリを 1 回実行している限り、複数のストアを作成し、それらにアクセスしてデータを取り込むことができます。
そのため、アプリを再起動すると何かが変わります。エラーは、managedObjectContext、persistentStoreCoordinator、またはストアの保存に関連付けられている必要があると思います。
managedObjectContext または persistentStoreCoordinator を設定するためにアプリ デリゲートの設定を変更する必要がありますか?
ありがとう!