2

Core Data モデルを新しいバージョンに移行しようとしている iOS アプリがあります。

Core Data モデルの v2 には 1 つの新しいフィールド (photoFilename) があり、その値は v1 フィールド (dateInSeconds) を使用して「.jpg」を追加して既存のエントリに対して生成できます。

例えば

version 1                               | version 2
field          data                     | field          data
========================================|==============================
dateInSeconds (Integer 32)  401760341   | dateInSeconds (Integer 32)  401760341
                                        | photoFilename (String)  401760341.jpg 

コア データ マッピング モデルを作成しました (一部を以下に示します)。データベースは移行されているように見えます。残念ながら、作成された photoFilename は、「.jpg」の前に正しい番号を与えません。たとえば、「401760341.jpg」ではなく「275263312.jpg」が返される場合があります。

ここに画像の説明を入力

確かに、私は以前にそのようなマッピングを使用したことがなく、ここにある Apple のドキュメントは非常に限られているようです。

他の場所で調査すると、「値式」は NSExpression の一種であり、テスト目的で複製できるようです。

NSExpression *expr = [NSExpression expressionWithFormat:@"FUNCTION('', 'stringByAppendingFormat:', '%d.jpg', 401760341)"];
id result = [expr expressionValueWithObject:nil context:nil];
NSLog(@"result: %@", result);

ただし、これは「.jpg」の前の数字が間違っていると同様に評価されます。

得られた評価結果が私の期待した結果ではない理由を誰かが指摘できますか?

4

2 に答える 2

0

問題の正確な原因はまだわかりませんが、NSString としてキャストすることにより、マッピング モデルで次の回避策に出くわしました。

ここに画像の説明を入力

または、NSExpression を使用してフォローしている人のために

NSExpression *expr = [NSExpression expressionWithFormat:@"FUNCTION('', 'stringByAppendingFormat:', '%@.jpg', CAST(401760341, 'NSString') )"];
id result = [expr expressionValueWithObject:nil context:nil];
NSLog(@"result: %@", result);
于 2013-09-24T16:20:19.337 に答える
0

このリンクで説明されているソリューションは、私にとって非常にうまく機能しました。

http://www.cocoabuilder.com/archive/cocoa/197476-custom-entity-migration-policies-atribute-from-nsstring-to-nsdate.html

簡単に言うと、プロジェクト (ユーティリティ クラスなど) 内の任意のクラス (インスタンスではなくクラス メソッド) に関数を記述し、FUNCTION 式を使用してそのメソッドを呼び出すことができます (構文の詳細については、リンクを参照してください)。これにより、エンティティ全体のエンティティ移行ポリシー全体を記述することなく、エンティティの特定の属性を変更するかなり複雑なコードを記述できます。

于 2015-01-27T15:32:20.763 に答える