2010-02-04 4 views
4

Я новичок в разработке iphone. Я хочу вставить несколько значений в свою базу данных sqlite3 и отобразить содержимое в таблице. Я могу вставить одну строку данных в моей базе данных и извлекать ее и отображать данные, но я не в состоянии сделать с вставкой несколько строк из data.Here мой код ...Как вставить несколько строк данных в базу данных sqlite с помощью программирования iphone

-(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. –

ответ

1

Попробуйте с sprintf statement, приведенной ниже,

использовать это заявление внутри цикла с переменной я.

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

И имя моего сына - «Роберт»); Пользователи DROP TABLE; - ' – kennytm

+4

Ах, немного маленьких таблиц, которые мы называем. – marcc

1

SQLite не поддерживает вставку нескольких строк, см Is it possible to insert multiple rows at a time in an SQLite database?.

Чтобы вставить сразу несколько строк, вам необходимо выдать несколько инструкций INSERT.

(Кроме того, использование SQLite-х formatted string functions и в %q/%Q спецификатор, чтобы избежать инъекции SQL - даже если это локальная база данных.)

(А кто-то предложит вам использовать Core Data.)

+3

вы должны использовать Core Data – kubi

+0

Основные данные не удались, если вы имеете дело со сложными запросами с объединениями. – DivineDesert

+0

Это поддерживается сейчас. – mjb

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 строк и ничего себе ... его там. Благодарю. –

+1

Я использовал этот код для данных 2000+ :) – DivineDesert

+1

Я использую это для 7000 строк. Работает как шарм – drewi

0

Вы можете использовать следующий запрос для вставки массивных строк в таблицу.

вставки или замены в ([COLUMN1], [Столбец2]) выберите Col1Val1, Col2Val1 союз выберите ColVal2, Col2Val2 союз выберите Col1Val3, Col2Val3

Это добавит три записи в то время, вы можете расширить это Шифрование до N- время. Динамически создайте запрос на вставку, как указано выше, и используйте и остальной код, который мы обычно используем для вставки строки.

Смежные вопросы