2010-02-04 42 views
4

我是iphone开发新手。我想插入多个值到我的sqlite3数据库并在tableview中显示内容。我能够插入单行数据在我的数据库和检索和显示数据,但我不能与插入data.Here的多行做的是我的代码...如何通过iPhone编程向sqlite数据库插入多行数据

-(void)initializeTableData{ 
sqlite3 *db=[DatabaseTestAppDelegate getNewDBConnection]; 
sqlite3_stmt *statement=nil; 
sqlite3_stmt *statement1=nil; 

if (insert_MyObj_statement == nil) 
{ 
    const char *sql2="DELETE FROM user"; 
    sqlite3_prepare_v2(db, sql2, -1, &statement1, NULL); 
    sqlite3_step(statement1); 
    //const char *sql1 = "INSERT INTO user (id,name) VALUES ('0','ash'),('3','karna'),('2','kumar'),('5','siva')"; 
const char *sql1 = "INSERT INTO user (id,name) VALUES ('0','xxx')"; 
int result=sqlite3_prepare_v2(db, sql1, -1, &insert_MyObj_statement, NULL); 
    NSAssert1(result == SQLITE_OK, @"addMyObjectIntoDatabase: failed to prepare statement with err '%s'", sqlite3_errmsg(db)); 
} 
sqlite3_step(insert_MyObj_statement); 

const char *sql="select * from user"; 
if(sqlite3_prepare_v2(db, sql, -1, &statement, NULL)!=SQLITE_OK) 
    NSAssert1(0,@"error in preparing staement",sqlite3_errmsg(db)); 
else{ 
    while(sqlite3_step(statement)==SQLITE_ROW) 
     [tableData addObject:[NSString stringWithFormat:@"%s",(char*)sqlite3_column_text(statement,1)]]; 
} 
    sqlite3_finalize(statement); 


} 

是否有任何其他方式接入数据的多个列在我的桌子上,请帮助我。谢谢。

+0

这不是iPhone的问题。我想你首先需要弄清楚SQLIte部分,然后回来一个更具体的iPhone版本。 – 2010-02-04 18:16:20

回答

1

下面给出sprintf statement尝试,

使用与变量i循环内这一说法。

sprintf(buffer,"INSERT INTO user (name) VALUES ('%s');",[[names objectAtIndex:i] UTF8String]); 
+9

而我儿子的名字是'罗伯特'); DROP TABLE用户; - ' – kennytm 2010-02-10 18:30:52

+4

啊,我们叫他小鲍比的桌子。 – marcc 2010-02-10 18:34:45

1

SQLite不支持多行插入,看到Is it possible to insert multiple rows at a time in an SQLite database?

要一次插入多行,您需要发出多个INSERT语句。

(另外,使用SQLite的formatted string functions%q/%Q符,以避免SQL注入 - 即使这是一个本地数据库。)

(而且有人会建议你使用核心数据。)

+3

您应该使用核心数据 – kubi 2010-02-10 18:38:29

+0

如果要处理带连接的复杂查询,则核心数据将失败。 – DivineDesert 2012-06-29 04:20:18

+0

现在支持。 – mjb 2013-05-16 16:22:03

24

这是我通常用来批量插入数据的例程。

static sqlite3 *masterDB; 
static sqlite3_stmt *init_statement = nil; 

{ 
NSString* statement; 

statement = @"BEGIN EXCLUSIVE TRANSACTION"; 

if (sqlite3_prepare_v2(masterDB, [statement UTF8String], -1, &init_statement, NULL) != SQLITE_OK) { 
    printf("db error: %s\n", sqlite3_errmsg(masterDB)); 
    return NO; 
} 
if (sqlite3_step(init_statement) != SQLITE_DONE) { 
    sqlite3_finalize(init_statement); 
    printf("db error: %s\n", sqlite3_errmsg(masterDB)); 
    return NO; 
} 

NSTimeInterval timestampB = [[NSDate date] timeIntervalSince1970]; 
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"MMM dd, yyyy"]; 
NSDate *now = [NSDate date]; 
NSString *dateTime = [dateFormat stringFromDate:now]; 
[dateFormat release]; 
statement = @"insert into table(id, name) values(?,?)"; 
sqlite3_stmt *compiledStatement; 

if(sqlite3_prepare_v2(masterDB, [statement UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK) 
{ 
    for(int i = 0; i < [aryList count]; i++){ 
     NSString *objName = [aryList objectAtIndex:i]; 
     sqlite3_bind_int(compiledStatement, 1, i); 
        sqlite3_bind_text(compiledStatement, 2, [objName UTF8String], -1, SQLITE_TRANSIENT);    
     while(YES){ 
      NSInteger result = sqlite3_step(compiledStatement); 
      if(result == SQLITE_DONE){ 
       break; 
      } 
      else if(result != SQLITE_BUSY){ 
       printf("db error: %s\n", sqlite3_errmsg(masterDB)); 
       break; 
      } 
     } 
     sqlite3_reset(compiledStatement); 

    } 
    timestampB = [[NSDate date] timeIntervalSince1970] - timestampB; 
    NSLog(@"Insert Time Taken: %f",timestampB); 

    // COMMIT 
    statement = @"COMMIT TRANSACTION"; 
    sqlite3_stmt *commitStatement; 
    if (sqlite3_prepare_v2(masterDB, [statement UTF8String], -1, &commitStatement, NULL) != SQLITE_OK) { 
     printf("db error: %s\n", sqlite3_errmsg(masterDB)); 
     return NO; 
    } 
    if (sqlite3_step(commitStatement) != SQLITE_DONE) { 
     printf("db error: %s\n", sqlite3_errmsg(masterDB)); 
     return NO; 
    } 

    //  sqlite3_finalize(beginStatement); 
    sqlite3_finalize(compiledStatement); 
    sqlite3_finalize(commitStatement); 
    return YES; 
} 

return YES; 
} 
+2

我已经使用这段代码添加了600行,哇!它在那里。谢谢。 – 2012-06-28 13:40:12

+1

我已经使用这个代码2000+以上的数据:) – DivineDesert 2012-06-29 04:20:49

+1

我使用这个7000行。像魅力一样工作 – drewi 2012-07-02 07:47:02

0

您可以使用以下查询将批量行插入到表中。

插入或更换成([列1],[列2])选择Col1Val1,Col2Val1工会选择ColVal2,Col2Val2工会选择Col1Val3,Col2Val3

这一次会增加三个记录,您可以扩展高达N-时间。 动态创建像上面的插入查询,并使用和其余代码是相同的,因为我们通常用于插入一行。

相关问题