2010-02-04 4 views
4

Je suis nouveau dans le développement iphone. Je veux insérer plusieurs valeurs dans ma base de données sqlite3 et afficher le contenu dans la tableview.I est capable d'insérer une seule ligne de données dans ma base de données et récupérer et afficher les données, mais je ne suis pas en mesure de le faire avec l'insertion de plusieurs rangée de data.Here est mon code ...Comment insérer plusieurs lignes de données dans la base de données sqlite par programmation 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); 


} 

est-il une autre façon d'insérer plusieurs lignes de données dans à ma table. S'il Vous Plaît m'aider. Merci.

+0

Ce n'est pas une question iPhone. Je pense que vous devez d'abord comprendre la partie SQLIte et ensuite revenir avec une version plus spécifique à l'iPhone. –

Répondre

1

Essayez avec sprintf statement ci-dessous,

utiliser cette instruction dans la boucle avec variable i.

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

Et le nom de mon fils est 'Robert '); UTILISER DROP TABLE; - – kennytm

+4

Ah petites tables de bobby nous l'appelons. – marcc

1

SQLite ne supporte pas l'insertion multi-lignes, voir Is it possible to insert multiple rows at a time in an SQLite database?.

Pour insérer plusieurs lignes à la fois, vous devez émettre plusieurs instructions INSERT.

(également, utiliser SQLite de formatted string functions et le spécificateur %q/%Q pour éviter l'injection SQL - même si c'est une base de données locale.)

(Et quelqu'un vous suggère d'utiliser les données de base.)

+3

vous devez utiliser des données de base – kubi

+0

Les données de base échouent si vous devez traiter des requêtes complexes avec des jointures. – DivineDesert

+0

Il est supporté maintenant. – mjb

24

Cette est la routine généralement utilisée pour insérer des données en masse.

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

J'ai utilisé ce code pour ajouter 600 lignes, et wow ... c'est là. Merci. –

+1

J'ai utilisé ce code pour 2000+ données :) – DivineDesert

+1

Je l'utilise pour 7000 lignes. Fonctionne comme un charme – drewi

0

Vous pouvez utiliser la requête suivante pour insérer des lignes en bloc dans une table.

insérer ou remplacer dans ([Colonne1], [Colonne2]) sélectionnez Col1Val1, union Col2Val1 sélectionner ColVal2, union Col2Val2 sélectionner Col1Val3, Col2Val3

Cela ajoutera trois enregistrement à la fois, vous pouvez prolonger ce jusqu'à n temps. Créez dynamiquement votre requête d'insertion comme ci-dessus et l'utilisation et le reste du code sont identiques à ceux que nous utilisons généralement pour insérer une ligne.