2013-04-12 8 views
6

私はすでに数時間を費やしており、解決策を見つけることができません。コアデータの不一致 - 取得時に何も返さない場合があります。

  • コアデータ
  • コアデータを自動保存がUIManagedDocumentからManagedContextが格納されている
  • になったUIManagedDocumentから初期化されるとのObjective-CのiOS 6アプリを:私が持っていないものを第一に、いくつかの仕様静的変数に入れて、アプリケーション全体で再利用
  • このアプリはRestKitを使用しています。私はそれが提供するActiveRecordカテゴリを利用しています。

チームエンティティのモデルがあります。このアプリには、バックエンドからチームをロードするチームリストビューコントローラがあります。バックエンドは、とりわけチームIDを含むJSON配列を返します。モデルのIDフィールドにこのIDを格納し、サーバレスポンスを反復しながら、指定されたIDのチームがすでに存在するかどうか調べます。もしそうであれば、私はその情報を更新し、オブジェクトを渡します。もしそうでなければ、最初に作成します。

これは奇妙に変わるところです。これは90%の時間で動作します。私はチームリストコントローラを読み込んで、アプリケーションにさらに進んで、コントローラに戻って(データを再度ロードする)、大部分は大丈夫です。しかし、しばらくの間、私のフェッチ要求は何も返しません。次のように:

NSArray *results = [context executeFetchRequest:request error:&error]; 

は空の配列を返し、エラーも空です。サーバー上の何も変化していません。私はそれをデバッグしようとする要求は、次のようになります。私は、外部アプリでのsqliteストアをプレビューすると、私はこのIDのためにチームの項目が存在していることがわかります

<NSFetchRequest: 0x127a0e20> (entity: Team; predicate: (id == "123"); sortDescriptors: ((null)); limit: 1; type: NSManagedObjectResultType;) 

、およびその他の90%でそれが実際にロードされる時間。

2013-04-12 12:00:27.934 SportLink[10831:c07] CoreData: annotation: fetch using 
NSSQLiteStatement <0x12656d10> on entity 'Team' with sql text 'SELECT 0, t0.Z_PK, 
t0.Z_OPT, t0.ZACI1, t0.ZACI2, t0.ZACI3, t0.ZALTFIRSTNAME, t0.ZALTSECONDNAME, t0.ZCOLOR1, 
t0.ZCOLOR2, t0.ZGENDER, t0.ZICON, t0.ZID, t0.ZLOCATION, t0.ZLOGO1, t0.ZLOGO2, t0.ZNAME, 
t0.ZTYPE, t0.ZSPORT FROM ZTEAM t0 WHERE t0.ZID = ? LIMIT 133' returned 6 rows 

バッキングストアが実際にデータをフェッチしますが、何らかの理由でそれに沿って通過しなかったことを意味している:私は私が見ることができる上SQLDEBUGになってきたとき、さらに奇妙なものです。今:

    私はメインスレッドですべてをやっている
  • ので、これはこれでも起こることができるので、私はアプリを閉じて、それを開いたとき、私は自動保存も問題ではないと信じている問題
  • ではありませんデータはすでに存在しています。

ここで何が起こっているのですか?

編集:Instrumentsでアプリのプロファイルを作成しました。私はちょうど問題のあるVCに入ってから、その子コントローラに入り、葉っぱをして、問題が現れ始めるまでこれを数回繰り返しました。ここに結果があります。多分ここから何が起こっているのか知ることが容易になります。

Instruments output

+0

「TeamListVC」でリクエストを発砲するのはいつですか?結果が読み込まれたら何をしていますか?あなたはもう少しトレースするよう要求した後、さらに '[results count]'を記録することができます。 – flashfabrixx

+0

メインコンテキストのstalenessIntervalを0に設定してみてください –

+0

@ DanShelly残念ながら、これは役に立ちませんでした。 – mav

答えて

5

調査の数日後、私は最終的にこのバグの原因を発見しました。チームのエンティティをフェッチしたコードは次のように見えた:

Team *team = [Team findFirstByAttribute:WSK_ID withValue:data[WSK_ID] inContext:moc]; 

WSK_IDがちょうど@"id"のために定義しています。dataは、私がRestKitからJSONレスポンスから得た辞書です。どのタイプにもキャストされていなかったので、おそらくNSStringでしたが、チームエンティティのidプロパティはNSNumberを期待していました。時には何が失敗するのか分かりませんが、このビットを次のように変更します。

Team *team = [Team findFirstByAttribute:WSK_ID withValue:@([data[WSK_ID] intValue]) inContext:moc]; 

ID文字列をintにキャストし、NSNumberでボクシングすると問題が解決されました。

+0

iOS上のSqlite3は、Interop、型変換などに関してCoreDataを使用するかどうかにかかわらず、本当にひどいです。私の経験では、CoreDataはシンプルなシナリオで役に立ちますが、特定のデータを隠すことによって複雑さも増していることがわかりました。 – Brandon

関連する問題