2

この質問は多くの人から寄せられたものであり、データベースに画像を保存または挿入するために「sqliteを使用する理由、FMDB、コアデータを使用する理由」などについていくつかの議論と議論があることを知っています。 sqlite3に慣れていて、コアデータやその他のデータベースを扱うことができません.また、私はiPhoneテクノロジーの学習段階にあります.そのため、sqliteのみで処理できるソリューションを提供してください;)

私のリクエストが間違っていたらごめんなさい!

文字が入力されたときに、つまり連絡先から、「L」、「Lakshaman Rao、Prasanna Lakshmi、「Lokesh Sharan」などを入力すると、提案を含むテーブルを表示するテキスト フィールドがあります。

今、私はそれぞれの連絡先から対応する連絡先の写真を取得しようとしています。そのため、連絡先の画像を取得する方法に関するコードサンプルを検索し、次の方法で実装しました:

NSData *imgData = nil;
imgData = (NSData *)ABPersonCopyImageData(ref);
contactImage = [UIImage imageWithData:imgData]; 

今、私はあちこちで同様の種類の質問を検索しました、一般的な答えは、画像をアプリのドキュメントディレクトリに保存し、データベースに画像のパスのみを保存することでした。

dbにブロブを挿入すると、dbが非常に遅くなります:(

しかし、これを行うにはどうすればよいですか。適切に通過したリンクのコード スニペットを理解できません。UIImage タイプの contactImage を NSString に変換して、文字列を保持するデータベース テーブルに挿入するVARCHAR型で記録!

編集

これはそこで提案されたコードです:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,     NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *getImagePath = [documentsDirectory stringByAppendingPathComponent:@"savedImage.png"];
UIImage *img = [UIImage imageWithContentsOfFile:getImagePath];

これは私が実装したコードです:

ABAddressBookRef addressBook = ABAddressBookCreate( );
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
CFIndex nPeople = ABAddressBookGetPersonCount( addressBook );

 NSString *contactFirstName = nil;
 NSString *contactLastName = nil;
 NSString *fullName = nil;

    for ( int i = 0; i < nPeople; i++ )
    {
        ref = CFArrayGetValueAtIndex( allPeople, i );
        contactFirstName = [[[NSString alloc] initWithString:(NSString *)ABRecordCopyValue(ref, kABPersonFirstNameProperty)]autorelease];
        contactLastName = [[[NSString alloc] initWithString:(NSString *)ABRecordCopyValue(ref, kABPersonLastNameProperty)]autorelease];

        contactLastName = [NSString stringWithFormat:@" %@",contactLastName];
        fullName = [contactFirstName stringByAppendingString:contactLastName];

        [contactList addObject:fullName];
}

    NSData *imgData = nil;
    imgData = (NSData *)ABPersonCopyImageData(ref);
    contactImage = [UIImage imageWithData:imgData];  

    CFRelease(allPeople);
    CFRelease(addressBook);

私を助けてください、これに対処して先に進む方法について非常にひどく苦労しています:(

よろしくお願いします:)

4

1 に答える 1

6

文書への画像保存用

- (void)saveImage:(UIImage *)image forPerson:(NSString *)fullName  {
    //  Make file name first
    NSString *filename = [fullName stringByAppendingString:@".png"]; // or .jpg

    //  Get the path of the app documents directory
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,     NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    //  Append the filename and get the full image path
    NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:filename];

    //  Now convert the image to PNG/JPEG and write it to the image path
    NSData *imageData = UIImagePNGRepresentation(image);
    [imageData writeToFile:savedImagePath atomically:NO];   

    //  Here you save the savedImagePath to your DB
    ...
}

したがって、後で画像を取得できます

- (UIImage *)loadImage:(NSString *)filePath  {
    return [UIImage imageWithContentsOfFile:filePath];
}
于 2012-05-30T07:11:18.207 に答える