在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,不然太麻烦了 哎