2012-03-28 6 views
-3

У меня есть данные Json, но я получил это утверждение об ошибке при попытке вставить эти записи в базу данных sqlite. Я вижу данные с NSLog, но я не могу вставить базу данных. Что не так? Как я могу решить? Спасибо за ответ. Мой код ниже:Ошибка сбоя утверждения в объекте c

-(void)processDoneWithRequestName:(NSString*)tagName{ 

sqlite3_stmt *stmt=nil; 


//NSArray *pathsArray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); 
NSString *[email protected]"/Users/ds/Desktop/SqliteTest/SqliteTest"; 
NSString *cruddatabase=[doumentDirectoryPath stringByAppendingPathComponent:@"SqliteTestDb.sqlite"]; 

if ([tagName isEqualToString:Logins]) { 

    int keys = [[response.item objectForKey:@"Lipton"] count]; 
    NSLog(@"count %i",keys); 
    for (int i=0; i<keys; i++) 
    { 

     NSString *str1 =[[[response.item objectForKey:@"Lipton"] objectAtIndex:i]objectForKey:@"IsSuccess"]; 
     NSString *str2 =[[[response.item objectForKey:@"Lipton"] objectAtIndex:i]objectForKey:@"ProducerId"]; 
     NSString *str3 =[[[response.item objectForKey:@"Lipton"] objectAtIndex:i]objectForKey:@"Latitude"]; 
     NSString *str4 =[[[response.item objectForKey:@"Lipton"] objectAtIndex:i]objectForKey:@"Longitude"]; 
     NSString *str5 =[[[response.item objectForKey:@"Lipton"] objectAtIndex:i]objectForKey:@"Altitude"]; 
     NSString *str6 =[[[response.item objectForKey:@"Lipton"] objectAtIndex:i]objectForKey:@"Slope"]; 
     NSString *str7 =[[[response.item objectForKey:@"Lipton"] objectAtIndex:i]objectForKey:@"SampleDate"]; 
     NSString *str8 =[[[response.item objectForKey:@"Lipton"] objectAtIndex:i]objectForKey:@"PackageNo"]; 
     NSString *str9 =[[[response.item objectForKey:@"Lipton"] objectAtIndex:i]objectForKey:@"Status"]; 
     NSString *str10 =[[[response.item objectForKey:@"Lipton"] objectAtIndex:i]objectForKey:@"Description"]; 


     if (sqlite3_open([cruddatabase UTF8String], &cruddb)==SQLITE_OK) { 


      const char *sql = "INSERT INTO LabUpdate (IsSuccess, ProducerId, Latitude, Longitude, Altitude, Slope, SampleDate, PackageNo, Status, Description) VALUES (?,?,?,?,?,?,?,?,?,?)";    

      NSInteger result = sqlite3_prepare_v2(cruddb,sql, -1, &stmt, NULL); 
      if(sqlite3_step(stmt) == SQLITE_ROW || result == SQLITE_ROW) 
      { 
       sqlite3_prepare_v2(cruddb, sql, 1, &stmt, NULL); 
       sqlite3_bind_int(stmt, 1, [str1 integerValue]); 
       sqlite3_bind_int(stmt, 2, [str2 integerValue]); 
       sqlite3_bind_double(stmt, 3, [str3 floatValue]); 
       sqlite3_bind_double(stmt, 4, [str4 floatValue]); 
       sqlite3_bind_double(stmt, 5, [str5 floatValue]); 
       sqlite3_bind_double(stmt, 6, [str6 floatValue]); 
       sqlite3_bind_text(stmt, 7, [str7 UTF8String], -1, SQLITE_TRANSIENT); 
       sqlite3_bind_int(stmt, 8, [str8 integerValue]); 
       sqlite3_bind_int(stmt, 9, [str9 integerValue]); 
       sqlite3_bind_text(stmt, 10, [str10 UTF8String], -1, SQLITE_TRANSIENT); 
      } 

      else 
      { 
       NSAssert1(0, @"Error . '%s'", sqlite3_errmsg(cruddb));       
      } 
      sqlite3_reset(stmt); 
      sqlite3_finalize(stmt); 
     } 
    }      
    sqlite3_close(cruddb); 
} 
} 
+1

