MainViewController中的断言失败

时间:2015-07-08 12:56:18

标签: ios cocoa-touch sqlite insert assertions

我正在尝试使用以下代码将记录插入sqlite3中的表中。该代码在iOS 8中正常工作,但在iOS 7.1.2中给出了断言错误。

表格创建:

 NSLog(@"database path %@",self.databasePath);

    if ([manager copyItemAtPath:sourcePath toPath:self.databasePath error:&error] == NO)
    {
        NSLog(@"Error : %@", [error localizedDescription]);

    }
    // createStmt = nil;
    if (sqlite3_open([self.databasePath UTF8String], &database) == SQLITE_OK)
    {
        const char *sql_stmt = "CREATE TABLE IF NOT EXISTS CategoryTable (mainimg BLOB,addimg BLOB,cat_nm TEXT,image_nm TEXT,lastmodified TEXT,cat_desc TEXT,prod_id TEXT,prod_nm TEXT,prod_desc TEXT,sku TEXT,supplier_id TEXT,supplier_phone TEXT,product_dosage TEXT,unit_size TEXT,unit_price TEXT)";

        //NSString *query=[NSString stringWithFormat:@"create table %@(rollNo integer, name text)",tableName];

        if (sqlite3_prepare_v2(database, sql_stmt, -1, &statement, NULL) != SQLITE_OK) {
        }
        sqlite3_exec(database,sql_stmt, NULL, NULL, NULL);

        const char *sql_stmt_promo = "CREATE TABLE IF NOT EXISTS  PromotionalData (ImageData BLOB,ThumbData BLOB)";
        if (sqlite3_prepare_v2(database, sql_stmt_promo, -1, &statement, NULL) != SQLITE_OK) {
        }
        sqlite3_exec(database,sql_stmt_promo, NULL, NULL, NULL);
    }
    sqlite3_close(database);

记录插入:

   sqlite3 *database;
if (sqlite3_open([appdelegate.databasePath UTF8String], &database) == SQLITE_OK)
{
    sqlite3_stmt *statement;

    const char* sqliteQuery = "INSERT INTO CategoryTable (mainimg,addimg,cat_nm,image_nm,lastmodified,cat_desc,prod_id,prod_nm,prod_desc,sku,supplier_id,supplier_phone,product_dosage,unit_size,unit_price) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

    if (sqlite3_prepare_v2(database, sqliteQuery, -1, &statement, NULL) == SQLITE_OK)
    {
        sqlite3_bind_blob(statement, 1, [mainimg bytes], [mainimg length], SQLITE_STATIC);
        sqlite3_bind_text(statement, 2, [addimg UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 3, [cat_nm UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 4, [image_nm UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 5, [lastmodified UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 6, [cat_desc UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 7, [prod_id UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 8, [prod_nm UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 9, [prod_desc UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 10, [sku UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 11, [supplier_id UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 12, [supplier_phone UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 13, [product_dosage UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 14, [unit_size UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 15, [unit_price UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_step(statement);
        sqlite3_finalize(statement);
        NSLog(@"inserted ");
    }
    else
    {
        NSAssert1(0, @"error:'%s'", sqlite3_errmsg(database));
        // NSLog(@"not inserted ");
    }
    sqlite3_close(database);
}

错误消息:

  

2015-07-08 08:54:17.819 SwaroopAgro [365:60b]断言失败 - [MainViewController Savemainimg:withaddimg:withcat_nm:withimage_nm:withlastmodified:withcat_desc:withprod_id:withprod_nm:withprod_desc:withsku:withsupplier_id:withsupplier_phone:withproduct_dosage :withunit_size:withunit_price:],/ Users / dhananjaypatil / Desktop / swaroop / SW copy 8.1 / swaroopAgro_iPhone 2 / SwaroopAgro / MainViewController.m:700       2015-07-08 08:54:22.616 SwaroopAgro [365:60b] 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'错误:'表CategoryTable没有名为mainimg的列''       ***第一次抛出调用堆栈:       (0x30ba0f83 0x3b351ccf 0x30ba0e5d 0x3154ed5b 0xeae13 0xea563 0xe993f 0xedd7d 0x314e0fc3 0x314e0f07 0x314e0e21 0x308070e7 0x30805cf7 0x30ad48f1 0x3079d6bb 0x3079d579 0x3079d40d 0x30b6c20b 0x30b6b6db 0x30b69ecf 0x30ad4ebf 0x30ad4ca3 0x359da663 0x3342114d 0xc1ea5 0x3b85eab7)       libc ++ abi.dylib:以NSException类型的未捕获异常终止

1 个答案:

答案 0 :(得分:0)

错误消息告诉您Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'error:'table CategoryTable has no column named mainimg''。这是非常明显的:当您尝试插入值时,您的表CategoryTable没有列mainimg - 我假设它在插入期间发生

由于您的CREATE TABLE IF NOT EXISTS语句清楚地创建了该列,我唯一的猜测是您有时在过去更改了表的数据模式。在iOS8设备上,您之后安装了该应用程序。在iOS7上,您已经安装了应用程序。这导致iOS7上的表已经存在,具有错误的模式,但存在。因此,它不会被创建并保留其无效架构。

尝试从iOS7设备删除应用,然后重新运行应用。