2015-01-27 2 views
2

Как я могу добавлять значения в 2D векторной станд :: вектор < станд :: вектор>push_back на 2D станд :: вектор <станд :: вектор <char*>> значение из всех значений одинаковы

Я используя этот код, но элементы, полученные внутри vetore, одинаковы. В то время как данные из queriying db варьируются.

std::vector< std::vector<char*> > results; 
char *dataTemp = new char[128]; 
sqlite3_stmt *statement; 
int rc = sqlite3_prepare_v2(m_pDbFile, sql, -1, &statement, 0); 
if(rc == SQLITE_OK) 
{ 
    int cols = sqlite3_column_count(statement); 
    int result = 0; 
    int count = 0; 
    while(true) 
    { 
     result = sqlite3_step(statement); 
     if(result == SQLITE_ROW) 
     { 
      std::vector<char*, std::allocator<char*>> values; 
      for(int col = 0; col < cols; col++) 
      { 
       char* value = (char*)sqlite3_column_text(statement, col); 
       values.push_back((char*)sqlite3_column_text(statement, col)); 
      } 
      results.push_back(values); 
     } 
     else 
     { 
      break; 
     } 
     count++; 
    } 

    sqlite3_finalize(statement); 
} 
+0

Вы сохраняете 'char *'. В SQLite нет никакой гарантии, что буфер, на который он ссылается, не будет использоваться повторно при следующей выборке. Если вы хотите сохранить эти данные *, вам нужно сделать копию ранее (используйте 'std :: string', btw, что, как указал Мохит, сделает ваш код« просто »« работает »). Из документации SQLite: «Возвращенные указатели действительны до тех пор, пока не произойдет преобразование типа, как описано выше, или пока не будут вызываться sqlite3_step() или sqlite3_reset() или sqlite3_finalize().» – WhozCraig

ответ

1

Проблема
Указатель (тип строки C), возвращаемый sqlite3_column_text могут быть признаны недействительными/повторно использовать после последующих вызовах SQL API. Поэтому вы должны сохранить содержимое вместо сохранения самого указателя.

Решение
Внести следующие изменения в Ваш код.

#include <string> // 1 
... 
std::vector< std::vector<std::string> > results; // 2 
... 
      std::vector<std::string> values; // 3 
      for(int col = 0; col < cols; col++) 
      { 
       const char* value = (char*)sqlite3_column_text(statement, col); // Optional 
       values.push_back(value); // Optional 
      } 
... 
+0

Привет, вам ответ, однако это не решили проблему. В результате все же будут сделаны одни и те же элементы. Значения вектора внутри основного вектора (переменная результатов) содержат одно и то же значение. Последний вектор: добавлено к главному вектору изменится все выпадающее изображение innobleday

+0

Хотя я сделал вот так std :: vector > результаты; \t \t ... \t \t std :: vector значения; для (INT цв = 0; цв <перевалы; цв ++) { \t \t \t \t \t Const символ * значение = (символ *) sqlite3_column_text (утверждение, цв); \t \t \t \t \t values.push_back (value); } \t \t \t \t const std :: vector valuesAdded (values); \t \t \t \t results.push_back (valuesAdded); – innobleday

+0

Откуда вы знаете, что они такие же? Вы использовали отладчик или распечатали значения. Я бы предложил напечатать значение, когда вы вставляете его в вектор и после окончания цикла печатаете полный вектор. –