我正在使用此代码在我的数据库中插入数据
但它不起作用..
我的数据未插入表中..
可能是什么问题??
function.h
中的
+(BOOL)insertStudentinfoData:(NSString *)first_name last_name:(NSString *)last_name phone_num:(NSString *)phone_num;
function.m
中的
+(BOOL)insertStudentinfoData:(NSString *)first_name last_name:(NSString *)last_name phone_num:(NSString *)phone_num
{
NSString *sql = [NSString stringWithFormat:@"insert into add_data
values(NULL,'%@','%@','%@')",first_name,last_name,phone_num];
return [DBOperation executeSQL:sql];
}
我正在提供来自此
的数据 [Function insertStudentinfoData:@"hello" last_name:@"w3qrq" phone_num:@"efew"];
但我的数据未插入表
////在DBOperation.h中
+(BOOL) executeSQL:(NSString *)sqlTmp {
if(conn == SQLITE_OK) {
NSLog(@"\n\n%@",sqlTmp);
const char *sqlStmt = [sqlTmp cStringUsingEncoding:NSUTF8StringEncoding];
sqlite3_stmt *cmp_sqlStmt1;
int returnValue = sqlite3_prepare_v2(database, sqlStmt, -1, &cmp_sqlStmt1, NULL);
returnValue == SQLITE_OK ? NSLog(@"\n Inserted \n") :NSLog(@"\n Not Inserted \n");
sqlite3_step(cmp_sqlStmt1);
sqlite3_finalize(cmp_sqlStmt1);
if (returnValue == SQLITE_OK) {
return TRUE;
}
}
return FALSE;
}
答案 0 :(得分:1)
我猜你正在传递PRIMARY KEY的NULL值,首先重置模拟器
如果您没有指定列名并插入值,那么您应该按照创建的列的特定顺序传递每列的值,否则最好指定列
NSString *sql = [NSString stringWithFormat:@"INSERT INTO add_data
(first_name,last_name,phone_num) VALUE('%@','%@','%@')",first_name,last_name,phone_num];
或
NSString *sql =[NSString stringWithFormat:@"INSERT INTO add_data
(first_name,last_name,phone_num,email,address,city,zip) VALUES
('%@','%@','%@','%@','%@','%@','%@');",first_name,last_name,phone_num,email,address,city,zip];
答案 1 :(得分:0)
您确定数据库是否已正确初始化?我总是遇到DB实际上没有问题。您使用的是哪个DB Framework?
[编辑]你看到这个日志声明吗?
的NSLog(@ “\ n \ n%@”,sqlTmp);
你自己写过DBOperations课了吗?我认为你使用的静态变量存在一些问题。我建议使用像fmdb之类的现有数据库框架,或者修改你的类以便它使用Singleton模式。
哦,还有一件事:你是否在同一个线程中调用所有方法? SQlite DB不是线程安全的!
[edit2]您可以使用此处提供的链接:SQLite3 error - iOS来检查returnValue中的值实际指示的内容 - 然后找出潜在的错误。 现在最好修改你未插入的语句,如下所示:
returnValue == SQLITE_OK ? NSLog(@"\n Inserted \n") :NSLog(@"\n Not Inserted with code: %i\n",returnValue);
答案 2 :(得分:0)
如果您提供要插入的列的名称,该怎么办:
insert into T (foo, bar, baz)
values( ....)
答案 3 :(得分:0)
以这种方式尝试查看完整的错误代码和消息:
sql以NSString *的形式出现,不要将其转换为cstring。
int rc;
sqlite3_stmt *sel;
if ((rc = sqlite3_prepare_v2(db_handle, [sql UTF8String], -1, &sel, NULL)) != SQLITE_OK) {
NSLog(@"cannot prepare '%@': %d (%s)", sql, rc, sqlite3_errmsg(db_handle));
return;
}
if (sqlite3_step(sel) != SQLITE_DONE) {
NSLog(@"error insert/update: '%s'", sqlite3_errmsg(db_handle));
...