sqlite中的数据插入问题

时间:2011-03-25 10:19:54

标签: iphone database xcode ipad sqlite

我的表定义是:CREATE TABLE“Product”(“ProID”INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,“BarCode”VARCHAR NOT NULL UNIQUE,“ProductName”VARCHAR NOT NULL);

当我插入数据时我有类似的问题: 2011-03-25 15:43:08.792 BarCode12 [6698:207] *断言失败 - [sqlClass addRecord:],/ Users / admin /Desktop / BarCode14copy / Class / sqlClass.m:121 2011-03-25 15:43:08.793 BarCode12 [6698:207] * 由于未捕获异常'NSInternalInconsistencyException'而终止应用程序,原因:'插入数据时出错。 '约束失败'' ...

编写的代码是: - (void)addRecord:(NSMutableDictionary *)recordDict {

if(addStmt == nil) {
    const char *sql = "insert into Product(ProID, BarCode , ProductName ) Values(?,?,?)";
    if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
        NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
}
NSInteger recordId =  [[recordDict objectForKey:@"ProID"] intValue];
NSLog(@"%d",recordId);
sqlite3_bind_int(addStmt, 1,recordId);
sqlite3_bind_text(addStmt, 2, [[recordDict objectForKey:@"BarCode"] UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStmt, 3, [[recordDict objectForKey:@"ProductName"] UTF8String], -1, SQLITE_TRANSIENT);


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

sqlite3_reset(addStmt);

}

我也在没有约束的情况下尝试,但同样的问题将继续..

如果删除了一致性,则显示“数据库已锁定”错误。 我们如何删除此错误以及如何将数据插入数据库?

1 个答案:

答案 0 :(得分:3)

关于“约束失败”的一点说你违反了约束。这意味着您的Product表具有PRIMARY KEY,UNIQUE或FOREIGN KEY约束,并且您正在插入违反这些约束的值。

  • 对于PRIMARY KEY和UNIQUE约束:您正在插入重复值。
  • 对于FOREIGN KEY约束:您在引用的表/字段中插入一个没有对应匹配的值。

更新:如果有INTEGER PRIMARY KEY AUTOINCREMENT,则不应在INSERT语句中指定ProdID; SQLite会自动生成它。所以将insert语句更改为

INSERT INTO Product (BarCode , ProductName) Values (?,?)

因为您已经使用

检索了它
rowID = sqlite3_last_insert_rowid(database);

也不要忘记删除绑定!