SQLite错误:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)-iOS [英] SQLite Error : EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) -iOS

查看:204
本文介绍了SQLite错误:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)-iOS的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试向表中插入数据时,有时会出现此错误,并且我的应用程序崩溃!

When I am trying to insert data into my table, sometimes I get this error, and my app crashes!

崩溃日志:

Observation(4001,0x10dd67000) malloc: *** error for object 0x7fff3a917100: Non-aligned pointer being freed (2)
*** set a breakpoint in malloc_error_break to debug
2016-11-03 11:12:03.063 Observation[4001:46477] Insertion failed !


Printing description of dbpath:
(const char *) dbpath = 0x00007fff3b8a5690 "/Users/macbt/Library/Developer/CoreSimulator/Devices/0EEC62AE-6DF0-4FC4-9D30-1EB90CB695A5/data/Containers/Data/Application/A709E729-3162-4CC8-B9FF-2F22A32FC6BD/Documents/ObservationDB.db"


Printing description of insertSQL:
insert into table_hazard (id, name, modifiedDate) values ("1","Hazard", "03/11/2016 11:12:03 AM")


Printing description of insert_stmt:
(const char *) insert_stmt = 0x00007fff3b9291a1 "insert into table_hazard (id, name, modifiedDate) values (\"1\",\"Hazard\", \"03/11/2016 11:12:03 AM\")"

推荐答案

这种类型的问题的解决方案是,您可能在下面的声明中遗漏了.

The solution of this type of problems is , you may be missing below statement.

 sqlite3_finalize(statement);
        sqlite3_close(database);

每隔

sqlite3_open()
sqlite3_prepare_v2()

我们应该总是在返回语句之前完成该语句并关闭数据库.不要让数据库保持打开状态.
如果您尝试再次打开它,则不执行终结语句,也不关闭数据库.sqlite3_open()

we should always finalize the statement and close the database before return statement. Don't leave database open.
without finalizing statement and without closing Database if you try to again open it sqlite3_open()

sqlite3_prepare_v2()

这将导致有关数据库的EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).

this will result in EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) regarding database .

例如:

-(BOOL) insertDropdownValues:(NSString *)tableName
                       andId:(NSInteger) dID
                        name:(NSString*) name
                modifiedDate:( NSString*) modifiedDate {

    const char *dbpath = [databasePath UTF8String];

    if (sqlite3_open(dbpath, &database) == SQLITE_OK)
    {

        NSString *insertSQL = [NSString stringWithFormat:@"insert into %@ (%@, %@, %@) values (\"%ld\",\"%@\", \"%@\")",tableName,ID,NAME,MODIFIED_DATE, dID,name,modifiedDate];

        const char *insert_stmt = [insertSQL UTF8String];


        sqlite3_prepare_v2(database, insert_stmt,-1, &statement, NULL);


        if (sqlite3_step(statement) == SQLITE_DONE)
        {

            NSLog(@"Inserted SuccessFull");
            sqlite3_finalize(statement);
            sqlite3_close(database);

            return YES;
        }
        else {

            NSLog(@"Insertion failed !");
            sqlite3_finalize(statement);
            sqlite3_close(database);

            return NO;
        }

    }

    sqlite3_reset(statement);
    return NO;

}

这篇关于SQLite错误:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)-iOS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