C ++将sqlite blob从一个数据库复制到另一个数据库

时间:2014-02-13 10:35:10

标签: c++ sqlite blob

我试图在C ++中将一些blob数据从一个sqlite表复制到另一个sqlite表。但是,一旦将数据复制到新表,它似乎就会被破坏。所述数据包含一些jpeg图像。我用来从TABLE1复制到TABLE2的代码如下所示:

// 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 );

在上面的代码中有什么我做错了,我说它被破坏的原因是因为,我正在读取Android设备上的blob以显示在图像查看器中。可以读取和显示表1中的blob,但是表2中的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;
    }

    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 );

1 个答案:

答案 0 :(得分:2)

sqlite3_bind_blob需要一个指向实际blob数据的指针;为此不能使用blob句柄。

要将blob数据作为内存块获取,请执行SELECT tile_data FROM MyTable WHERE ...之类的查询,并使用sqlite3_column_blob读取该值。