首页 > 解决方案 > 使用 SQLite 覆盖数据

问题描述

我正在尝试使用 SQLite 访问本地数据库。该表如下所示:

FrameIndex FrameName Bus NoMinorFrames MinorFrameTime TotalTime 1 Bus_Frame_1 BUS-1 8 20 160 2 Bus_Frame_2 BUS-2 8 20 160 3 Bus_Frame_3 BUS-3 8 20 160 4 Bus_Frame_4 BUS-4 8 20 160 5 Bus_Frame_5 BUS-5 8 20 160

我正在尝试编写一个包装类,以便每个查询都返回所有记录的向量。为了做到这一点,我将我的类的引用作为参数传递给sqlite_exec()

这是我的包装类的头文件

class Database{
public:
    Database(const char*);
    int fnQueryExec(const char*);
    void fnClose();
    char* fnGetLastError();
    vector<char*> Data;
    //vector<vector<char*> > m_vectData;
    vector<char*> m_vectData;   //For testing purposes I am storing only second column.
    int Count;
    int  m_nCount;

private:
    sqlite3 *db;
    bool fnFileExists(const char*);
    bool m_bDatabaseStatus;
    char *m_SQLError;

};

这是回调函数:

static int callback(void* object, int count, char **data, char **columns){
    Database* db= static_cast<Database*>(object);
    char* temp;
    temp = data[1];
    db->m_vectData.push_back(temp);
    db->m_nCount = count;
    return 0;
}

问题是当我打印出向量的内容时,这是输出:

Row 1: Bus_Frame_5 Row 2: Bus_Frame_5 Row 3: Bus_Frame_5 Row 4: Bus_Frame_5 Row 5: Bus_Frame_5

不知何故,将数据推入向量会改变向量的所有先前元素。我已经使用常规char**数组而不是具有相同结果的向量对此进行了测试。即使单独传递向量的引用也会导致同样的问题。

vector<char*> *vect = static_cast<vector<char*>* >(object);
char* temp = data[1];
vect->push_back(temp);
for(int nIndex = 0; nIndex<vect->size(); nIndex++)
    printf("Data %s ", (*vect)[nIndex]);
printf("\n");

数据总线_Frame_1

数据总线_帧_2 数据总线_帧_2

数据总线_帧_3 数据总线_帧_3 数据总线_帧_3

数据总线_帧_4 数据总线_帧_4 数据总线_帧_4 数据总线_帧_4

数据总线_帧_5 数据总线_帧_5 数据总线_帧_5 数据总线_帧_5 数据总线_帧_5

知道我做错了什么吗?

标签: c++sqlite

解决方案


您每次都将相同的指针值(或内存地址,如果您愿意)data[1] 复制到 m_vectData 中。因此,当您转储 m_vectData 时,它会显示该内存地址当前的数据五次。让这个工作的一种方法是让 m_vectData 成为 std::string 的向量。


推荐阅读