【问题标题】:Assertion failure in MainViewControllerMainViewController 中的断言失败
【发布时间】:2015-09-26 09:45:27
【问题描述】:

我正在尝试使用以下代码将记录插入到 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 复制 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 类型的未捕获异常终止

【问题讨论】:

    标签: ios cocoa-touch sqlite insert assertions


    【解决方案1】:

    错误消息告诉您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 设备中删除该应用,然后重新运行该应用。

    【讨论】:

    • @DhananjayPatil 你现在修好了吗?还是没有工作?
    猜你喜欢
    • 2011-05-27
    • 2017-08-07
    • 2012-08-01
    • 2015-09-01
    • 2012-09-26
    • 2011-09-08
    相关资源
    最近更新 更多