2012-10-25 80 views
1

我试图插入一个名字到我的sqlite文件。即时通讯使用此代码,但它不工作:/SQLite iOS插入数据

-(void)InsertRecords:(NSMutableString *) txt{ 
    if(addStmt == nil) { 
     const char *sql = "INSERT INTO myMovies (movieName) VALUES(?) "; 
     if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK) 
      NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database)); 
     else 
      sqlite3_bind_text(addStmt, 1, [txt UTF8String], -1, SQLITE_TRANSIENT); 
    } 
    if(SQLITE_DONE != sqlite3_step(addStmt)) 

     NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 
    else 
     sqlite3_reset(addStmt); 
} 
+0

有什么错误信息? – adum

+0

@adum错误是:断言失败 - [MyDvDsList InsertRecords:],/Users/.../MyDvDsList.m:2012-10-25 02:00:54.916 MyDvDs [28287:14003] ***终止应用程序由于未捕获异常'NSInternalInconsistencyException',原因:'创建添加语句时出错。 '内存不足'' – Rudi

+0

当你得到“内存不足”的错误时,这实际上意味着数据库的'sqlite3'指针是'NULL'(通常无法正确打开数据库的症状)。 – Rob

回答

1

确定最终我成功了!这是我用大家谁需要它的代码:

-(void)InsertRecords:(NSMutableString *)txt{ 

    NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"movieData.sqlite"]; 
    const char *dbpath = [dbPath UTF8String]; 
    sqlite3 *contactDB; 

    sqlite3_stmt *statement; 

    NSLog(@"%@",dbPath); 
    if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) 
    { 
     NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO myMovies (movieName) VALUES (\"%@\")", txt]; 

     const char *insert_stmt = [insertSQL UTF8String]; 

     sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL); 
     if (sqlite3_step(statement) == SQLITE_DONE) 
     { 
      sqlite3_bind_text(statement, 1, [txt UTF8String], -1, SQLITE_TRANSIENT); 
     } else { 
      NSLog(@"error"); 
     } 
     sqlite3_finalize(statement); 
     sqlite3_close(contactDB); 
    } 
} 
+0

这是不正确的。首先,您将数据插入到只读数据包中的数据库中。改用Documents文件夹。其次,您使用'stringWithFormat'构建SQL,但如果该值包含引号,则SQL将失败。在SQL语句中始终使用'?'占位符和'sqlite3_bind_XXX'字符串值。第三,我通常会建议在'else'子句中记录'sqlite3_errmsg',这样如果失败了,你就会知道为什么。第四,我建议不要每次打开和关闭数据库。应用程序启动时打开数据库,并在终止时关闭它。 – Rob

+0

这是开放的SQL注入攻击 –

1

的“内存不足”的SQLite从错误通常意味着你正在使用的数据库手柄尚未打开。请确保您使用您发布的代码中显示的database变量呼叫sqlite3_open_v2

2

通过查询这个方法试试,

-(void)Insertdata:(NSString*)query{ 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:@"YourDBName.sql"]; 

    if(sqlite3_open([databasePath UTF8String],&db) == SQLITE_OK) 
    { 
     NSString *querySQL = [NSString stringWithFormat: @"%@",query]; 

     char *errmsg=nil; 

     if(sqlite3_exec(db, [querySQL UTF8String], NULL, NULL, &errmsg)==SQLITE_OK) 
     { 
      NSLog(@".. Row Added .."); 
     } 
    } 
    sqlite3_close(db); 
} 
1

试试这个:

//save our data 
- (BOOL) saveEmployee:(Employee *)employee 
{ 
    BOOL success = false; 
    sqlite3_stmt *statement = NULL; 
    const char *dbpath = [databasePath UTF8String]; 

    if (sqlite3_open(dbpath, &mySqliteDB) == SQLITE_OK) 
    { 
     if (employee.employeeID > 0) { 
      NSLog(@"Exitsing data, Update Please"); 
      NSString *updateSQL = [NSString stringWithFormat:@"UPDATE EMPLOYEES set name = '%@', department = '%@', age = '%@' WHERE id = ?", 
            employee.name, 
            employee.department, 
            [NSString stringWithFormat:@"%d", employee.age]]; 

      const char *update_stmt = [updateSQL UTF8String]; 
      sqlite3_prepare_v2(mySqliteDB, update_stmt, -1, &statement, NULL); 
      sqlite3_bind_int(statement, 1, employee.employeeID); 
      if (sqlite3_step(statement) == SQLITE_DONE) 
      { 
       success = true; 
      } 

     } 
     else{ 
      NSLog(@"New data, Insert Please"); 
      NSString *insertSQL = [NSString stringWithFormat: 
            @"INSERT INTO EMPLOYEES (name, department, age) VALUES (\"%@\", \"%@\", \"%@\")", 
            employee.name, 
            employee.department, 
            [NSString stringWithFormat:@"%d", employee.age]]; 

      const char *insert_stmt = [insertSQL UTF8String]; 
      sqlite3_prepare_v2(mySqliteDB, insert_stmt, -1, &statement, NULL); 
      if (sqlite3_step(statement) == SQLITE_DONE) 
      { 
       success = true; 
      } 
     } 

     sqlite3_finalize(statement); 
     sqlite3_close(mySqliteDB); 

    } 

    return success; 
}