我正在尝试使用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
知道我可能做错了什么吗?
答案 0 :(得分:1)
您每次都将相同的指针值(如果需要,也可以复制内存地址)数据[1]复制到m_vectData中。因此,当您转储m_vectData时,它将五次显示当前在该内存地址的数据。一种可行的方法是使m_vectData成为std :: string的向量。