Bootstrap

SQL语句的预编译失败问题(Done)

在125deaths中的语句


    TrapsModel * myTrapModel;
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
    NSString *sqlFilePath = [docPath stringByAppendingPathComponent:@"trapsModel.sqlite3"];
    static sqlite3 *db = nil;
    sqlite3_open([sqlFilePath UTF8String], &db);

    // 创建一个语句对象
    sqlite3_stmt *stmt = nil;

    NSString * selectSQL = @"select * from trapsModel where id like ?";
    // 此函数的作用是生成一个语句对象,此时sql语句并没有执行,创建的语句对象,保存了关联的数据库,执行的sql语句,sql语句的长度等信息
    int result = sqlite3_prepare_v2(db, [selectSQL UTF8String], -1, &stmt, nil);
    NSLog(@"result的结果是:%d,SQLITE_OK的值是:%d",result,SQLITE_OK);
    if (result == SQLITE_OK) {
        // 为第一个?占位符绑定参数
        sqlite3_bind_text(stmt, 1, [[NSString stringWithFormat:@"%%%d%%"
                                     , num] UTF8String], -1, NULL);

        // SQLite_ROW仅用于查询语句,sqlite3_step()函数执行后的结果如果是SQLite_ROW,说明结果集里面还有数据,会自动跳到下一条结果,如果已经是最后一条数据,再次执行sqlite3_step(),会返回SQLite_DONE,结束整个查询
        while (sqlite3_step(stmt) == SQLITE_ROW) {

            // 获取记录中的字段值
            // 第一个参数是语句对象,第二个参数是字段的下标,从0开始
            int ID = sqlite3_column_int(stmt, 0);
            const unsigned char *cName = sqlite3_column_text(stmt, 1);
            const unsigned char *cPic = sqlite3_column_text(stmt, 2);

            // 将获取到的C语言字符串转换成OC字符串
            NSString *name = [NSString stringWithUTF8String:(const char *)cName];
            NSString *pic = [NSString stringWithUTF8String:(const char *)cPic];
            myTrapModel = [TrapsModel initWithId:ID name:name pic:pic];

        }
    }else
    {
        NSLog(@"result编译失败");
    }
    // 关闭数据库
    sqlite3_finalize(stmt);
    sqlite3_close(db);

    NSLog(@"%@", myTrapModel.picture);

在test中的语句

if (num == 0) {
        num = 1;
        NSLog(@"转换成1");
    }else
    {
        num = 0;
        NSLog(@"转换成0");
    }
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
    NSString *sqlFilePath = [docPath stringByAppendingPathComponent:@"trapsModel.sqlite3"];

    static sqlite3 *db = nil;
    sqlite3_open([sqlFilePath UTF8String], &db);

    // 创建一个语句对象
    sqlite3_stmt *stmt = nil;

    // 此函数的作用是生成一个语句对象,此时sql语句并没有执行,创建的语句对象,保存了关联的数据库,执行的sql语句,sql语句的长度等信息
    int result = sqlite3_prepare_v2(db, "select * from trapsModel where id like ?", -1, &stmt, nil);
    if (result == SQLITE_OK) {

        // 为第一个?占位符绑定参数
        sqlite3_bind_text(stmt, 1, [[NSString stringWithFormat:@"%%%d%%"
                                     , num] UTF8String], -1, NULL);

        // SQLite_ROW仅用于查询语句,sqlite3_step()函数执行后的结果如果是SQLite_ROW,说明结果集里面还有数据,会自动跳到下一条结果,如果已经是最后一条数据,再次执行sqlite3_step(),会返回SQLite_DONE,结束整个查询
        while (sqlite3_step(stmt) == SQLITE_ROW) {

            // 获取记录中的字段值
            // 第一个参数是语句对象,第二个参数是字段的下标,从0开始
            int ID = sqlite3_column_int(stmt, 0);
            const unsigned char *cName = sqlite3_column_text(stmt, 1);
            const unsigned char *cPic = sqlite3_column_text(stmt, 2);

            // 将获取到的C语言字符串转换成OC字符串
            NSString *name = [NSString stringWithUTF8String:(const char *)cName];
            NSString *pic = [NSString stringWithUTF8String:(const char *)cPic];
            traps = [trapModels01 initWithId:ID name:name pic:pic];
            //            Student *student = [Student studentWithID:ID name:name gender:gender];

            self.identifer.text = [NSString stringWithFormat:@"%ld",(long)traps.identifier];
            self.name.text = traps.name;
            self.picture.text = traps.picture;
            NSLog(@"%@ %@",name,pic);
            NSLog(@"%@ %@",self.name.text,self.picture.text);
            NSLog(@"%@ %@",traps.name,traps.picture);
        }
    }else
    {
        NSLog(@"result编译不等于SQLLITE_OK");
        NSLog(@"result 是%d,SQLITE是%d",result,SQLITE_OK);
    }

    // 关闭数据库
    sqlite3_finalize(stmt);
    sqlite3_close(db);

两者语句几乎一致,test中通过并功能正常,但在125deaths中却不能正常工作,经排查貌似是sqlite3_prepare_v2()这个SQL预编译语句失败导致的。
125deaths的NSLog结果为:

2017-05-20 11:07:04.149 256deathes[1828:45273] result的结果是:1,SQLITE_OK的值是:0
2017-05-20 11:07:04.149 256deathes[1828:45273] result编译失败

原因还在排查中…


运用sqlite3_errmsg()得知是数据库中无trapsModel表,原来是以前copy过一个空数据库,导致新数据库没能拷贝进去,导致在预编译时没有发现trapsModel表而失败,现有出现另一问题:
Thread 1:EXC_BAD_ACCESS(code=1,address=0x70)
继续解决问题,看来得早些学会查bug,不然太麻烦了 哎

;