how store primerykey in sqlitedatabase in iphone - iphone

I am creating a database to store the value in table with a primary key but I am getting a problem with the primary key. It is not taking. If I enter the first time it's shown in the database record but if I enter a second time the record is not showing in the database. My application shows bad access in the console.
+(void) getInitialDataToDisplay:(NSString *)dbPath
{
SqltestAppDelegate *appDelegate =(SqltestAppDelegate *)[[UIApplication sharedApplication]delegate];
if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)
{
const char *sql = "select JourneyID,JourneyName,LocationName,Description from UserJourney";
sqlite3_stmt *selectstmt;
if (sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK)
{
while (sqlite3_step(selectstmt) == SQLITE_ROW)
{
NSInteger primaryKey = sqlite3_column_int(selectstmt, 0);
NewJourney *newobj = [[NewJourney alloc]initWithPrimaryKey:primaryKey];
newobj.journeyName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)];
newobj.isDirty = NO;
[appDelegate.journeyList addObject:newobj];
[appDelegate.journeyList release];
}
}
}
else {
sqlite3_close(database);
}
}
+(void) finalizeStatements
{
if (database) sqlite3_close(database);
if (database) sqlite3_finalize(deleteStmt);
if (database) sqlite3_finalize(addStmt);
if (database) sqlite3_finalize(detailSmt);
if (database) sqlite3_finalize(updateStmt);
}
-(id) initWithPrimaryKey:(NSInteger)pk
{
[super init];
journeyID = pk;
isDetailViewHydrated = NO;
return self;
}
-(void) deleteCoffee
{
if (deleteStmt == nil)
{
const char *sql = "delete from UserJourney where JourneyID = ?";
if (sqlite3_prepare_v2(database, sql, -1, &deleteStmt,NULL) != SQLITE_OK)
{
NSAssert1(0,#"Error while creating delete statemnet.'%s'",sqlite3_errmsg(database));
}
//when binding parameters, index starts from 1 and not zero.
sqlite3_bind_int(deleteStmt, 1, journeyID);
if (SQLITE_DONE != sqlite3_step(deleteStmt))
{
NSAssert1(0,#"Error while deleting. '%s'",sqlite3_errmsg(database));
}
sqlite3_reset(deleteStmt);
}
}
-(void) addCoffee
{
if (addStmt == nil)
{
const char *sql = "insert into UserJourney(JourneyName,LocationName,Description) Values(?,?,?)";
if (sqlite3_prepare_v2(database, sql, -1,&addStmt , NULL) != SQLITE_OK)
{
NSAssert1(0,#"Error while creating add statement.'%s'",sqlite3_errmsg(database));
}
sqlite3_bind_text(addStmt, 1 , [journeyName UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStmt, 2 , [locationName UTF8String],-1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStmt, 3, [description UTF8String],-1, SQLITE_TRANSIENT);
if (SQLITE_DONE != sqlite3_step(addStmt))
{
NSAssert1(0,#"Error while inserting data. '%s'",sqlite3_errmsg(database));
}else
{
journeyID = sqlite3_last_insert_rowid(database);
}
sqlite3_reset(addStmt);
}
}
/*-(void) hydrateDetailViewData
{
if (isDetailViewHydrated) return;
if (detailSmt == nil) {
const char *sql = "select JourneyName,Description from UserJourney where JourneyID = ?";
if (sqlite3_prepare_v2(database, sql, -1, &detailSmt,NULL) != SQLITE_OK)
NSAssert1(0,#"Error while creating detail view statement. '%s'",sqlite3_errmsg(database));
}
sqlite3_bind_int(detailSmt,1,journeyID);
if (SQLITE_DONE != sqlite3_step(detailSmt))
{
<#statements#>
}
}*/
-(void)saveAllData
{
if (isDirty) {
if (updateStmt == nil) {
const char *sql = "update UserJourney Set JourneyName = ?,LocationName = ?, Description = ? Where JourneyID =?";
if (sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL) != SQLITE_OK)
NSAssert1(0,#"Error while creating update statement. '%s'",sqlite3_errmsg(database));
}
sqlite3_bind_text(updateStmt, 1, [journeyName UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(updateStmt, 2, [locationName UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(updateStmt, 3, [description UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_int(updateStmt,4, journeyID);
if(SQLITE_DONE != sqlite3_step(updateStmt))
NSAssert1(0, #"Error while updating. '%s'", sqlite3_errmsg(database));
sqlite3_reset(updateStmt);
isDirty = NO;
}
[journeyName release];
journeyName = nil;
isDetailViewHydrated = NO;
}

You have to release your newobj not the array.
Replace this:
[appDelegate.journeyList release];
with this:
[newobj release];

Related

How to insert NSMutableArray elements in Sqlite3 in iPhone

When I am inserting my array elements into sqlite, it is inserting properly. It takes only the first element in array, for remaining it is showing error while inserting. My code is:
NSString *path=[self getDBPath];
sqlite3_stmt *insert_statement = nil;
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
for (int i = 0; i < [array count]; i++)
{
NSLog(#"Array Count is %d",[array count]);
NSString *name=[[array objectAtIndex:i]objectForKey:#"name"];
NSString *add=[[array objectAtIndex:i]objectForKey:#"address"];
if (insert_statement == nil) {
NSString *statement1 = [NSString stringWithFormat:#"insert into tableName (name,address) Values( ?,?)",name,add];
const char *insertSql = [statement1 UTF8String];
if(sqlite3_prepare_v2(database, insertSql, -1, &insert_statement, NULL) != SQLITE_OK){
NSLog(#"Error while creating insert statement.");
insert_statement = nil;
continue;
}
sqlite3_bind_text(insert_statement, 1, [name UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(insert_statement, 2, [add UTF8String], -1, SQLITE_TRANSIENT);
if(SQLITE_DONE != sqlite3_step(insert_statement)){
//NSAssert1(0, #"Error while inserting data. '%s'", sqlite3_errmsg(database));
NSLog(#"Error while inserting data.");
insert_statement = nil;
continue;
}
else{}
sqlite3_reset(insert_statement);
sqlite3_finalize(insert_statement);
insert_statement = nil;
}
}
sqlite3_close(database);
}
Why does it allow only one record?
It's occurred due to finalize statement in loop every time. So it wont let insert other objects after the first object.
Just remove "sqlite3_finalize(insert_statement);" from the loop and set nil to the insert statement "insert_statement = nil;"
After done with loop. Make sure place the "sqlite3_reset(insert_statement);" for each object in the loop. It reset the statement and there is no need to set nil to the statement in loop.
Try this piece of code, it works for me:
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
for (int i = 0; i < [array count]; i++)
{
NSLog(#"Array Count is %d",[array count]);
NSString *name=[[array objectAtIndex:i]objectForKey:#"name"];
NSString *add=[[array objectAtIndex:i]objectForKey:#"address"];
if (insert_statement == nil) {
NSString *statement1 = [NSString stringWithFormat:#"insert into tableName (name,address) Values( ?,?)",name,add];
const char *insertSql = [statement1 UTF8String];
if(sqlite3_prepare_v2(database, insertSql, -1, &insert_statement, NULL) != SQLITE_OK){
NSLog(#"Error while creating insert statement.");
insert_statement = nil;
continue;
}
sqlite3_bind_text(insert_statement, 1, [name UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(insert_statement, 2, [add UTF8String], -1, SQLITE_TRANSIENT);
if(SQLITE_DONE != sqlite3_step(insert_statement)){
//NSAssert1(0, #"Error while inserting data. '%s'", sqlite3_errmsg(database));
NSLog(#"Error while inserting data.");
insert_statement = nil;
continue;
}
else{
sqlite3_reset(insert_statement);
}
}
}
insert_statement = nil;
sqlite3_finalize(insert_statement);
sqlite3_close(database);
}
try this code its works for me
for(int i=0;i<[data count];i++)
{
NSMutableDictionary *myDict = [data objectAtIndex:i];
selectSql=[NSString stringWithFormat:#"INSERT INTO [commentTable] values('%#','%#')",[myDict valueForKey:#"usertype"],[myDict valueForKey:#"userid"]];
if (sqlite3_prepare_v2(database, [selectSql cStringUsingEncoding:NSUTF8StringEncoding], -1, &statement, NULL) == SQLITE_OK)
{
if (sqlite3_step(statement) == SQLITE_DONE)
{
ret = YES;
NSLog(#"DB SUPPORT - commentTable INSERTED");
}
else
{
NSLog(#"DB SUPPORT - ERROR commentTable INSERT");
}
}
else
{
NSLog(#"DB SUPPORT - Sql Preparing Error ( INSERT commentTable)");
}
sqlite3_finalize(statement);
}
sqlite3_close(database);
You can use :
for (int i = 0; i < [mutArray count]; i++)
{
NSString *string = [mutArray objectAtIndex:i];
// insert query
insert into table_name ('string') values(column_name);
}
Ref : How to add nsmutable array into sqlite database table

How to delete all the contents from SQLite table in an iOS app

I want to delete all the rows from the table in my iPhone app. I am using following code but it is not deleting the data:
+(void)emptyData:(NSString*)dbPath{
NSString *query = #"delete from survey_question_responses";
const char *sqlStatement = [query UTF8String];
sqlite3_stmt *compiledStatement;
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
// Loop through the results and add them to the feeds array
while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
// Read the data from the result row
NSLog(#"result is here");
}
// Release the compiled statement from memory
sqlite3_finalize(compiledStatement);
}
}
NSString *query1 = [NSString stringWithFormat:#"DELETE from TableName"];
[[DBManager sharedDatabase]executeQuery:query1];
where
-(void)executeQuery:(NSString*)_query
{
const char *sql = [_query cStringUsingEncoding:NSUTF8StringEncoding];
sqlite3_stmt *statement = nil;
if(sqlite3_prepare_v2(dataBaseConnection,sql, -1, &statement, NULL)!= SQLITE_OK)
{
NSAssert1(0,#"error preparing statement",sqlite3_errmsg(dataBaseConnection));
}
else
{
sqlite3_step(statement);
}
sqlite3_finalize(statement);
}
Get the path of the DB:
NSString*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documentDirectory=[paths objectAtIndex:0];
NSSting*dBPath=[documentDirectory stringByAppendingPathComponent:#"dB.sql"];
Open the DB:
if(sqlite3_open([dBPath UTF8String], &database) == SQLITE_OK){
NSString*query=[NSString stringWithFormat:#"DELETE from tablename"];
}
Execute the query statement:
if(sqlite3_exec(database, [query UTF8String],NULL, NULL, NULL) == SQLITE_OK){
NSLog(#"Delete Query Success);
}
else{
NSLog(#"Delete Query Failed);}
sqlite3_close(database);
}
Hope this helps..

how to insert data into data base in iphone

i am inserting data into data base using following code but data is not inserted in the database
i am using following code
I am inserting data into iphone application but it does not insert
i have table survey_question_master(question_id,question_text,question_type)
- (void) addCoffee {
if(addStmt == nil) {
const char *sql = "insert into survey_question_master(question_text,question_type) Values( ? ,?)";
if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
NSAssert1(0, #"Error while creating add statement. '%s'", sqlite3_errmsg(database));
}
sqlite3_bind_text(addStmt, 1, [question_text UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStmt, 2, [question_type UTF8String], -1, SQLITE_TRANSIENT);
if(SQLITE_DONE != sqlite3_step(addStmt))
NSAssert1(0, #"Error while inserting data. '%s'", sqlite3_errmsg(database));
else
question_ID = sqlite3_last_insert_rowid(database);
//Reset the add statement.
sqlite3_reset(addStmt);
}
- (void) addCoffee:(DataController *)coffeeObj {
//Add it to the database.
[coffeeObj addCoffee];
//Add it to the coffee array.
[coffeeArray addObject:coffeeObj];
NSLog(#"Succeessfully Added");
}
- (NSString *) getDBPath
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
return [documentsDir stringByAppendingPathComponent:#"database.sqlite"];
}
-(void)SaveData:(NSMutableArray *)insertDataArray
{
sqlite3_stmt *stmt;
const char *dbPath = [[self getDBPath] UTF8String];
if(sqlite3_open(dbPath, &database)==SQLITE_OK)
{
NSString *insertSQL = [NSString stringWithFormat:#"insert into items (c1,c2,c3,c4 , c5 ,c6,c7,c8,c9) values (\"%#\",\"%#\",\"%#\",\"%#\",\"%#\",\"%#\",\"%#\",\"%#\",\"%#\")",[insertDataArray objectAtIndex:0],[insertDataArray objectAtIndex:1],[insertDataArray objectAtIndex:2],[insertDataArray objectAtIndex:3],[insertDataArray objectAtIndex:4],[insertDataArray objectAtIndex:5],[insertDataArray objectAtIndex:6],[insertDataArray objectAtIndex:7],[insertDataArray objectAtIndex:8]];
NSLog(#"%#",insertSQL);
const char *insert_stmt = [insertSQL UTF8String];
sqlite3_prepare_v2(database, insert_stmt, -1, &stmt, NULL);
if(sqlite3_step(stmt)==SQLITE_DONE)
{
NSLog(#"insert success");
}
else
{
NSLog(#"insert un success");
NSAssert1(0, #"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
}
int success=sqlite3_step(stmt);
if (success == SQLITE_ERROR)
{
NSAssert1(0, #"Error: failed to insert into the database with message '%s'.", sqlite3_errmsg(database));
} sqlite3_finalize(stmt);
sqlite3_close(database);
}
}

How to use sqlite_prepare_statement to InsertData in Sqlite Database in iphone application

-(void)insertDataImage_ID:(NSInteger)ID ImageName:(NSString*)Image Bookmark:(NSString*)Title
{
[self checkAndCreateDB];
sqlite3 *database;
if (sqlite3_open([DBPath UTF8String], &database)==SQLITE_OK) {
NSString *statement;
sqlite3_stmt *compliedstatement;
statement =[[NSString alloc] initWithFormat:#"insert into tblBookMark values(%d, '%#' , '%#')", ID,Image, Title ];
statement = [[NSString alloc] initWithFormat :#"select * from tblBookMark"];
NSLog(#"T-1");
const char *sqlstatement = [statement UTF8String];
if (sqlite3_prepare_v2(database, sqlstatement, -1, &compliedstatement, NULL) == SQLITE_OK) {
NSLog(#"T-2");
if (SQLITE_DONE!=sqlite3_step(compliedstatement)) {
NSLog(#"T-3");
NSAssert1 (0,#"Error by inserting '%s'",sqlite3_errmsg(database));
UIAlertView *AlertOK=[[UIAlertView alloc] initWithTitle:#"Error !" message:#"Error by inserting" delegate:self cancelButtonTitle:#"No" otherButtonTitles:#"Yes",nil];
[AlertOK show];
[AlertOK release];
}
NSLog(#"T-4");
sqlite3_finalize(compliedstatement);
}
NSLog(#"T-5");
}
sqlite3_close(database);
NSLog(#"T-6");
}
What is wrong in this code. It not showing any error but it
if (sqlite3_prepare_v2(database, sqlstatement, -1, &compliedstatement, NULL) == SQLITE_OK)
Code flow is not entering in this line can any one help me to identify the error or suggest me solution.
Code
static sqlite3_stmt *insertStmt = nil;
if(insertStmt == nil)
{
insertSql = "INSERT INTO Loginchk (uname,password) VALUES(?,?)";
if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK)
NSAssert1(0, #"Error while creating insert statement. '%s'", sqlite3_errmsg(database));
}
sqlite3_bind_text(insertStmt, 1, [Gunameq UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(insertStmt, 2, [Gpassq UTF8String], -1, SQLITE_TRANSIENT);
if(SQLITE_DONE != sqlite3_step(insertStmt))
NSAssert1(0, #"Error while inserting data. '%s'", sqlite3_errmsg(database));
else
NSLog("Inserted");
//Reset the add statement.
sqlite3_reset(insertStmt);
insertStmt = nil;
You're not doing any error checking at all, no wonder you don't know what's going wrong!
Take a look at the sqlite 3 error codes. If the error is not SQLITE_OK, what is it?
if (sqlite3_prepare_v2(database, sqlstatement, -1, &compliedstatement, NULL) == SQLITE_OK) {
...
} else {
NSLog(#"%i - %#", sqlite3_errcode(database), sqlite3_errmsg(database));
}
fix your query..."INSERT INTO tblBookMark (field1,field2) VALUES("","")";

Why can't I execute this code?

NSString *event=#"max";
NSString *venue=#"tvm";
NSString *edate=#"may 6";
NSString *etime=#"10:30";
int admts=5;
NSString *ima=ticobj.iimg;
sqlite3 *database;
databaseName = #"smbhDB.sql";
sqlite3_stmt *addStatement ;
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
if(addStatement == nil) {
const char *sql ="insert into tickets (admittance, venue, event, date, time, imagedata) Values (?,?,?,?,?,?)";
if(sqlite3_prepare_v2(database, sql, -1, &addStatement, NULL) != SQLITE_OK)
NSAssert1(0, #"444 Error while creating add statement. '%s'", sqlite3_errmsg(database));
}
sqlite3_bind_int(addStatement,1,admts);
sqlite3_bind_text(addStatement, 2, [venue UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStatement, 3, [event UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStatement, 4, [edate UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStatement, 5, [etime UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStatement, 6, [ima UTF8String], -1, SQLITE_TRANSIENT);
if(SQLITE_DONE != sqlite3_step(addStatement))
NSAssert1(0, #"Error while inserting data. '%s'", sqlite3_errmsg(database));
if(sqlite3_prepare_v2(database, sql, -1, &Statement, NULL) == SQLITE_OK) {
sqlite3_exec(database, sql, -1, &Statement, NULL);
}
sqlite3_reset(addStatement);
Why can't I execute this code?
Where is
sqlite3_open([databasePath UTF8String], &database); ?
You can't work with a closed database.
-(BOOL)insertDatabaseValue:(SignIn *)objFavourie isUpdate:(BOOL)update
{
BOOL returnValue = YES;
sqlite3_stmt *insertStmt = nil;
sqlite3 *database = nil;
if (sqlite3_config(SQLITE_CONFIG_SERIALIZED) == SQLITE_OK){
returnValue = NO;
}
if (sqlite3_open([DataBasePath UTF8String], &database) == SQLITE_OK){
if(insertStmt == nil) {
NSString *aString;
if(!update)
aString =[NSString stringWithFormat:#"INSERT INTO Sanjay('Name', 'Password') Values(?, ?)"];
else
aString =[NSString stringWithFormat:#"UPDATE Sanjay SET Password = ? where 'Name'=%#",objFavourie.strName];
const char *sql = [aString UTF8String];
if(sqlite3_prepare_v2(database, sql, -1, &insertStmt, NULL) != SQLITE_OK)
{
NSLog(#"Error while creating insert :%s add statement.", sqlite3_errmsg(database));
returnValue = NO;
}
}
if(sqlite3_bind_text(insertStmt, 1, [objFavourie.strName UTF8String], -1, SQLITE_TRANSIENT) != SQLITE_OK){
returnValue = NO;
}
if(sqlite3_bind_text(insertStmt, 2, [objFavourie.strPassword UTF8String], -1, SQLITE_TRANSIENT) != SQLITE_OK) {
returnValue = NO;
}
if(SQLITE_DONE != sqlite3_step(insertStmt)){
NSLog(#"Error while inserting into '%s'", sqlite3_errmsg(database));
returnValue = NO;
}
sqlite3_reset(insertStmt);
if (insertStmt) {
sqlite3_finalize(insertStmt);
insertStmt = nil;
}
sqlite3_close(database);
database = nil;
}
else {
returnValue = NO;
}
return returnValue;
}