2011-04-15 155 views
0

我正在開發一個基於sqlite的應用程序, 當我插入數據到數據庫時發生以下錯誤。sqlite約束失敗

表結構:

CREATE TABLE 「產品」( 「ProductBarcode」 VARCHAR PRIMARY KEY UNIQUE NOT NULL, 「產品名稱」 VARCHAR NOT NULL, 「ProductImage」 VARCHAR NOT NULL, 「ProductIngredients」 VARCHAR NOT NULL,「 ProductStatus 「VARCHAR NOT NULL)

2011-04-15 10:09:48.408 halalgauge[4517:207] Not Matched 
2011-04-15 10:09:48.410 halalgauge[4517:207] *** Assertion failure in -[sqlClass addRecord:], /Users/admin/Desktop/Halal/Classes/sqlClass.m:149 
2011-04-15 10:09:48.410 halalgauge[4517:207] Exception occured at add statement, the error is Error while inserting data. 'constraint failed' 

的代碼是:

#import "sqlClass.h" 

sqlite3 *database = nil; 
sqlite3_stmt *deleteStmt = nil; 
sqlite3_stmt *addStmt = nil; 
sqlite3_stmt *detailStmt = nil; 
sqlite3_stmt *updateStmt = nil; 


@implementation sqlClass 
@synthesize membersInfoArray,membersInfoDict,rowID; 






- (void) copyDatabaseIfNeeded 
{ 
    membersInfoArray = [[NSMutableArray alloc]init]; 
    membersInfoDict = [[NSMutableDictionary alloc]init]; 

    //Using NSFileManager we can perform many file system operations. 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSString *dbPath = [self getDBPath]; 
    BOOL success = [fileManager fileExistsAtPath:dbPath]; 

    if(!success) { 

     NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"HalalGauge.sqlite"]; 
     success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error]; 

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

- (NSString *) getDBPath { 


@try { 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    return [documentsDir stringByAppendingPathComponent:@"HalalGauge.sqlite"]; 


} 
@catch (NSException * e) { 
    NSLog(@"Exception"); 
} 
@finally { 
    //[sqlClass finalizeStatements]; 
    NSLog(@"At Finally block"); 
} 

} 



+ (void) finalizeStatements { 

    if (addStmt) sqlite3_finalize(addStmt); 
    if (database) sqlite3_close(database); 
    if (deleteStmt) sqlite3_finalize(deleteStmt); 
    if (detailStmt) sqlite3_finalize(detailStmt); 
    if (updateStmt) sqlite3_finalize(updateStmt); 
} 

- (void) gettingData:(NSString *)dbPath { 
    NSLog(@"Data base path is %@",dbPath); 

    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) 
    { 
     const char *sql = "select * from Products"; 
     sqlite3_stmt *selectstmt; 
     if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) 
     { 
      while(sqlite3_step(selectstmt) == SQLITE_ROW) 
      { 

       [membersInfoDict setValue:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)] forKey:@"ProductBarcode"]; 
       [membersInfoDict setValue:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)] forKey:@"ProductName"]; 
       [membersInfoDict setValue:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)] forKey:@"ProductImage"]; 
       [membersInfoDict setValue:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)] forKey:@"ProductIngredients"]; 
       [membersInfoDict setValue:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 4)] forKey:@"ProductStatus"]; 

       if(membersInfoDict) 
       { 
        [membersInfoArray addObject:membersInfoDict]; 
        membersInfoDict = nil; 
       // NSLog(@"Entered and return"); 
       // return; 
       } 
      } 
     } 

    } 

    else 
     sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory. 
} 


- (void) addRecord:(NSMutableDictionary *)recordDict 
{ 
    @try { 

     if(addStmt == nil) { 
      const char *sql = "insert into Products (ProductBarcode,ProductName,ProductImage,ProductIngredients,ProductStatus) Values(?,?,?,?,?)"; 
      if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK) 
       NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database)); 
     } 

     sqlite3_bind_text(addStmt, 1, [[recordDict objectForKey:@"ProductBarcode"] UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStmt, 2, [[recordDict objectForKey:@"ProductName"] UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStmt, 3, [[recordDict objectForKey:@"ProductImage"] UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStmt, 4, [[recordDict objectForKey:@"ProductIngredients"] UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStmt, 5, [[recordDict objectForKey:@"ProductStatus"] UTF8String], -1, SQLITE_TRANSIENT); 

     //NSLog(@"the values are %@",addStmt); 

     if(SQLITE_DONE != sqlite3_step(addStmt)) 
      NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 
     else 
      rowID = sqlite3_last_insert_rowid(database); 
     NSLog(@"last inserted rowId = %d",rowID); 

     sqlite3_close(database); 



    } 
    @catch (NSException * e) { 
     NSLog(@"Exception occured at add statement, the error is %@ ",e); 
    } 
    @finally { 
     [sqlClass finalizeStatements]; 
    } 
     } 





@end 
+0

你確信與你結合的值不爲空? – Ravin 2011-04-15 05:13:29

+0

是的,沒有空值。 – Anand 2011-04-15 05:24:16

+0

在將它發送到sqlite3_step之前查看最終的addStmt。如果你手動運行sqlite下的sql語句,看看你是否得到相同的錯誤信息。這應該指向正確的方向。 – vpit3833 2011-04-15 07:19:47

回答

0

我解決我的問題與下面的代碼:

- (void) addRecord:(NSMutableDictionary *)recordDict 
{ 
    @try { 

     [self checkAndCreateDatabase]; 
     if (sqlite3_open([databasePath UTF8String], &database)== SQLITE_OK) { 

      NSString *statement; 
      sqlite3_stmt *compiledstatement; 
      NSString *ProductName,*ProductBarcode,*ProductImage,*ProductIngredients,*ProductStatus; 
      ProductName = [recordDict objectForKey:@"ProductName"]; 
      ProductBarcode = [recordDict objectForKey:@"ProductBarcode"]; 
      ProductImage = [recordDict objectForKey:@"ProductImage"]; 
      ProductIngredients = [recordDict objectForKey:@"ProductIngredients"]; 
      ProductStatus = [recordDict objectForKey:@"ProductStatus"]; 



      statement = [[NSString alloc]initWithFormat:@"insert into Products values('%@','%@','%@','%@','%@')",ProductBarcode,ProductName,ProductImage,ProductIngredients,ProductStatus]; 
      const char *sqlstatement = [statement UTF8String]; 
      if (sqlite3_prepare_v2(database, sqlstatement, -1, &compiledstatement, NULL)== SQLITE_OK) { 
       if (SQLITE_DONE!=sqlite3_step(compiledstatement)) { 
        NSAssert1(0,@"Error when inserting %s",sqlite3_errmsg(database)); 

       } 
       else { 
        NSLog(@"Data inserted Successfully"); 
       } 

      sqlite3_finalize(compiledstatement); 

      } 
      sqlite3_close(database); 
     } 

    } 
    @catch (NSException * e) { 
     NSLog(@"The Record already inserted "); 
    } 
} 
0

可能是它不是一個」 不t null「約束但」ProductBarcode「PRIMARY KEY UNIQUE

您是否檢查過產品條碼的唯一性?