2014-02-13 2 views
0

하나의 sqlite 테이블에서 다른 BLOB 데이터를 C++로 복사하려고합니다. 그러나 데이터가 새 테이블로 복사되면 손상된 것으로 보입니다. 상기 데이터는 일부 JPEG 이미지를 포함합니다. 내가 TABLE2에 TABLE1에서 복사하기 위해 사용하고 코드는 아래와 같습니다C++ 하나의 데이터베이스에서 다른 데이터베이스로 sqlite BLOB 복사

// Read the blob from the database 
    int64_t rowID = 0; 
    sscanf(id.c_str(), "%llu", &rowID); 

    sqlite3_blob* blobHandle = NULL; 
    if(sqlite3_blob_open(m_dbHandle_temp, "main", m_currentTileTable.c_str(), "tile_data", rowID, 0, &blobHandle) != SQLITE_OK) 
    { 
     sqlite3_blob_close(blobHandle); // An SQLite blob will be initialised regardless of the success of 'sqlite3_blob_open' 
     return false; 
    } 


    tiles_insert_statement.append(")"); 

    // Copy blob to database 
    sqlite3_stmt *stmt = 0; 
    const char* tail; 
    sqlite3_prepare_v2(m_dbHandle, tiles_insert_statement.c_str(), strlen(tiles_insert_statement.c_str())+1, &stmt, &tail); 
    int bindSuccess = sqlite3_bind_blob(stmt, 1, blobHandle, sqlite3_blob_bytes(blobHandle), SQLITE_TRANSIENT); 
    if(sqlite3_step(stmt) != SQLITE_DONE) 
     printf("Error message: %s\n", sqlite3_errmsg(m_dbHandle)); 
    sqlite3_finalize(stmt); 

    // close handles 
    sqlite3_blob_close(blobHandle); 

나는 위의 코드에서 잘못하고 있어요 있나요, 내가이 손상지고 있다고 말하는 이유는, 내가 읽기하고 있기 때문이다 이미지 뷰어에 표시 할 안드로이드 장치의 얼룩. 표 1의 얼룩은 잘 읽고 표시 할 수 있지만 표 2의 얼룩은 아무 것도 표시하지 않습니다. 어떤 도움이 크게 도움이됩니다.

// Read the blob from the database 
    int64_t rowID = 0; 
    sscanf(id.c_str(), "%llu", &rowID); 

    sqlite3_blob* blobHandle = NULL; 
    if(sqlite3_blob_open(m_dbHandle_temp, "main", m_currentTileTable.c_str(), "tile_data", rowID, 0, &blobHandle) != SQLITE_OK) 
    { 
     sqlite3_blob_close(blobHandle); // An SQLite blob will be initialised regardless of the success of 'sqlite3_blob_open' 
     return false; 
    } 

    unsigned int length = sqlite3_blob_bytes(blobHandle); 

    // TODO - instances of this class OWN the buffer. 
    // Delete the buffer in the destructor ;) 
    unsigned char* buffer = new unsigned char[ length ]; 
    if(sqlite3_blob_read(blobHandle, buffer, length, 0) != SQLITE_OK) 
    { 
     return false; 
    } 

    tiles_insert_statement.append(")"); 

    sqlite3_stmt *stmt = 0; 
    const char* tail; 
    sqlite3_prepare_v2(m_dbHandle, tiles_insert_statement.c_str(), strlen(tiles_insert_statement.c_str())+1, &stmt, &tail); 
    int bindSuccess = sqlite3_bind_blob(stmt, 1, buffer, length, SQLITE_TRANSIENT); 
    if(sqlite3_step(stmt) != SQLITE_DONE) 
     printf("Error message: %s\n", sqlite3_errmsg(m_dbHandle)); 
    sqlite3_finalize(stmt); 

    // close handles 
    sqlite3_blob_close(blobHandle); 
+0

어쩌면 당신은 더 나은 하나의 DB를 다른 사람에게 첨부하고 SQL 쿼리 내에서 BLOB 복사본을 수행하는 것이 좋을까요? – fnc12

답변

2

sqlite3_bind_blob 실제 블롭 데이터에 대한 포인터를 기대; SOLUTION

그것을 위해 blob 핸들을 사용할 수 없습니다.

BLOB 데이터를 메모리 청크로 가져 오려면 SELECT tile_data FROM MyTable WHERE ...과 같은 쿼리를 실행하고 sqlite3_column_blob으로 값을 읽습니다.

+0

나는 마침내 내가 한 것을 보여주기 위해 내 질문을 편집했다. 나는이 게시물로 돌아 가기 전에 그것을 알아 내었다. 당신이 제안했듯이, 문제는 blob 핸들을 sqlite3_bind_blob에 전달했기 때문입니다. – kushaldsouza

관련 문제