iPhoneアプリ工作室
<< April 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >>
スポンサーサイト

一定期間更新がないため広告を表示しています

<< PhotoAlbums for Picasa | main | 【iPhoneアプリ】お買い物帳 リリース! >>
Core Dataでvalidateを行う時の注意
iPhoneアプリの開発でCore Dataのvalidate機能を使用したときに
ちょろっとつまづいた事象があったので、備忘録として記事を書きました。

Xcodeのモデリングツールでモデル(DB的に言えばテーブル)を作成したあと
各プロパティ(DB的に言えばカラム)に制限(最大文字数など)を付け、
なおかつCore Dataの標準機能のvalidate機能を使用し下記のコードを実行してみたところ

if (![[obj.managedObjectContext] save:&error]) {
    [obj.managedObjectContext rollback];
    UIAlertView *alert = [[UIAlertView alloc] init];
    [alert setTitle:NSLocalizedString(@"Error",@"エラー")];
    [alert setMessage:[error localizedDescription]];
    [alert setDelegate:self];
    [alert addButtonWithTitle:@"OK"];
    [alert show];
    [alert release];
    //NSLog(@"DB ERROR:%@,%@",error,[error userInfo]);
} else {
    [self dismissModalViewControllerAnimated:YES];
}



エラーとして表示される文章が独自validateのエラー文章ではなく
必ず「The operation couldn't be completed.(Cocoa error 1560.)」のエラー文章が表示されます。

なぜだ!!


色々と調べた結果、これは独自validateで引っかかったにもかかわらず、
DBにinsertを行なおうとし、プロパティの制限に引っかかったために表示されるようです。

そこで試しに下記のコードに変更して実行してみました。

NSError *error;
//saveを行う前にvalidateを行い、検証に引っかかった場合はアラートを表示する
if (![obj validateForInsert:&error]) {
    UIAlertView *alert = [[UIAlertView alloc] init];
    [alert setTitle:NSLocalizedString(@"Error",@"エラー")];
    [alert setMessage:[error localizedDescription]];
    [alert setDelegate:self];
    [alert addButtonWithTitle:@"OK"];
    [alert show];
    [alert release];
} else {
    //saveを行い、エラーが発生すれば、アラートでエラー内容を表示する
    if (![obj.managedObjectContext save:&error]) {
        [obj.managedObjectContext rollback];
        UIAlertView *alert = [[UIAlertView alloc] init];
        [alert setMessage:[error localizedDescription]];
        [alert setDelegate:self];
        [alert addButtonWithTitle:@"OK"];
        [alert show];
        [alert release];
    } else {
        [self dismissModalViewControllerAnimated:YES];
    }
}


が、結果は同じでした・・・。

やはりvalidateForInsertというものは複数のプロパティ同士を比べる等で検証したいときのために用意されているだけで
saveの前に実行したいとかの目的ではないようです。

そこで、解決手段として
各モデルに自分でvalidateメソッドを作る場合は
モデルの各プロパティに制限を付けない方法にしてみました。
この方法だと独自validateのエラー文章が表示されました。
当然ですよね(T T)

今後の方針として、各プロパティ毎にエラーを取得したいときは今回のこの方法がいいかもですが
そうではなく、保存に失敗したかどうかだけを取得したい場合は
モデリングツールで制限を設定した方が簡単でいいかもです。

今回はこの方法で行ないましたが
他にもよい方法をご存知でしたら、教えてください。




スポンサーサイト

買ってくだちゃい♪ってチ ※ ポの写メ送ったらソッコー食いついた件www

30年ずっと童☆貞のオレがこんな簡単に初 体 験できるとは!!!!(*゚∀゚)=3

まぁ報 酬に10万もらったのが一番ビビったんだけどなwwww

http://dq-jxfo.mat.pizapizahiza.net/
プニャパット | 2010/07/24 14:41
COMMENT









Trackback URL
http://nslab.jugem.jp/trackback/14
TRACKBACK