2010-02-04 86 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-時間。 動態創建像上面的插入查詢,並使用和其餘代碼是相同的,因爲我們通常用於插入一行。