0

私はsqlite dbを作成しました。

そして、私は自分のデータベースにいくつかのデータを挿入しました..

UIImage * imagee=[UIImage imageNamed:@"image.png"];
NSData *mydata=[NSData dataWithData:UIImagePNGRepresentation(imagee)];
const char *dbpath = [databasePath UTF8String];

NSString *insertSQL=[NSString stringWithFormat:@"insert into CONTACTS values(\"%@\",\"%@\")",@"Mathan",mydata];

NSLog(@"mydata %@",mydata);

sqlite3_stmt *addStatement;

const char *insert_stmt=[insertSQL UTF8String];
if (sqlite3_open(dbpath,&contactDB)==SQLITE_OK) {
    sqlite3_prepare_v2(contactDB,insert_stmt,-1,&addStatement,NULL);

    if (sqlite3_step(addStatement)==SQLITE_DONE) {

        sqlite3_bind_blob(addStatement,1, [mydata bytes], [mydata length], SQLITE_TRANSIENT);
        NSLog(@"Data saved");

    }
    else{

        NSLog(@"Some Error occured");
    }

    sqlite3_close(contactDB);
}
else{
    NSLog(@"Failure");
}

データを取得するためのコードをいくつか書きました

sqlite3_stmt *statement;
if (sqlite3_open([databasePath UTF8String], &contactDB) == SQLITE_OK) {
    NSString *sql = [NSString stringWithFormat:@"SELECT * FROM contacts"];

    if (sqlite3_prepare_v2( contactDB, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {
        while (sqlite3_step(statement) == SQLITE_ROW)
        {
            char *field1 = (char *) sqlite3_column_text(statement, 0);
            NSString *field1Str = [[NSString alloc] initWithUTF8String: field1];
            NSLog(@"UserName %@",field1Str);

            NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(statement, 1) length:sqlite3_column_bytes(statement, 1)];

            UIImage *newImage = [[UIImage alloc]initWithData:data];

            NSLog(@"Image OBJ %@",newImage);
            NSLog(@"Image Data  %@",data);
        }
        sqlite3_close(contactDB);
    }
}

sqlite3_finalize(statement);

問題は

ログでは、挿入されたNSDataオブジェクトと取得されたNSDataオブジェクトが異なります (ログに出力すると、異なるストリームが得られます)

さらに、画像OBJはログにnullが出力されます..

stackoverflow で同様の質問を見たことがあります。しかし、何も役に立たないようです。

4

3 に答える 3

0

sqlite3_step の前ではなく、後 に実行する必要がありますsqlite3_bind_blob。何を挿入するかを指示する前に挿入しています。

との結果を確認sqlite_prepare_v2するsqlite3_bind_blobことも賢明です。

また、コードの両方のスニペットでsqlite3_finalizeあなたの前に(あなたの質問とは無関係に)提案します。sqlite3_closeまた、エラーが発生した場合sqlite3_errmsg、推測ではなく何が問題なのかを正確に教えてくれる、命の恩人です。

于 2012-10-05T15:29:26.057 に答える
0

これを行う場合:

NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(statement, 1) length:sqlite3_column_bytes(statement, 1)];
UIImage *newImage = [[UIImage alloc]initWithData:data];

2 つのオブジェクトが異なることをコンパイラに伝えているため、それらを出力すると常に異なります。保証します。それらは同じオブジェクトではないためです。

オブジェクトを割り当てたばかりなので、なぜ newImage が null を表示するのかわかりません。

于 2012-10-05T15:20:59.417 に答える
0

大きな違いはありませんが、これを試すことができます。また、コンソールで画像の長さを取得して、画像がデータベースから適切に応答しているかどうかを検出できます。

const void *ptr = sqlite3_column_blob(stmt, 1);
int size = sqlite3_column_bytes(stmt, 1);
NSLog(@"%d",size);
data = [[NSData alloc] initWithBytes:ptr length:size];
于 2012-10-05T15:39:18.833 に答える