2014-10-29 59 views
-1

我想在我的表中插入一些值,没有得到任何错误,但没有插入值。我将一些值定义为varchar(100),一些是整数。如果你通过代码,你会得到它。如果有任何步骤。另外在我的表中,一列是int主键。这里是代码。将值插入到sqlite表中iOS

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

sqlite3_stmt *statement; 
    NSString*[email protected]"0"; 
NSString*[email protected]"Now"; 
NSLog(@"db path%@",dbPath); 
if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) 
{ 
    NSString *insertSQL = @"INSERT INTO MyTable (Name,one,Two,Three,Four,Date) VALUES ('SatTest',5,7,6,'0','Now')"; 




    NSLog(@"Inser stmt %@",insertSQL); 
    const char *insert_stmt = [insertSQL UTF8String]; 

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

在我看来,你试图修改数据库的只读副本的包。 (关于如何在启动时初始化数据库,大约有100个示例,如果您搜索它们。) – 2014-10-29 12:21:48

+0

您*必须*检查'sqlite3_prepare_v2()'的返回值。 – 2014-10-29 13:15:54

回答

0
- (NSString *)ExecuteNonQuery:(NSString *)query { 
     @try { 
      query = [query stringByReplacingOccurrencesOfString:@"'" withString:@"\'"]; 
      sqlite3_prepare_v2(db, [query UTF8String], -1, &execStatement, NULL); 
      if (sqlite3_step(execStatement) == SQLITE_DONE) { 
       NSString *temp1 = [NSString stringWithFormat:@"%lld",sqlite3_last_insert_rowid(db)]; 
       return temp1; 
      } else { 
       return [NSString stringWithFormat:@"SQL Insert Error\nError Code: %d\n Error Message: %s", sqlite3_errcode(db), sqlite3_errmsg(db)]; 
      } 
      sqlite3_finalize(execStatement); 
     } 
     @catch (NSException *exception) { 
     @throw exception; 
     } 
     @finally { 
      sqlite3_close(db); 
     } 
    } 

    // Double check your query in sqlite manager and try with this code 
+0

不需要在SQLite语句中使用try/catch。 – 2014-10-29 12:20:16

+0

我上面提到的代码和Irshad给出了插入值但不保存它的代码,如果我立即检查数据,但是第二次执行数据不存在,我可以看到数据。 – Sat 2014-10-29 12:35:34

+1

@周六 - VcanShakeTheWorld--当您写入只读文件时,数据不会持续存在。 – 2014-10-29 18:55:20

0

我做了表中的一些简单的操作,可能是帮助你:

首先创建SQLDB对象,如:sqlite3 *dbObject;

创建DB

-(NSString *)filePath{ 

    NSString *documentsDir=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0]; 
    return [documentsDir stringByAppendingPathComponent:@"Company.db"]; 
    // NSLog(@"DB CREATED"); 
} 

创建表

-(void)createTable 
{ 

    if(sqlite3_open([[self filePath] UTF8String], &dbObject) == SQLITE_OK) { 
     char *err; 
     NSString *sqlString=[NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS Employee(emp_id INTEGER PRIMARY KEY,emp_name VARCHAR (20),emp_add text);"]; 

     if (sqlite3_exec(dbObject, [sqlString UTF8String], NULL,NULL,&err)!=SQLITE_OK){ 
      // created 
     } 
     else 
     { 

     } 
     sqlite3_close(dbObject); 
    } 
    else 
    { 
     NSLog(@"SaveBody: Failed from sqlite3_prepare_v2. Error is: %s ", sqlite3_errmsg(dbObject)); 
    } 


} 

插入数据

-(void)insertData:(NSMutableArray*) mutableArr 
{ 

    if(sqlite3_open([[self filePath] UTF8String], &dbObject) == SQLITE_OK) { 
     const char *sqlQuery="INSERT INTO Employee (emp_id,emp_name,emp_add) VALUES (?,?,?)"; 
     sqlite3_stmt* statement; 


     for (NSDictionary *empdict in mutableArr) 
     { 

      if(sqlite3_prepare_v2(dbObject, sqlQuery, -1, &statement, NULL) == SQLITE_OK) 
      { 


       int card_Id = [empdict valueForKey:@"card_Id"]; 
       NSString *name =[NSString stringWithFormat:@"%@", [empdict valueForKey:@"name"]]; 
       NSString *add = [NSString stringWithFormat:@"%@",[empdict valueForKey:@"address"]]; 

       sqlite3_bind_int(statement,1,card_Id); 
       sqlite3_bind_text(statement,2,[name UTF8String], -1, SQLITE_TRANSIENT); 
       sqlite3_bind_text(statement,3,[add UTF8String], -1, SQLITE_TRANSIENT); 


       sqlite3_step(statement); 

      } 
      else { 
       NSLog(@"SaveBody: Failed from sqlite3_prepare_v2. Error is: %s ", sqlite3_errmsg(dbObject)); 
      } 


      sqlite3_finalize(statement); 
     } 

     sqlite3_close(dbObject); 
    } 

} 

得到的所有数据

-(void)getData:(int)empId 
{ 
    if(sqlite3_open([[self filePath] UTF8String], &dbObject) == SQLITE_OK) { 

     NSString* sqliteQuery= [NSString stringWithFormat:@"SELECT emp_name FROM Employee Where emp_id=%i;",empId]; 


     sqlite3_stmt *compiledStatement; 

     if(sqlite3_prepare_v2(dbObject, [sqliteQuery UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK){ 



      while(sqlite3_step(compiledStatement) == SQLITE_ROW){ 

       NSString *name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)]; 

      } 
     } 

     else{ 
      NSLog(@"SaveBody: Failed from sqlite3_prepare_v2. Error is: %s ", sqlite3_errmsg(dbObject)); 
     } 
     sqlite3_finalize(compiledStatement); 

     sqlite3_close(dbObject); 
    } 
    else{ 
     NSLog(@"SaveBody: Failed from sqlite3_prepare_v2. Error is: %s ", sqlite3_errmsg(dbObject)); 
    } 


} 

更新

-(void)updateDetails:(NSArray*)arr 
{ 
    sqlite3_stmt *statment; 
    for (NSString *tagString in arr) { 


     NSString* query = [NSString stringWithFormat:@"UPDATE Employee SET emp_name='ABC'WHERE emp_id=1;"]; 

     if(sqlite3_prepare_v2(dbObject,[query UTF8String], -1, &statment, NULL)==SQLITE_OK) 
     { 
      while(sqlite3_step(statment) == SQLITE_DONE) 
      { 
       NSLog(@"updated "); 
      } 
     } 

    } 
    sqlite3_finalize(statment); 
} 

删除

- (void)deleteData{ 


    sqlite3_stmt* statement; 

    NSString *query = [NSString stringWithFormat:@"Delete from Employee Where emp_id=1;"]; 

    if(sqlite3_prepare_v2(dbObject,[query UTF8String], -1, &statement, NULL)==SQLITE_OK) 
    { 
     while(sqlite3_step(statement) == SQLITE_DONE) 
     { 
      // record has deleted 
     } 
     sqlite3_finalize(statement); 
    } 
}