2012-05-06 10 views
0

私はデータをループするコアデータインポーターを持ち、インポートプロセス中に重複するレコードを無視します。奇妙なコア保存されていないデータをフェッチするときのデータの振る舞い

しかし、NSFetchRequestが保存されていない最近格納されたレコードと一致しないことがわかりました。そして、私は一見同一のクエリが異なる予期しない結果をもたらしているのを見ています。同様に、それらの両方が一致した後 -

fetchTest.predicate = [NSPredicate predicateWithFormat:@"%K = %@", @"intEmployee_id", @"3882"]; 

しかし:

fetchTest.predicate = [NSPredicate predicateWithFormat:@"%K = 3882", @"intEmployee_id"]; 

しかし、この一見同じ1にはない:

は例えば、私のテストでは、私は、このクエリが一致し、結果を返したことを発見しましたコンテキストは永続ストアに保存されます。

アップルのドキュメントによると、フェッチはデフォルトで保留中の変更に対して機能し、実際には[fetchTest includesPendingChanges] = YESに適合しています。

何が地球上で何が起こっているのですか?これらの2つのフェッチがどのように異なる結果を返すことは可能でしょうか?

答えて

1

多分、従業員IDは文字列ではなく数字ですか?そして、述語は次のようになります。これは、不安定な動作は、種類を混合から来ていることを暗示する

[NSPredicate predicateWithFormat:@"%K = %@", @"intEmployee_id", 
              [NSNumber numberWithInt:3882]]; 

。 SQLiteドキュメントでは、実際にデータを物理的に格納する際にSQLiteが実際には区別しないので、たとえ誤っていても何とかしても機能します。

SQLite WebサイトのDistinctive Features of SQLiteマニフェストタイピングという見出しの項目を参照してください。

+0

私はあなたが何かをしているかもしれないと思います...私はタイプによって区別されないSQLiteに慣れています。下のデータフィールドが数。 – radven

+0

これはそれでなければなりません。コアデータは意図的にデータベースレイヤーを隠します。あなたが予期している行動は予測できません。 IDを照会する適切な方法は上記のコードです。それを試して、それが問題を解決すれば教えてください。 – Mundi

1

これらは実際には同じ値に評価されません。

[NSPredicate predicateWithFormat:@"%K = 3882", @"intEmployee_id"] 

[NSPredicate predicateWithFormat:@"%K = %@", @"intEmployee_id", @"3882"] 

intEmployee_id = "3882"

に番号の代わりにIDの文字列を使用してみてください評価しながらintEmployee_id = 3882に評価されます。

+0

確かに、2つの異なるクエリ文字列に評価されていることに気がつきましたが、データベースが永続ストアに保存された後も同じように実行されます。 – radven

+1

私はこれをAppleにバグとして報告します。これは保存前後で同じ動作をするはずだからです。彼らが**違っていても、おそらく同じものを評価するはずです。 – lnafziger

+1

完了 - レーダーID:11394751 – radven