/ / Jak wstawić elementy NSMutableArray w Sqlite3 na iPhonie - iphone, objective-c, sqlite3, nsmutablearray

Jak wstawiać elementy NSMutableArray w Sqlite3 w telefonie iPhone - iphone, cel-c, sqlite3, nsmutablearray

Kiedy wstawiam elementy tablicy do sqlite, wstawia się prawidłowo. Zajmuje tylko pierwszy element tablicy, a pozostały pokazuje błąd podczas wstawiania. Mój kod to ...

NSString * path = [self getDBPath]; sqlite3_stmt * insert_statement = nil;

if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
for (int i = 0; i < [array count]; i++)
{
NSLog(@"Array Count is %d",[array count]);
NSString *name=[[array objectAtIndex:i]objectForKey:@"name"];
NSString *add=[[array objectAtIndex:i]objectForKey:@"address"];

if (insert_statement == nil) {
NSString *statement1 = [NSString stringWithFormat:@"insert into tableName (name,address) Values( ?,?)",name,add];
const char *insertSql = [statement1 UTF8String];
if(sqlite3_prepare_v2(database, insertSql, -1, &insert_statement, NULL) != SQLITE_OK){
NSLog(@"Error while creating insert statement.");
insert_statement = nil;
continue;
}

sqlite3_bind_text(insert_statement, 1, [name UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(insert_statement, 2, [add UTF8String], -1, SQLITE_TRANSIENT);


if(SQLITE_DONE != sqlite3_step(insert_statement)){
//NSAssert1(0, @"Error while inserting data. "%s"", sqlite3_errmsg(database));
NSLog(@"Error while inserting data.");
insert_statement = nil;
continue;
}
else{}

sqlite3_reset(insert_statement);
sqlite3_finalize(insert_statement);
insert_statement = nil;
}
}
sqlite3_close(database);
}

Proszę mi powiedzieć, dlaczego dopuszcza tylko jeden rekord.

Z góry dziękuję.

Odpowiedzi:

3 dla odpowiedzi № 1

Wystąpiło z powodu zakończenia instrukcji w pętli za każdym razem. Więc nie pozwoli wstawić innych obiektów po pierwszym obiekcie.

Po prostu usuń "sqlite3_finalize(insert_statement);" z pętli i zestaw nil do instrukcji wstawiania "insert_statement = nil;"

Po zakończeniu z pętlą. Upewnij się, że umieść plik "sqlite3_reset(insert_statement);" dla każdego obiektu w pętli. To resetuje instrukcję i nie ma potrzeby ustawiania nil do instrukcji w pętli.

Wypróbuj ten fragment kodu, który działa dla mnie:

if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {

for (int i = 0; i < [array count]; i++)
{
NSLog(@"Array Count is %d",[array count]);
NSString *name=[[array objectAtIndex:i]objectForKey:@"name"];
NSString *add=[[array objectAtIndex:i]objectForKey:@"address"];

if (insert_statement == nil) {
NSString *statement1 = [NSString stringWithFormat:@"insert into tableName (name,address) Values( ?,?)",name,add];
const char *insertSql = [statement1 UTF8String];
if(sqlite3_prepare_v2(database, insertSql, -1, &insert_statement, NULL) != SQLITE_OK){
NSLog(@"Error while creating insert statement.");
insert_statement = nil;
continue;
}

sqlite3_bind_text(insert_statement, 1, [name UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(insert_statement, 2, [add UTF8String], -1, SQLITE_TRANSIENT);


if(SQLITE_DONE != sqlite3_step(insert_statement)){
//NSAssert1(0, @"Error while inserting data. "%s"", sqlite3_errmsg(database));
NSLog(@"Error while inserting data.");
insert_statement = nil;
continue;
}
else{

sqlite3_reset(insert_statement);


}
}
}
insert_statement = nil;
sqlite3_finalize(insert_statement);
sqlite3_close(database);
}

2 dla odpowiedzi nr 2

wypróbuj ten kod, to działa dla mnie

      for(int i=0;i<[data count];i++)
{
NSMutableDictionary *myDict = [data objectAtIndex:i];

selectSql=[NSString stringWithFormat:@"INSERT INTO [commentTable] values("%@","%@")",[myDict valueForKey:@"usertype"],[myDict valueForKey:@"userid"]];

if (sqlite3_prepare_v2(database, [selectSql cStringUsingEncoding:NSUTF8StringEncoding], -1, &statement, NULL) == SQLITE_OK)
{
if (sqlite3_step(statement) == SQLITE_DONE)
{
ret = YES;
NSLog(@"DB SUPPORT - commentTable INSERTED");
}
else
{
NSLog(@"DB SUPPORT - ERROR commentTable INSERT");
}

}
else
{
NSLog(@"DB SUPPORT - Sql Preparing Error ( INSERT commentTable)");
}

sqlite3_finalize(statement);
}


sqlite3_close(database);

0 dla odpowiedzi № 3

Możesz użyć :

for (int i = 0; i < [mutArray count]; i++)
{
NSString *string = [mutArray objectAtIndex:i];
// insert query
insert into table_name ("string") values(column_name);
}

Ref: Jak dodać tablicę nsmutable do tabeli bazy danych sqlite