SQLite производит отличные, информативные сообщения об ошибках. Было бы очень полезно/вежливо, если бы вы указали, что такое сообщение об ошибке, а не оставлять нас гадать. –

+0

см. Мой ответ здесь http://stackoverflow.com/questions/9940217/i-can-not-insert-data-to-sqlite-database-in-objective-c/9941515#9941515 это могут быть работы – Hiren

ответ

0

Я не думаю, что ваш путь правильный, он не должен быть жестко закодирован и должен начинаться с файла: //.

Используйте это вместо того, чтобы получить каталог документа и сохранить там

NSArray *dirPaths; 
NSString *docsDir; 

dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
    NSUserDomainMask, YES); 

docsDir = [dirPaths objectAtIndex:0]; 
+0

Я использую это но я тоже не работаю. –

+0

Независимо от этого, вам необходимо подтвердить, что база данных существует на пути и что путь действителен. Какую ошибку вы получаете? – borrrden

+0

Он остановился на этой строке: NSString * str1 = [[[response.item objectForKey: @ "Lipton"] objectAtIndex: i] objectForKey: @ "IsSuccess"]; ошибка: *** Ошибка утверждения в - [ViewController processDoneWithRequestName:], /Users/ds/Desktop/SqliteTest/SqliteTest/ViewController.m:186 –

0

Отъезд код ниже

if (sqlite3_open([cruddatabase UTF8String], &cruddb)==SQLITE_OK) { 

sqlite3_prepare_v2(cruddatabase, "BEGIN TRANSACTION", -1, &compiledStmt, NULL); 
sqlite3_step(compiledStmt); 
sqlite3_finalize(compiledStmt); 

const char *sql = "INSERT INTO LabUpdate (IsSuccess, ProducerId, Latitude, Longitude, Altitude, Slope, SampleDate, PackageNo, Status, Description) VALUES (?,?,?,?,?,?,?,?,?,?)"; 
if(sqlite3_prepare_v2(cruddatabase, sql, -1, &stmt, NULL) == SQLITE_OK){ 

    sqlite3_prepare_v2(cruddb, sql, 1, &stmt, NULL); 
      sqlite3_bind_int(stmt, 1, [str1 integerValue]); 
      sqlite3_bind_int(stmt, 2, [str2 integerValue]); 
      sqlite3_bind_double(stmt, 3, [str3 floatValue]); 
      sqlite3_bind_double(stmt, 4, [str4 floatValue]); 
      sqlite3_bind_double(stmt, 5, [str5 floatValue]); 
      sqlite3_bind_double(stmt, 6, [str6 floatValue]); 
      sqlite3_bind_text(stmt, 7, [str7 UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_int(stmt, 8, [str8 integerValue]); 
      sqlite3_bind_int(stmt, 9, [str9 integerValue]); 
      sqlite3_bind_text(stmt, 10, [str10 UTF8String], -1, SQLITE_TRANSIENT); 

     NSUInteger err = sqlite3_step(compiledStmt); 
     if (err != SQLITE_DONE){ 
      NSLog(@"error while binding %d %s",err, sqlite3_errmsg(database)); 
     } 
     sqlite3_reset(compiledStmt); 
    sqlite3_finalize(compiledStmt);  
} else { 
    NSLog(@"Invalid Query"); 
} 

sqlite3_prepare_v2(cruddatabase, "END TRANSACTION", -1, &compiledStmt, NULL); 
sqlite3_step(compiledStmt); 
sqlite3_finalize(compiledStmt); 
sqlite3_close(cruddatabase); 
Смежные вопросы