I am having list of char array by that I want to store all items in SQLite database , my question how to store string array values in an SQLite database where my string array is dynamically changeable because string array values are coming from server.
here i am done sqlite3 Insert item through Passing parameter , I want to just use this database in dynamically.. Can any guys give me any idea.
I am new to C++ development:
#include <iostream>
using namespace std;
#include "sqlite3.h"
#include<string.h>
#define STRING_MAX 32
typedef struct metadata_t {
char userid[256];
char firstname[256];
char lastname[256];
char username[256];
char password[256];
char email[256];
char userphone[256];
char time[256];
} metadata_t;
void insertdata1(metadata_t * data);
int main(int argc, const char *argv[])
{
struct metadata_t *data;
cin >> data->userid;
cin >> data->firstname;
cin >> data->lastname;
cin >> data->username;
cin >> data->password;
cin >> data->email;
cin >> data->userphone;
cin >> data->time;
insertdata1(data);
}
void insertdata1(metadata_t * data)
{
sqlite3 *db;
sqlite3_open("test1.db", &db);
string createQuery =
"CREATE TABLE IF NOT EXISTS items (userid INTEGER PRIMARY KEY, firstname TEXT,lastname TEXT,username TEXT,password TEXT,email text,userphone INTEGER, "
"time TEXT NOT NULL DEFAULT (NOW()));";
sqlite3_stmt *createStmt;
cout << "Creating Table Statement" << endl;
sqlite3_prepare(db, createQuery.c_str(), createQuery.size(),
&createStmt, NULL);
cout << "Stepping Table Statement" << endl;
if (sqlite3_step(createStmt) != SQLITE_DONE)
cout << "Didn't Create Table!" << endl;
char *a = "(";
char *d = ")";
char *b = "'";
char *c = ",";
char str1[1000];
char *str2 = "";
char *g = ";";
strcpy(str1,
"INSERT INTO items (userid,firstname,lastname,username,password,email,userphone,time)VALUES");
strcat(str1, a);
strcat(str1, b);
strcat(str1, data->userid);
strcat(str1, b);
strcat(str1, c);
strcat(str1, b);
strcat(str1, data->firstname);
strcat(str1, b);
strcat(str1, c);
strcat(str1, b);
strcat(str1, data->lastname);
strcat(str1, b);
strcat(str1, c);
strcat(str1, b);
strcat(str1, data->username);
strcat(str1, b);
strcat(str1, c);
strcat(str1, b);
strcat(str1, data->password);
strcat(str1, b);
strcat(str1, c);
strcat(str1, b);
strcat(str1, data->email);
strcat(str1, b);
strcat(str1, c);
strcat(str1, b);
strcat(str1, data->userphone);
strcat(str1, b);
strcat(str1, c);
strcat(str1, b);
strcat(str1, data->time);
strcat(str1, b);
strcat(str1, d);
strcat(str1, g);
std::string insertQuery = str1; // WORKS!
sqlite3_stmt *insertStmt;
cout << "Creating Insert Statement" << endl;
sqlite3_prepare(db, insertQuery.c_str(), insertQuery.size(),
&insertStmt, NULL);
cout << "Stepping Insert Statement" << endl;
if (sqlite3_step(insertStmt) != SQLITE_DONE)
cout << "Didn't Insert Item!" << endl;
}
I suggest to use bind variables – they make your code cleaner and more protected against input errors and even SQL injections.
There are also good habits that won’t hurt:
check return value after every call to
sqlite3_*functions and write output ofsqlite3_errmsg()tostderr(=cerr) or to a log file in case of error;cleanup after we’re done by calling
sqlite3_finalize()on every prepared statement when it’s no longer used.Not following these practices will make your karma suffer when someone else uses or debugs your code later.
So, here is the suggested
insertdata1()(I hope, it’s more clean and readable now):