2

画像をデータベースに保存し、データベースに画像をフェッチしたいのですが、画像をNSDataに変換すると、画像はデータベースに正常に保存されますが、データベースからその画像を取得するとクラッシュします。この警告が表示されます

警告 :- -[__NSCFString バイト]: 認識されないセレクターがインスタンス 0x7916000 に送信されました

データベースに画像を保存するためのコードの下

NSData *dataImage1 = UIImagePNGRepresentation(image3.image);
 NSString   *str = [NSString stringWithFormat:@"Insert into Gallery(ImageName) VALUES ('%@')",dataImage1];
[Database executeQuery:str];

//データベース.m

+(NSString* )getDatabasePath{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"Database"];
    return writableDBPath;

}

+(NSMutableArray *)executeQuery:(NSString*)str{

    sqlite3_stmt *statement= nil;
    sqlite3 *database;
    NSString *strPath = [self getDatabasePath];
    NSMutableArray *allDataArray = [[NSMutableArray alloc] init];
    if (sqlite3_open([strPath UTF8String],&database) == SQLITE_OK) {
        if (sqlite3_prepare_v2(database, [str UTF8String], -1, &statement, NULL) == SQLITE_OK) {


            while (sqlite3_step(statement) == SQLITE_ROW) {
                            NSInteger i = 0;
                NSInteger iColumnCount = sqlite3_column_count(statement);
                NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
                while (i< iColumnCount) {
                    NSString *str = [self encodedString:(const unsigned char*)sqlite3_column_text(statement, i)];


                NSString *strFieldName = [self encodedString:(const unsigned char*)sqlite3_column_name(statement, i)];

                    [dict setObject:str forKey:strFieldName];
                    i++;
                }

                [allDataArray addObject:dict];
                [dict release];
            }
        }

        sqlite3_finalize(statement);
    } 
    sqlite3_close(database);
    return allDataArray;
}

//画像を取得

NSString *str =[NSString stringWithFormat:@"Select * from Gallery where id = 1"];
NSMutableArray *arra =[Database executeQuery:str];
NSData *d =[[arra objectAtIndex:0] valueForKey:@"ImageName"];
UIImage *img = [[UIImage alloc] initWithData:d];
NSLog(@"%@",img);

前もって感謝します

4

2 に答える 2

2

あなたの問題は、stringWithFormat. NSData(バイナリ データ) を というフィールドに挿入していますが、その SQL ステートメントを作成するためにImageName使用することはできません。stringWithFormat

画像自体を挿入するつもりでしたか? その場合、?プレースホルダーを使用して以下のように SQL を使用し、を呼び出す前にsqlite3_bind_blobfor column number1を使用します。したがって、SQL は次のようになります。NSDatasqlite3_step

Insert into Gallery(ImageName) VALUES (?)

(余談ですが、私は画像の実際のデータを選択するのが好きではありません。実際の画像データまたは画像の名前のImageNameいずれかを使用します。)ImageImageName

そして、SQL を準備した後、次のように呼び出します。

sqlite3_bind_blob(statement, 1, [dataImage1 bytes], [dataImage1 length], SQLITE_TRANSIENT);

その後sqlite3_step、通常どおり を呼び出して SQL を実行し、データを挿入できます。

データを取得するときは、成功した後sqlite3_step、適切なsqlite3_column_blob関数を使用します。

const void *bytes = sqlite3_column_blob(statement, 0);
int len = sqlite3_column_bytes(statement, 0);
NSData *data = [NSData dataWithBytes:bytes length:len];
UIImage *image = [UIImage imageWithData:data];

そうは言っても、SQLite は大規模な BLOB データを格納するには効率が悪いことで有名です。画像を Documents フォルダーに保存してから、ファイル名だけをフィールドに保存することもできますImageName

于 2013-08-01T12:38:51.373 に答える
0

文字列型のバイトを取得していると思います

[[arra objectAtIndex:0] valueForKey:@"ImageName"];

最初に文字列を取得してからデータに変換します。

このようにしてみてください:

NSData* data = [[[arra objectAtIndex:0] valueForKey:@"ImageName"] dataUsingEncoding:NSUTF8StringEncoding];
于 2013-08-01T12:31:49.843 に答える