Sqlite returns different values - iOS - ios

The below function when called for the same 'DBName' value returns different bool values. I was expecting a duplicate to be found. On first attempt it works and on second attempt it doesn't. Am I doing anything wrong?
-(BOOL)CheckForDB:(NSString *)dbPath{
if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {
if(checkForDB == nil){
const char *sql = "SELECT COUNT(*) FROM BookingInfo WHERE DBName = ?";
if(sqlite3_prepare_v2(database, sql, -1, &checkForDB, NULL) != SQLITE_OK) {
NSAssert1(0, #"Error while fetching uploaded status. '%s'", sqlite3_errmsg(database));
}
}
sqlite3_bind_text(checkForDB, 1, [dbName UTF8String], -1, SQLITE_TRANSIENT);
NSLog(#"checking status %#",dbName);
while(sqlite3_step(checkForDB) == SQLITE_ROW) {
NSString *status=[NSString stringWithUTF8String:(char *)sqlite3_column_text(checkForDB, 0)];
return [status boolValue];
}
return NO;
sqlite3_reset(checkForDB);
}else{
sqlite3_close(database);
}
}

I have found the solution. I have to call sqlite3_reset(checkForDB) one more time before I call return YES
while(sqlite3_step(checkForDB) == SQLITE_ROW) {
NSString *status=[NSString stringWithUTF8String:(char *)sqlite3_column_text(checkForDB, 0)];
sqlite3_reset(checkForDB)
return [status boolValue];
}

Related

Insert records in sqlite database

I have a sqlite db and i want to insert row in it . I used this code .
-(void)InsertRecords{
NSString *insertSQL = [NSString stringWithFormat:
#"INSERT INTO notes (id, title, content,dataAdd,category) VALUES (\"%#\", \"%#\", \"%#\" ,\"%#\",\"%#\")",
#"1",
#"mountain",
#"Prahova",
#"12.09.2019",
#"public"];
const char *insert_stmt = [insertSQL UTF8String];
sqlite3_stmt *updateStmt = nil;
sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL);
if(sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL) == SQLITE_OK){
if (sqlite3_step(statement) == SQLITE_DONE)
{
NSLog(#"data inserted");
}
else{
NSLog(#"Error while creating update statement. '%s'", sqlite3_errmsg(contactDB));
}
}
else{
NSLog(#"Error while creating update statement. '%s'", sqlite3_errmsg(contactDB));
}
sqlite3_finalize(statement);
sqlite3_close(contactDB);
}
and it's log : data inserted .
When i do this :
querySQL1 = #"select id from notes where category LIKE 'public'";
const char *query_stmt = [querySQL1 UTF8String];
sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL);
NSString *idNr;
while (sqlite3_step(statement) == SQLITE_ROW)
{
idNr =[[NSString alloc] initWithUTF8String:
(const char *) sqlite3_column_text(statement, 0)];
}
NSLog(#"%#",idNr);
idNr is null .
ANy ideea what is happening ? Any help will be appreciate . Thanks.
The NSString allocation was wrong statement, There were no need to alloc NSString object.
I changed :
NSString *idNr=#"";
while (sqlite3_step(statement) == SQLITE_ROW)
{
idNr =[NSString stringWithUTF8String:
(const char *) sqlite3_column_text(statement, 0)];
}
Try to use this snippet:
sqlite3 *database;
if (sqlite3_open(<#DBPath#>, &database)
!= SQLITE_OK) {
sqlite3_close(database);
NSAssert(0, #"Failed to open database");
return nil;
}
char *update = "INSERT OR REPLACE INTO <#Table name#> (<#key1#>,<#key2#>) VALUES (?,?);";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(database, update, -1, &stmt, nil)
== SQLITE_OK) {
sqlite3_bind_text(stmt, <#the index#>,<#The text value#> , -1, NULL);
sqlite3_bind_int(stmt, <#the index#>, <#the int value#>);
}
if (sqlite3_step(stmt) != SQLITE_DONE){
NSLog(#"Error inserting version in table <#tablename#>");
return;
}
sqlite3_finalize(stmt);
sqlite3_close(database);
It uses the sqlite3_bind* functions to bind the values to the keys.

Get inserting values from database

I'm inserting coordinates values with text into database. When i retrieving values from database it's not getting. I used NSLog for retrieve values, but nslog coordinates value is 0. getmainsql is SELECT textnotes,text_id,txcoor,tycoor FROM textnote where text_id = '159' AND txcoor = '0.000000' AND tycoor = '0.000000'
Insert:
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
const char *sql = [[NSString stringWithFormat:#"SELECT textnotes,text_id,txcoor,tycoor FROM textnote where textnotes = '%#' AND text_id = '%#' AND txcoor = '%f' AND tycoor = '%f'",txtview.text,artID,xcor,ycor] cStringUsingEncoding:NSUTF8StringEncoding];
NSLog(#"sql is %s",sql);
BOOL favExist = false;
sqlite3_stmt *statement, *addStmt;
if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
// We "step" through the results - once for each row.
while (sqlite3_step(statement) == SQLITE_ROW) {
favExist = true;
}
}
if(!favExist){
const char *sqlInsert = [[NSString stringWithFormat:#"insert into textnote (textnotes,text_id,txcoor,tycoor ) values ('%#','%#','%f','%f')", txtview.text,artID,xcor,ycor] cStringUsingEncoding:NSUTF8StringEncoding];
NSLog(#"sql insert is %s",sqlInsert);
// [catID release];
if(sqlite3_prepare_v2(database, sqlInsert, -1, &addStmt, NULL) != SQLITE_OK)
NSAssert1(0, #"Error while creating add statement. '%s'", sqlite3_errmsg(database));
if(SQLITE_DONE != sqlite3_step(addStmt))
NSAssert1(0, #"Error while inserting data. '%s'", sqlite3_errmsg(database));
.h file:
#property(nonatomic) float a;
#property(nonatomic) float b;
Getting value:
const char *sql = [[NSString stringWithFormat:#"SELECT textnotes,text_id,txcoor,tycoor FROM textnote where text_id = '%#' AND txcoor = '%f' AND tycoor = '%f'",artID,a,b] cStringUsingEncoding:NSUTF8StringEncoding];
NSLog(#"getmainsql is %s",sql);
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
// We "step" through the results - once for each row.
while (sqlite3_step(statement) == SQLITE_ROW) {
xff=sqlite3_column_double(statement, 2);
yff=sqlite3_column_double(statement, 3);
art_Id = sqlite3_column_int(statement, 1);
NSLog(#"xff is %f",xff);
NSLog(#"yff is %f",yff);
// NSLog(#"zc is %#",zc);
NSLog(#"art_Id is %ld",(long)art_Id);

Data not getting deleted from database using SQLite

I have loaded some data in my tableview using SQLite database in the format 1) some value, 2) some value so on. 1 and 2 are primary key, this is my code for delete which I have put on the swipe on delete function of the table view
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
[self openDB];
NSString *idofTable = [NSString new];
NSScanner *scanner = [[NSScanner alloc] initWithString:[self.tableLogView cellForRowAtIndexPath:indexPath].textLabel.text];
[scanner scanUpToString:#")" intoString:&idofTable];
NSLog(#"id=%#, text=%#", idofTable, [self.tableLogView cellForRowAtIndexPath:indexPath].textLabel.text);
if(editingStyle==UITableViewCellEditingStyleDelete)
{
char *error;
NSString *sql = [NSString stringWithFormat:#"DELETE FROM History WHERE 'id' = '%#'", idofTable];
NSLog(#"%#",sql);
if(sqlite3_exec(db, [sql UTF8String], NULL, NULL,&error)!=SQLITE_OK)
{
sqlite3_close(db);
NSAssert(0,#"Could not create table");
}
else
{
NSLog(#"Data Deleted");
sqlite3_exec(db, "COMMIT", NULL, NULL, &error);
}
}
[tableLogView reloadData];
}
The log "Data Deleted" gets printed but the data doesnt get deleted in database nor in tableview. Any help appreciated. I dont know where the error is occuring, the query seems to be correct.
Try This
if(editingStyle==UITableViewCellEditingStyleDelete)
{
NSString *dbFilePath =[DBclass getDBPath];
sqlite3_stmt *deleteStmt = nil;
if(sqlite3_open([dbFilePath UTF8String], &database)==SQLITE_OK)
{
NSString *deleteString=[NSString stringWithFormat:#"delete from table where ID =%d",idValue];
const char *sql =[deleteString UTF8String];
if(sqlite3_prepare_v2(database, sql, -1, &deleteStmt, NULL) != SQLITE_OK)
NSAssert1(0, #"Error while creating delete view statement. '%s'", sqlite3_errmsg(database));
if(SQLITE_DONE != sqlite3_step(deleteStmt))
NSAssert1(0, #"Error while deleting data. '%s'", sqlite3_errmsg(database));
else
NSLog(#"Success in deleting the medicine.");
sqlite3_close(database);
}
}
[tableLogView reloadData];
You arent finalising nor closing the Database.
sqlite3_finalize(stmt);
sqlite3_close(DB);
This is the right way to delete a row:
if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {
NSString *sql = [NSString stringWithFormat:#"DELETE FROM History WHERE 'id' = '%#'", idofTable];
const char *del_stmt = [sql UTF8String];
sqlite3_prepare_v2(contactDB, del_stmt, -1, & deleteStmt, NULL);
if (sqlite3_step(deleteStmt) == SQLITE_DONE)
{
NSLog(#"Data Deleted");
sqlite3_exec(db, "COMMIT", NULL, NULL, &error);
}else {
NSLog( #"Error: %s", sqlite3_errmsg(database) );
}
sqlite3_finalize(deleteStmt);
sqlite3_close(contactDB);
}

I have 6MB memory leaks when I'm working with sqlite

I have 6MB memory leaks when I'm working with sqlite. Now I'm testing getBookWithIdTest method.
-(IBAction) onTest:(id)sender
{
NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
for (int i=0; i<100; i++)
{
[DatabaseManager getBookWithIdTest:i];
}
[myPool drain];
}
I have 6 MB leaked memory. But why?
+ (BookSettings *)getBookWithIdTest:(int)abookId
{
BookSettings *book = [[[BookSettings alloc] init] autorelease];
sqlite3 *database;
if(sqlite3_open([DatabaseManager databasePath], &database) == SQLITE_OK)
{
sqlite3_stmt *compiledStatement;
//FIRST PART
const char *sqlStatementBook = [[NSString stringWithFormat:#"SELECT * FROM t_abooks"] cStringUsingEncoding:NSASCIIStringEncoding];
if(sqlite3_prepare_v2(database, sqlStatementBook, -1, &compiledStatement, NULL) == SQLITE_OK)
{
while(sqlite3_step(compiledStatement) == SQLITE_ROW)
{
}
}
else NSLog(#"sqlite3_prepare_v2 error %s", sqlite3_errmsg(database));
sqlite3_reset(compiledStatement);
//END FIRST PART
// SECOND PART
const char *sqlStatementAuthors = [[NSString stringWithFormat:#"SELECT * FROM t_authors"] cStringUsingEncoding:NSASCIIStringEncoding];
if(sqlite3_prepare_v2(database, sqlStatementAuthors, -1, &compiledStatement, NULL) == SQLITE_OK)
{
while(sqlite3_step(compiledStatement) == SQLITE_ROW)
{
}
}
else NSLog(#"sqlite3_prepare_v2 error %s", sqlite3_errmsg(database));
sqlite3_reset(compiledStatement);
//END SECOND PART
sqlite3_finalize(compiledStatement);
} else NSLog(#"sqlite3_open error");
sqlite3_close(database);
return book;
}
But If I removed FIRST PART or SECOND PART I'll have no leaks.
For example
+ (BookSettings *)getBookWithIdTest:(int)abookId
{
BookSettings *book = [[[BookSettings alloc] init] autorelease];
sqlite3 *database;
if(sqlite3_open([DatabaseManager databasePath], &database) == SQLITE_OK)
{
sqlite3_stmt *compiledStatement;
//FIRST PART -removed
// SECOND PART
const char *sqlStatementAuthors = [[NSString stringWithFormat:#"SELECT * FROM t_authors"] cStringUsingEncoding:NSASCIIStringEncoding];
if(sqlite3_prepare_v2(database, sqlStatementAuthors, -1, &compiledStatement, NULL) == SQLITE_OK)
{
while(sqlite3_step(compiledStatement) == SQLITE_ROW)
{
}
}
else NSLog(#"sqlite3_prepare_v2 error %s", sqlite3_errmsg(database));
sqlite3_reset(compiledStatement);
sqlite3_finalize(compiledStatement);
} else NSLog(#"sqlite3_open error");
sqlite3_close(database);
return book;
}
I solved the problem. I need to add
sqlite3_finalize(compiledStatement);
to the END of FIRST PART.

Sqlite row not deleting

When I try to delete a row from my iphone app,I could correctly fetch the id but the row is not deleting.
-(void)delete_profile:(NSString *)mID {
NSLog(#"menuID: %#",mID);
sqlite3 *database;
sqlite3_stmt *deleteStmt=nil;
if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {
if(deleteStmt == nil) {
const char *sql = "delete from item where menuid = ?";
if(sqlite3_prepare_v2(database, sql, -1, &deleteStmt, NULL) != SQLITE_OK)
NSAssert1(0, #"Error while creating delete statement. '%s'", sqlite3_errmsg(database));
}
//When binding parameters, index starts from 1 and not zero.
sqlite3_bind_int(deleteStmt, 1, [mID integerValue]);
if (SQLITE_DONE != sqlite3_step(deleteStmt))
NSAssert1(0, #"Error while deleting. '%s'", sqlite3_errmsg(database));
sqlite3_reset(deleteStmt);
}
sqlite3_close(database);
}
Please check your menuid Datatype . and bind before prepare or use like below example
if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {
NSString *sql = [NSString stringWithFormat:#"delete from item where menuid =%d",[mID intValue]];
const char *del_stmt = [sql UTF8String];
sqlite3_prepare_v2(contactDB, del_stmt, -1, & deleteStmt, NULL);
if (sqlite3_step(deleteStmt) == SQLITE_DONE)
{
} else {
}
sqlite3_finalize(deleteStmt);
sqlite3_close(contactDB);
}
must check your dbPath and db name (case sensitivity)
-(void)delete_profile:(NSString *)mID {
{
NSString *sql_str=[NSString stringWithFormat:#"DELETE FROM item where menuid = %d",[mID intValue]];
const char *sql = [sql_str UTF8String];
sqlite3 *database;
if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)
{
sqlite3_stmt *deleteStmt;
if(sqlite3_prepare_v2(database, sql, -1, &deleteStmt, NULL) == SQLITE_OK)
{
if(sqlite3_step(deleteStmt) != SQLITE_DONE )
{
NSLog( #"Error: %s", sqlite3_errmsg(database) );
}
else
{
// NSLog( #"row id = %d", (sqlite3_last_insert_rowid(database)+1));
NSLog(#"No Error");
}
}
sqlite3_finalize(deleteStmt);
}
sqlite3_close(database);
}

Resources