使用SQLite覆盖数据

时间:2018-07-10 12:52:43

标签: c++ 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");
  

Data Bus_Frame_1

     

Data Bus_Frame_2   数据总线_帧_2

     

数据总线框架3   数据总线_帧_3   数据总线_Frame_3

     

数据总线框架4   数据总线_帧_4   数据总线_帧_4   数据总线_Frame_4

     

数据总线框架5   数据总线_帧_5   数据总线_帧_5   数据总线_帧_5   数据总线_Frame_5

知道我可能做错了什么吗?

1 个答案:

答案 0 :(得分:1)

您每次都将相同的指针值(如果需要,也可以复制内存地址)数据[1]复制到m_vectData中。因此,当您转储m_vectData时,它将五次显示当前在该内存地址的数据。一种可行的方法是使m_vectData成为std :: string的向量。