What I’m trying to do is the following:
-
user sees a tableview populated with existing records in my db; <-everything fine here
-
user touches the + button to add an entry and gets another really simple view with a textfield and a button.
-
in my button’s IBAction method, I’ve used this code to message my “DbOperations” class where the insert should happen:
DbOperations *med = [[DbOperations alloc] init];
[med InsertMedicine:self.txtMedicina.text]; -
user then gets back to the tableview and can see immediately the new entry. BUT… nothing has been written into the db!
This is the method for inserting the entry into the db:
- (void)InsertMedicine:(NSString *) med {
//Check to see if the new medicine already exists
fileMgr = [NSFileManager defaultManager];
sqlite3_stmt *stmt=nil;
sqlite3 *dbase;
const char *sql = "SELECT * FROM listamedicine";
BOOL response= NO;
NSString *database = [self.GetDocumentDirectory stringByAppendingPathComponent:@"db.sqlite"];
sqlite3_open([database UTF8String], &dbase);
sqlite3_prepare_v2(dbase, sql, -1, &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW) {
if ([med caseInsensitiveCompare:[NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)]] == NSOrderedSame) {
response=YES;
}
}
sqlite3_finalize(stmt);
if (!response) {
//Insert the new medicine
sqlite3_stmt *stmt=nil;
NSString *stmsql = [NSString stringWithFormat:@"INSERT INTO listamedicine (nomemedicina) VALUES (\"%@\")", med];
const char *sql2 = [stmsql UTF8String];
sqlite3_prepare_v2(dbase, sql2, -1, &stmt, NULL);
sqlite3_step(stmt);
} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Errore"
message:@"La medicina che stai cercando di inserire esiste già."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
sqlite3_finalize(stmt);
sqlite3_close(dbase);
}
And this is the code my tableview uses to populate the cells:
- (NSMutableArray *)listMedicine {
fileMgr = [NSFileManager defaultManager];
sqlite3_stmt *stmt=nil;
sqlite3 *mybd=NULL;
const char *sql = "SELECT * FROM listamedicine";
NSMutableArray *listaMedicine = [[NSMutableArray alloc]init];
//Open db
NSString *database = [self.GetDocumentDirectory stringByAppendingPathComponent:@"db.sqlite"];
sqlite3_open([database UTF8String], &mybd);
sqlite3_prepare_v2(mybd, sql, -1, &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW) {
Medicina *myMedicine = [[Medicina alloc]init];
myMedicine.dataId=[[NSNumber numberWithInt:(int)sqlite3_column_int(stmt, 0)] intValue];
myMedicine.nome=[NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)];
[listaMedicine addObject:myMedicine];
}
sqlite3_finalize(stmt);
sqlite3_close(mybd);
return listaMedicine;
}
This is located in my “DbOperations” class.
The cellForRowAtIndexPath method in the tableview looks like this:
static NSString *CellIdentifier = @"CellaMedicina";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellaMedicina"];
}
//Get the object from the array.
DbOperations *med = [[DbOperations alloc] init];
self.medicine = [med listMedicine];
Medicina *medicina = [self.medicine objectAtIndex:indexPath.row];
cell.textLabel.text = medicina.nome;
// Set up the cell
return cell;
What am I doing wrong?
Ok I’ve finally solved the problem…
I have a method to copy the db from the bundle to the document folder, but I was not calling it anywhere.