2017-01-17 10 views
0

この問題は、まれであり断続的ですが、非常に問題です。コアデータ/ SQLiteストア臨時データ損失

CoreDataをsqlite永続ストアとともに使用し、[ほとんどの場合は]完全に動作するアプリがあります。しかし、私は時々見つけられないデータ損失の報告を受けています。

コアデータ項目が変更されると、我々は次の呼び出しとそれを持続:

- (void) saveContext 
{ 
    if ([context hasChanges]) 
    { 
     NSError *error = nil; 
     if (![context save:&error]) 
     { 
      NSLog(@"Failed to save context: %@", error); 
      [self displayValidationError:error]; 
     } 
    } 
} 

私の質問センターコンテンツの保存を考えると、一度このメソッドが呼び出された、かどうかの周りに、さ最終的に、またはキャッシュの一部が失われる可能性があります。

この問題は、一連の項目を入力した後にアプリがバックグラウンドになっているときに発生すると思われます。アプリがユーザーによって強制終了された場合、データが失われる可能性があります。これは、ユーザーがしばらくの間、アプリのままにしておき、多分何かのためにデバイスを使用するときに発生するようです。

私はAppDelegate(applicationwillTerminateとapplicationWillResignActive)からsaveContextを呼び出します。

だから、私の質問:

  • は、持続性を確保するための適切なAppDelegateから呼び出していますか?
  • 上記のsaveContextの呼び出しが行われたときに、保存されていないすべてのエンティティがディスクにフラッシュされることを保証するために必要なことはありますか?
  • 私はこれを引き起こしている可能性のあるものを見落としていますか?

TIAを参照してください。私は私の問題に似たようなものはほとんど見つけられませんでした。

答えて

0

AppDelegateからの呼び出しは永続性を保証するのに十分ですか?

applicationWillTerminateが呼ばれるという保証はありません。あなたのアプリが保存されていないデータを持っていて、iOSがアプリを終了させた場合(それはしばらくバックグラウンドにいたため)、その方法に頼ることはできません。

上記のsaveContextを呼び出すと、保存されていないすべてのエンティティがディスクにフラッシュされることを保証するために必要なことはありますか?

「永続ストアに一括変更」という呼び出しはありません。それを保存することですが、適切な時に保存する必要があります。

を失いたくないデータがある場合は、いつでも変更をに保存する必要があります。システムイベントに依存するということは、保存されていない変更を残していることを意味します。保存したい変更がある場合は、保存した時点で保存してください。

関連する問題