sqlite3_prepare_v2
int sqlite3_prepare_v2(
sqlite3 *db, //指向数据库的指针
const char *zSql, //SQL语句
int nByte, //SQL语句的长度 (一般用-1,系统可以自动算出字符串得长度)
sqlite3_stmt **ppStmt, //指向语句的指针
const char **pzTail //SQL中没有用到的一部分,一般为空
);
对整数值的绑定
int sqlite3_bind_int(
sqlite3_stmt*, //指向语句的指针
int, //占位符的序号(从1开始以此类推)
int //绑定的值
);
对字符串值的绑定
int sqlite3_bind_text(
sqlite3_stmt*, //指向语句的指针
int, //占位符的序号(从1开始以此类推)
const char*, //要绑定的值(这里要c类型的字符串(CString),一般我们使用的是oc的字符串(NSString*)要通过- (__strong const char *)UTF8String转一下就可以了)
int n, //该字符串的长度(一般用-1,系统可以自动算出字符串得长度)
void(*)(void*) //回调函数(这里博主还没用过所以不是很了解以后会慢慢更新)
);
对二进制数据值的绑定
int sqlite3_bind_blob(
sqlite3_stmt*, //指向语句的指针
int, //占位符的序号(从1开始以此类推)
const void*, //要绑定的值(这里要的是c类型的比特(Byte),一般我们使用的是oc的NSDATA(NsData*)要通过- (const void *)bytes转一下就可以了)
int n, //数据的长度(用- (NSUInteger)length得到 这里为什么不用-1呢?因为-1对于算字符串长度在行,其他的不一定准所以这里我们手动算出数据的长度)
void(*)(void*) //回调函数(这里博主还没用过所以不是很了解以后会慢慢更新)
);
对整数字段的取值
int sqlite3_column_int(
sqlite3_stmt*, //指向语句的指针
int iCol //数据库中表中列的序号(从0开始以此类推)
);
对字符串字段的取值
注意这里我们取得是无符号的c字符串我们要先转为有符号C字符串再转为Objective-C
字符串
例sname为oc字符串
NSString *sname=[NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
const unsigned char *sqlite3_column_text(
sqlite3_stmt*, //指向语句的指针
int iCol //数据库中表中列的序号(从0开始以此类推)
);
对二进制字段的取值
注意这里我们取得是c二进制我们要转为Objective-C
二进制(我们要将byte(c)
转为NSData(oc)
通过+ (id)dataWithBytes:(const void *)bytes length:(NSUInteger)length;
因为这里需要数据的长度所以需要调用int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
获取数据的长度)
int length = sqlite3_column_bytes(stmt,3);//获取二进制数据的长度
NSData *img = [NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:length]; //将二进制数据转换位NSData对象
const void *sqlite3_column_blob(
sqlite3_stmt*, //指向语句的指针
int iCol //数据库中表中列的序号(从0开始以此类推)
);
实例
新建一个类(Student)
包含以下属性
@property (retain,nonatomic) NSString *sname;
@property (assign,nonatomic) int sage;
@property (retain,nonatomic) NSData *simage;
@property (assign,nonatomic) int sid;
1.数据库的全表查询
+ (NSMutableArray*)findall
{
NSMutableArray* stuArray;//在这里只声明不开辟空间 等用的时候再开辟(节省空间)
sqlite3 *sqlite = [DataBase OpenDB];
sqlite3_stmt *stmt = nil;
int flag = sqlite3_prepare_v2(sqlite, "select * from tblstudent", -1, &stmt, nil);
if (flag == SQLITE_OK)
{
stuArray = [[NSMutableArray alloc] init];//为数组开辟空间
while (sqlite3_step(stmt) == SQLITE_ROW) //开始指向第一行的上面 判断下一行是否存在(存在:做准备指针移到下一行)(不存在:跳出循环)
{
int sid1 = sqlite3_column_int(stmt, 0);
int sage = sqlite3_column_int(stmt, 2);
NSString *sname1 = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];//获取当前表中当前行第二列的值
int length = sqlite3_column_bytes(stmt,3);//获取二进制数据的长度 sqlite3_column_bytes():获取当前行某一列的所占内存的字节数
NSData *img1 = [NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:length]; //将二进制数据转换位NSData对象
//定义一个(Student*)对象并将从数据库取来的数据赋值给对象的相应属性
Student *stu = [[Student alloc] init];//实例化
stu.sid = sid1;
stu.sname = sname1;
stu.simage = img1;
stu.sage = sage;
[stuArray addObject:stu];//将一个对象存入数组
[stu release];//释放对象
}
}
sqlite3_finalize(stmt);//回收stmt对象
return [stuArray autorelease];//返回包含学生信息的数组 并设为自动释放
}
2.通过姓名或者学号查询
+(Student*)findbysid:(int)sid
{
Student *stu;//用于返回的学生对象
sqlite3 *sqlite = [DataBase OpenDB];//打开数据库
sqlite3_stmt *stmt = nil;//定义sql语句对象
int flag = sqlite3_prepare_v2(sqlite, "select * from tblstudent where stuid=?", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象
if (flag == SQLITE_OK)
{
sqlite3_bind_int(stmt, 1, sid);//给问号占位符赋值
while (sqlite3_step(stmt) == SQLITE_ROW)//因为一个学号肯定对应一个学生所以这里其实只执行一次
{
//根据列顺序(从零开始)
int sid = sqlite3_column_int(stmt, 0);//取整型数据
int sage = sqlite3_column_int(stmt, 2);
NSString *sname = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];//取nsstring数据
int length = sqlite3_column_bytes(stmt,3);//获取二进制数据的长度
NSData *img = [NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:length]; //将二进制数据转换位NSData对象
//将从数据库中查询来的数据存到(Student*)对象中,用于返回
stu = [[Student alloc]init];//此时开辟空间节省内存
stu.sid = sid;
stu.sname = sname;
stu.simage = img;
stu.sage = sage;
}
}
sqlite3_finalize(stmt);//回收stmt对象
return [stu autorelease];//返回包含学生信息的对象
}
3.向数据库增加一条记录
+ (void)insertstudent:(NSString*)name age:(int)age image:(NSData*)image
{
sqlite3 *sqlite =[ DataBase OpenDB];//打开数据库
sqlite3_stmt *stmt = nil;//定义sql语句对象
int flag = sqlite3_prepare_v2(sqlite, "insert into tblstudent(stuname,stuage,stuimage) values(?,?,?)", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象 多值绑定逗号隔开
if (flag == SQLITE_OK)
{
sqlite3_bind_text(stmt, 1, [name UTF8String],-1,nil);//给问号占位符赋值
sqlite3_bind_int(stmt, 2, age);//对整型数据的绑定
sqlite3_bind_blob(stmt, 3, [image bytes], [image length], nil);//对二进制类型数据的绑定 数据的字节数(-1 针对字符串的长度比较准)
if(sqlite3_step(stmt) == SQLITE_ERROR)//执行insert动作
{
NSLog(@"insert error");
}
}
sqlite3_finalize(stmt);//回收stmt对象
}
4.修改更新数据库的数据
+ (void)updatestudent:(Student*) stu
{
sqlite3 *sqlite = [DataBase OpenDB];//打开数据库
sqlite3_stmt *stmt = nil;//定义sql语句对象
int flag = sqlite3_prepare_v2(sqlite, "update tblstudent set stuname=?,stuage=?,stuimage=? where stuid=?", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象
if (flag == SQLITE_OK)
{
sqlite3_bind_text(stmt, 1, [stu.sname UTF8String],-1,nil);//给问号占位符赋值
//stu.sname为nsstring UTF8String nsstring---->ctring
sqlite3_bind_int(stmt, 4, stu.sid);//给问号占位符赋值
sqlite3_bind_int(stmt, 2, stu.sage);//给年龄赋值
sqlite3_bind_blob(stmt, 3, [stu.simage bytes], [stu.simage length], nil);
if(sqlite3_step(stmt) == SQLITE_ERROR)//执行update动作
{
NSLog(@"update error");
}
sqlite3_finalize(stmt);//回收stmt对象
}
}
5.删除数据库的记录
+ (void)deletebysid:(int) sid
{
sqlite3 *sqlite=[DataBase OpenDB];//打开数据库
sqlite3_stmt *stmt=nil;//定义sql语句对象
int flag=sqlite3_prepare_v2(sqlite, "delete from tblstudent where stuid=?", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象
if (flag==SQLITE_OK)
{
sqlite3_bind_int(stmt, 1, sid);//给问号占位符赋值 1.语句2.占位符的序号3.给占位符赋得值
//执行delete动作
if(sqlite3_step(stmt)==SQLITE_ERROR)//未执行成功
{
NSLog(@"delete error");
}
}
sqlite3_finalize(stmt);//回收stmt对象
NSLog(@"删除了第%d",sid);
}
Reference
http://www.cnblogs.com/jy578154186/archive/2012/10/18/2730113.html