2

我知道很多人都问过这个问题,关于“为什么使用 sqlite、使用 FMDB、核心数据”等有几个讨论和争论。在数据库中存储或插入图像。但请理解我的问题,我很非常习惯于 sqlite3,我无法使用核心数据或其他一些数据库。另外我正处于 iphone 技术的学习阶段。所以我请求提供一个只能处理 sqlite 的解决方案;)

抱歉,如果我的要求有任何错误!

我有一个文本字段,当输入字母(即来自联系人)时,我会显示带有建议的表格,比如我输入字母“L”、“Lakshaman Rao、Prasanna Lakshmi”、“Lokesh Sharan”等。

现在我正在尝试从各个联系人中获取相应的联系人图片。因此,我搜索了有关如何检索联系人图像的代码示例并实现了以下方式:

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

现在我在这里那里搜索了类似的问题,常见的答案是将图像保存在应用程序的文档目录中,而在数据库中只保存图像的路径。

因为在数据库中插入 blob 会使我们的数据库非常慢:(

但是我该怎么做。我无法正确理解链接中的代码片段,如何将 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 回答