76

私はiOSが初めてです。カメラからキャプチャした画像を に保存するアプリケーションを作成しようとしていますCoreDataNSStringsやその他のタイプのデータを保存する方法はわかりましNSDateたが、画像を保存するのに苦労しています。ディスクに書き込んでファイルに書き込む必要があるという記事をたくさん読みましたが、理解できないようです。

次のコードは、他のデータをコアデータに保存するために使用したものです。

- (IBAction)submitReportButton:(id)sender
{
    UrbanRangerAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

    managedObjectContext = [appDelegate managedObjectContext];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"PotholesDB" inManagedObjectContext:appDelegate.managedObjectContext];
    NSManagedObject *newPothole = [[NSManagedObject alloc]initWithEntity:entity insertIntoManagedObjectContext:managedObjectContext];


    [newPothole setValue:self.relevantBody.text forKey:@"relevantBody"];
    [newPothole setValue:self.subjectReport.text forKey:@"subjectReport"];
    [newPothole setValue:self.detailReport.text forKey:@"detailReport"];
//    [newPothole setValue:self.imageView forKey:@"photo"];

    NSDate *now = [NSDate date];
    //NSLog(@"now : %@", now);
    NSString *strDate = [[NSString alloc] initWithFormat:@"%@", now];
    NSArray *arr = [strDate componentsSeparatedByString:@" "];
    NSString *str;
    str = [arr objectAtIndex:0];
    NSLog(@"now : %@", str);

    [newPothole setValue:now forKey:@"photoDate"];
    [newPothole setValue:self.latitudeLabel.text forKey:@"latitude"];
    [newPothole setValue:self.longitudeLabel.text forKey:@"longitude"];
    [newPothole setValue:self.addressLabel.text forKey:@"streetName"];
    [newPothole setValue:streeNameLocation forKey:@"location"];


    NSError *error;
    [managedObjectContext save:&error];

    UIAlertView *ll = [[UIAlertView alloc] initWithTitle:@"Saving" message:@"Saved data" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

    [ll show];
} 
4

7 に答える 7

4
- (void)imageChanged:(UIImage*)image{

    if (self.detailItem) {
        [self.detailItem setValue:UIImagePNGRepresentation(image) forKey:kSignatureImage];
    }
}

これは非常に簡単な例です。selfはコア データを使用するビュー コントローラーであり、self.detailItem は通常の NSManagedObject です。そのプロジェクトでは、エンティティのモデル クラスを作成しませんでしたが、KVC パターンを厳密に使用して属性にアクセスしました。ご想像のとおり、属性には"signatureImage"#define 定数で定義した名前が付けられていkSignatureImageます。

これは、イメージがコア データから復元される場所です。

self.signatureCanvas.image =  [UIImage imageWithData:[self.detailItem valueForKey:kSignatureImage]];

ここでも、selfはビュー コントローラでsignatureCanvasあり、 はUIImageViewサブクラスであり、から継承された.image通常のプロパティです。、再び、通常です。imageUIImageViewdetailItemNSManagedObject

この例は、私が現在取り組んでいるプロジェクトから取られています。

画像などの大きなデータ オブジェクトをコア データに格納したり、ファイルに分割したりすることには、長所と短所があります。それらをファイルに保存するということは、関連するデータ オブジェクトが削除されたときにそれらを削除する責任があることを意味します。これにより、コーディングのオーバーヘッドが発生し、プログラミング エラーが発生する可能性があります。一方、基盤となるデータベースの速度が低下する可能性があります。パフォーマンスに関して共有できるこのアプローチの経験はまだ十分ではありません。最終的に、占有されるディスク ストレージは合計でほぼ同じサイズになります。

于 2013-05-22T08:44:13.507 に答える
0

iOSには他の永続的なストレージが利用できるのに、なぜコアデータに画像を保存したいのかわかりません。キャッシュ目的で画像を保存するだけの場合は、ドキュメント ディレクトリまたはキャッシュ ディレクトリに保存できます。ハッピーコーディング...

ドキュメントディレクトリに画像を保存・取得する方法は以下のURLを参照してください。

http://www.wmdeveloper.com/2010/09/save-and-load-uiimage-in-documents.html

画像を Documents ディレクトリに保存し、電子メールの添付ファイルとして取得する

Cocoa で一時ファイルを作成するにはどうすればよいですか?

于 2013-05-22T07:58:28.480 に答える