0

こんにちは、私は Xcode を初めて使用します。ios 5 で UITableView からデータベース (sqlite3) に画像を挿入しようとしています。以下のコードを試しました。

-(void)addItemCUR
{

    if(addStmt == nil) {
        const char *sql = "insert into Table(C_Name, C_Image) Values(?,?)";
        if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
            NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
    }

    sqlite3_bind_text(addStmt, 1, [C_Name UTF8String], -1, SQLITE_TRANSIENT);

    NSData *ImageData = [[NSData alloc] initWithData:UIImagePNGRepresentation(self.C_Image)];
    int returnValue = -1;
    if(self.C_Image != nil)
       returnValue =        sqlite3_bind_blob(addStmt, 3, [ImageData bytes], [ImageData length], NULL);
    else
        returnValue =         sqlite3_bind_blob(addStmt, 4, nil, -1, NULL);



    if(SQLITE_DONE != sqlite3_step(addStmt))
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
    else
        //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid
        rowid = sqlite3_last_insert_rowid(database);

    //Reset the add statement.
    sqlite3_reset(addStmt);
}

次のようなエラーが発生しています

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString CGImage]: unrecognized selector sent to instance 0xb7c0'
*** First throw call stack:
(0x158f052 0x1720d0a 0x1590ced 0x14f5f00 0x14f5ce2 0xf8b6c 0x5c65 0x3182 0x7030 0x16d71d 0x16d952 0x9f586d 0x1563966 0x1563407 0x14c67c0 0x14c5db4 0x14c5ccb 0x1478879 0x147893e 0xdda9b 0x2ac8 0x2a25)
terminate called throwing an exceptionsharedlibrary apply-load-rules all
(gdb

事前に感謝します。

4

3 に答える 3

0

これは画像付きの情報を含む例です。このコードは1つのデモコードです...

- (void) saveAllData {

if(isDirty) {

if(updateStmt == nil) {
const char *sql = "update Coffee Set CoffeeName = ?, Price = ?, CoffeeImage = ? Where CoffeeID = ?";
if(sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL) != SQLITE_OK)
NSAssert1(0, @"Error while creating update statement. '%s'", sqlite3_errmsg(database));
}

sqlite3_bind_text(updateStmt, 1, [coffeeName UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_double(updateStmt, 2, [price doubleValue]);

NSData *imgData = UIImagePNGRepresentation(self.coffeeImage);

int returnValue = -1;
if(self.coffeeImage != nil)
returnValue = sqlite3_bind_blob(updateStmt, 3, [imgData bytes], [imgData length], NULL);
else
returnValue = sqlite3_bind_blob(updateStmt, 3, nil, -1, NULL);

sqlite3_bind_int(updateStmt, 4, coffeeID);

if(returnValue != SQLITE_OK)
NSLog(@"Not OK!!!");

if(SQLITE_DONE != sqlite3_step(updateStmt))
NSAssert1(0, @"Error while updating. '%s'", sqlite3_errmsg(database));

sqlite3_reset(updateStmt);

isDirty = NO;
}

//Reclaim all memory here.
[coffeeName release];
coffeeName = nil;
[price release];
price = nil;

isDetailViewHydrated = NO;
}
于 2012-10-15T08:40:56.197 に答える
0

画像全体をデータベースに保存する特定の理由はありますか?

画像全体をデータベースに保存するのではなく、アプリケーションの Documents/Caches フォルダーに画像を保存し、画像名を含む場所のみを varchar としてデータベースに保存することをお勧めします。次回画像を使用する必要がある場合は、個々の画像用に保存されているパスをたどるだけで済みます。したがって、アプリケーションは画像を繰り返し再描画する必要がなく、アプリケーションのパフォーマンスも向上します。

以下は練習用のサンプルコードです。

- (void)saveImage:(UIImage *)image forPerson:(NSString *)fullName  
{
    // ファイル名を先にする
    NSString *filename = [fullName stringByAppendingString:@".png"]; // または .jpg

    // アプリ ドキュメント ディレクトリのパスを取得します
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    // ファイル名を追加し、完全な画像パスを取得します
    NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:ファイル名];

    // 画像を PNG/JPEG に変換し、画像パスに書き込みます
    NSData *imageData = UIImagePNGRepresentation(画像);
    [imageData writeToFile:savedImagePath アトミック:NO];   

    // ここで、savedImagePath を DB に保存します
    ...
}

画像を取得して表示するには...

- (UIImage *)loadImage:(NSString *)filePath  
{
    return [UIImage imageWithContentsOfFile:filePath];
}
于 2012-10-15T08:35:34.700 に答える
0

イメージをローカル ドキュメント ディレクトリに保存してみてください。次に、イメージ パスを sqlite に保存します。次のコードが役に立ちます。

NSData *imageData = UIImagePNGRepresentation(photo);//photo - your image
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
NSString *pngFilePath = [NSString stringWithFormat:@"%@/photo.png",documentsDir]; 
[imageData writeToFile:pngFilePath atomically:YES];

NSArray *sysPaths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
NSString *docDirectory = [sysPaths objectAtIndex:0];
NSString *filePath = [NSString stringWithFormat:@"%@/photo.png", docDirectory];

sqlite3 *database;
@try 
{
    NSString *query = [NSString stringWithFormat:@"INSERT INTO Photos(PhotoPath) VALUES('%@')",filePath];
    NSString *databasePath;
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    databasePath = [documentsDir stringByAppendingPathComponent:@"GolfElite.sqlite"];
    if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)    
    {
        NSLog(@"DB opened...");
        sqlite3_exec(database, [query UTF8String], NULL, NULL, NULL);   
    }

}
@catch (NSException * e) 
{
    NSLog(@"Exception = %@", e);
}
@finally
{
    sqlite3_close(database);
}
NSLog(@"Photos inserted successfully..");   
于 2012-10-15T08:37:28.783 に答える