2013-08-20 2 views
0

Я хранил изображения в URL-адресах сервера и получал изображения из JSON, а затем записывал их в локальную базу данных. Но NSLog отображает categories insert is insert into categories (id,cat_name,order_by) values('3','test','3'). Но значения не отображаются в файле db1.sqlite.Данные не вставляются в таблицу базы данных

код:

Файловый менеджер:

- (void)viewDidLoad 
{ 
NSFileManager *fileMgr = [NSFileManager defaultManager]; 
    NSError *err; 

    NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"db4" ofType:@"sqlite"]; 
    //NSLog(@"bundlePath %@", bundlePath); 


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    //NSLog(@"docs dir is %@", documentsDirectory); 

    NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"db1.sqlite"]; 

    BOOL success = [fileMgr copyItemAtPath:bundlePath toPath:appFile error:&err]; 


    if (!success) { 
     NSLog(@"Failed to create writable database file with message '%@'.", [err localizedDescription]); 
    } 

Извлечение данных из сервера URL добавить в файл базы данных:

NSURL *URL = [NSURL URLWithString:@"http://serverurl.net/projects/mobile/jsonstring.php"]; 

    NSError *error; 
    NSString *stringFromFileAtURL = [[NSString alloc] 
            initWithContentsOfURL:URL 
            encoding:NSUTF8StringEncoding 
            error:&error]; 



    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"db1.sqlite"]; 
    //NSLog(@"filepath %@",path); 



    NSArray *userData = [stringFromFileAtURL JSONValue]; 
    [stringFromFileAtURL release]; 


    NSLog(@"userdata is %@", userData); 

    int i = 0; 
    BOOL notExist = TRUE; 
    sqlite3_stmt *statement, *addStmt; 


    for (NSArray *skarray in userData) { 
     //NSLog(@"test"); 


     if(i == 0){ 
      //insert all main category 
      for (NSDictionary *tuser in skarray) { 

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

        const char *sql = [[NSString stringWithFormat:@"SELECT id FROM categories where id = '%@'",[tuser objectForKey:@"id"]] cStringUsingEncoding:NSUTF8StringEncoding]; 


        NSLog(@"categories select is %s", sql); 

        if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) { 

         notExist = TRUE; 

         while (sqlite3_step(statement) == SQLITE_ROW) { 

          notExist = FALSE; 

         } 

        } 



        if(notExist){ 


         NSLog(@"categories does not exist"); 


        // const char *sqlInsert = "insert into categories (id,cat_name,order_by) Values(?, ?, ?)"; 

         const char *sqlInsert = [[NSString stringWithFormat:@"insert into categories (id,cat_name,order_by) values('%@','%@','%@')", [tuser objectForKey:@"id"], [tuser objectForKey:@"cat_name"],[tuser objectForKey:@"order_by"]] cStringUsingEncoding:NSUTF8StringEncoding]; 


         NSLog(@"categories insert is %s", sqlInsert); 

         if(sqlite3_prepare_v2(database, sqlInsert, -1, &addStmt, NULL) != SQLITE_OK) 
          NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database)); 



         sqlite3_bind_text(addStmt, 0, [[tuser objectForKey:@"id"] UTF8String], -1, SQLITE_TRANSIENT); 

         sqlite3_bind_text(addStmt, 1, [[tuser objectForKey:@"cat_name"] UTF8String], -1, SQLITE_TRANSIENT); 
         sqlite3_bind_text(addStmt, 2, [[tuser objectForKey:@"order_by"] UTF8String], -1, SQLITE_TRANSIENT); 


     if(SQLITE_DONE != sqlite3_step(addStmt)) 

    NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 

         else 
          sqlite3_reset(addStmt); 

     } 

        sqlite3_close(database); 


       } 



      } 
     } 

Я спросил так много вопросов. Но не получил решения.

+0

Возможный дубликат [Ошибка вставки базы данных] (http://stackoverflow.com/questions/18348931/database-insert-failed) –

ответ

0

Параметры параметров неверны; они должны начинаться с 1, и ваше утверждение не имеет параметров.

Не требуется sqlite3_reset.

Вы всегда должны позвонить по номеру sqlite3_finalize.

+0

После удаления else sqlite3_reset (addStmt); эта строка, не работает – user2674668

+0

У моего ответа также есть второе предложение. –

+0

Я вставил sqlite3_finalize. Но все же это не работает. Я не знаю, где ошибка? Вы можете проверить? Я застрял с последними 4 днями – user2674668

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