0

次の問題があります。

ルート ビューとして 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 を設定するためにアプリ デリゲートの設定を変更する必要がありますか?

ありがとう!

4

5 に答える 5

1

あなたの問題の言い方から、ある種の混乱が疑われます。

そのpersistentStoreは、再起動するたびに変化しています。これはよくあるケースですか?

はい、そうです!NSPersistentStore は、他のオブジェクトと同様に Objective-C オブジェクトです。そのため、起動間で永続的ではありません。毎回再作成する必要があります。

NSPersistentStore について永続的なのは、それが指すファイルです。ただし、アプリケーションを実行するたびに、新しい NSPersistentStore オブジェクトを再作成する必要があります。おそらく同じファイルを指すようにします (url引数で定義された へinitWithPersistentStoreCoordinator:configurationName:URL:options:)。

storeURLでは、どのように変数を設定しますか?

于 2011-09-07T11:36:33.937 に答える
0

Xcode テンプレートの Window ベースのアプリケーションを見てください。

これにより、Core-Data スタック全体 (永続ストア、永続ストア コーディネーター、および管理対象オブジェクト コンテキスト) が作成されます。

アプリケーションで特に必要としない場合、永続ストアは 1 つだけにする必要があります。これは、事実上、データが書き込まれるファイルです。コードを見ると、データを保存するたびに独自のストアを作成しようとしているようです。

上記で提案したテンプレートからコア データ スタック メソッドをコピーする必要があります。永続ストアまたは永続ストア コーディネーターを自分で参照する必要はありません。必要なのは、アプリ デリゲートによって作成されたマネージド オブジェクト コンテキストだけです。

于 2011-09-06T22:23:03.603 に答える
0

管理オブジェクト コンテキストを保存するには、新しい永続ストアを追加した後、アプリを閉じる前に、NSManagedObjectContext の「save:」メソッドを使用します。次に、永続ストアが適切に追加されたかどうかを確認するには、NSPersistentStoreCoordinator の「persistentStores」メソッドを使用して、利用可能な有効なストアを特定します。

于 2011-09-07T11:16:28.887 に答える
0

単純に簡単でした。

addPersistentStoreWithTypeこのストアからデータをフェッチしようとしたビューで、再起動後に設定しませんでした。

この投稿で申し訳ありません。シンプルに簡単 ;-)頭を壁にぶつける

于 2011-09-07T12:45:13.677 に答える
0

問題は Core Data 呼び出しではないのでしょうか?

「アプリを閉じて再起動」すると…途中でアプリが終了したり、バックグラウンドになったりしますか?App Delegate で呼び出されるものに微妙に影響する IIRC。物事がどのように配置されているかに応じて、WRT Core Data で、何かが誤って呼び出されている (または見逃されている) 可能性があります。

App Delegate (またはそれらが配置されている可能性がある場所) 内のすべての単一の Core Data 関連メソッドをトレースするとどうなるかを見て、より赤字でそれをキャッチできるかどうかを確認したいと思います。(どこかに投稿された最小限のテスト ケースがある場合は、共有してください!)

于 2011-09-07T12:10:29.917 に答える