2014-02-13 3 views
0

Я пытаюсь скопировать некоторые данные BLOB из одной таблицы sqlite в другую в C++. Однако, как только данные были скопированы в новую таблицу, кажется, что они повреждены. Указанные данные содержат некоторые jpeg-изображения. Код, я использую, чтобы скопировать из TABLE1 в TABLE2 показано ниже:C++ copy 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); 

Что я делаю неправильно в коде выше, почему я говорю, что это поврежденным потому, что я читал blobs на устройстве Android для отображения в средстве просмотра изображений. Капли в таблице 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

Возможно, вам лучше прикрепить один бит к другому и выполнить копию blob в sql-запросе? – fnc12

ответ

2

sqlite3_bind_blob ожидает указатель на фактических данных больших двоичных объектов; для этого невозможно использовать ручку blob.

Чтобы получить данные о блобе в качестве фрагмента памяти, выполните запрос, например SELECT tile_data FROM MyTable WHERE ..., и прочитайте значение с помощью sqlite3_column_blob.

+0

Я отредактировал свой вопрос, чтобы показать, что я наконец сделал. Я понял это, прежде чем вернуться на этот пост. Как вы предположили, проблема была связана с тем, что я передал ручку blob в sqlite3_bind_blob – kushaldsouza

Смежные вопросы