如何将数据保存在iphone中的sqlite3

我想创build数据库使用SQLite的经理。但值不存储在数据库中。如果我点击保存button警报消息将显示在这样的“数据插入失败”。我试图纠正这些问题。这种情况下,我访问了这么多的教程。但我无法纠正我的问题。昨天起,我完全阻止这个问题。请给我任何想法或build议如何保存数据。谢谢大家访问的问题。

DataBase.m

//创buildDATABASE

-(BOOL)createDB { NSString *docsDir; NSArray *dirPaths; // Get the document directory dirPaths=NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); docsDir=dirPaths[0]; // Build the path to the database file databasePath=[[NSString alloc]initWithString:[docsDir stringByAppendingPathComponent:@"Feedback.db"]]; BOOL isSuccess=YES; NSFileManager *fileManager=[NSFileManager defaultManager]; if([fileManager fileExistsAtPath:databasePath]==0) { const char *dbpath=[databasePath UTF8String]; if(sqlite3_open(dbpath, &database)==SQLITE_OK) { char *errMsg; const char *sql_stmt= "create table if not exists Feeback details (Traineeid integer, Trainername text,Traineename text,Rating float)"; if(sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg)!=SQLITE_OK) { isSuccess=NO; NSLog(@"Failed to create table"); } sqlite3_close(database); return isSuccess; } else { isSuccess=NO; NSLog(@"Failed to open/Create database"); } } return isSuccess; } // save data in the Database -(BOOL) saveData:(NSString *)Traineeid Trainername:(NSString *)Trainername Traineename:(NSString *)Traineename Rating:(NSString *)Rating; { const char *dbpath=[databasePath UTF8String]; if(sqlite3_open(dbpath, &database)==SQLITE_OK) { NSString *insertSQL=[NSString stringWithFormat:@"insert into Feedbackdetails(Traineeid,Trainername,Traineename,Rating) values(\"%d\",\"%@\", \"%@\", \"%@\")",[Traineeid integerValue],Trainername,Traineename,Rating]; const char *insert_stmt=[insertSQL UTF8String]; sqlite3_prepare_v2(database, insert_stmt, -1, &statement, NULL); if(sqlite3_step(statement)==SQLITE_DONE) { return YES; } else { return NO; } sqlite3_reset(statement); } return NO; } FeebBackForm.m -(IBAction)saveData:(id)sender { BOOL success=NO; NSString *alertString = @"Data Insertion failed"; if (Traineeid.text.length>0 &&Trainername.text.length>0 &&Traineename.text.length>0 &&Rating.text.length>0) { success=[[DBManager getSharedInstance]saveData:Traineeid.text Trainername:Trainername.text Traineename:Traineename.text Rating:Rating.text]; } else { alertString = @"Enter all fields"; } if (success == NO) { UIAlertView *alert = [[UIAlertView alloc]initWithTitle:alertString message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } } 

你的put语句在你的sql语句中引用你的int params。

这可能不是你唯一的问题,但你应该绑定参数。 它看起来像你在SQL插入语句中的整数值引号,这是在您的表中定义为整数。

 "create table if not exists Feeback details (Traineeid integer, Trainername text,Traineename text,Rating float)" "insert into Feedbackdetails(Traineeid,Trainername,Traineename,Rating) values(\"%d\",\"%@\", \"%@\", \"%@\")" 

注意你的双引号整数。

另外,注销数据库的path(即使在模拟器中运行)。 转到sqlite命令行,确保数据库存在,空表在那里。 这有助于排除故障。

最后,看看fmdb的sqlite包装器 – 它有助于使用sqlite,但它的代码也显示了使用sqlite raw的好模式,如果这是你的偏好。

这里有一个类似的function,从我的样品之一,显示如何绑定PARAMS。 你也应该完成你准备的东西:

 - (void)updateContact: (Contact*)contact error:(NSError**)error { if (![self ensureDatabaseOpen:error]) { return; } NSLog(@">> ContactManager::updateContact"); // prep statement sqlite3_stmt *statement; NSString *querySQL = @"update contacts set name=?,address=?,phone=? where id=?"; NSLog(@"query: %@", querySQL); const char *query_stmt = [querySQL UTF8String]; // preparing a query compiles the query so it can be re-used. sqlite3_prepare_v2(_contactDb, query_stmt, -1, &statement, NULL); sqlite3_bind_text(statement, 1, [[contact name] UTF8String], -1, SQLITE_STATIC); sqlite3_bind_text(statement, 2, [[contact address] UTF8String], -1, SQLITE_STATIC); sqlite3_bind_text(statement, 3, [[contact phone] UTF8String], -1, SQLITE_STATIC); sqlite3_bind_int64(statement, 4, [[contact id] longLongValue]); NSLog(@"bind name: %@", [contact name]); NSLog(@"bind address: %@", [contact address]); NSLog(@"bind phone: %@", [contact phone]); NSLog(@"bind int64: %qi", [[contact id] longLongValue]); // process result if (sqlite3_step(statement) != SQLITE_DONE) { NSLog(@"error: %@", sqlite3_errmsg(_contactDb)); } sqlite3_finalize(statement); }