0

データをループ処理し、インポート プロセス中に重複レコードを無視する Core Data インポーターがあります。

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

たとえば、私のテストでは、次のクエリが一致して結果を返すことがわかりました。

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

しかし、この一見同一のものはそうではありません:

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

ただし、コンテキストが永続ストアに保存された後は、両方とも同じように一致します。

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

ここで一体何が起こっているのか、何か考えはありますか? これらの 2 つのフェッチが異なる結果を返す可能性があるのはなぜですか?

4

2 に答える 2

1

従業員IDは文字列ではなく数字ではないでしょうか?次に、述語は次のようになります。

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

これは、タイプの混同が原因で不規則な動作が発生していることを意味します。SQLiteのドキュメントでは、データを物理的に格納するときにSQLiteは実際にはタイプによって実際には区別しないと述べているため、不規則であっても何らかの形で機能します。

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

于 2012-05-06T20:40:53.473 に答える
1

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

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

intEmployee_id = 3882whileに評価される

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

に評価されますintEmployee_id = "3882"

ID には文字列ではなく数字を使用してみてください。

于 2012-05-06T20:44:07.830 に答える