Я пытаюсь скопировать некоторые данные 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);
Возможно, вам лучше прикрепить один бит к другому и выполнить копию blob в sql-запросе? – fnc12