例子:有个学生类数据库studentDb.sqlite,使用sqlite进行增减修改操作
一般时候想要操作数据库,需要先建立连接。我先新建一个Db类作为数据连接类(Db*)
在做以前一定要先导入libsqlite3.dylib框架 拽进studentDb.sqlite文件
*********Db.h
#import
#import //导入数据库文件
@interface Db : NSObject
+(sqlite3*)openDb;//声明打开数据库方法声明
@end
*********Db.m
#import "Db.h"
@implementation Db
//开启数据连接函数,得到可用的数据连接对象
+(sqlite3*)openDb
{
static sqlite3 *stuDb;//表示与studentDb的连接
NSString *begainPath=[[NSBundle mainBundle]pathForResource:@"studentDb" ofType:@"sqlite"];//NSBundle目录下的东西是不能修改的,将studentDb从沙盒的bundle目录复制到docment目录
NSString *targetPath=[NSSearchPathForDirectori esInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
NSString *targetFile=[targetPath stringByAppendingPathCom ponent:@"studentDb.sqlite"];//生成studentDb在Document文件的路径(本人理解,不知是否准确)
//创建文本管理器对象,辅助做文件管理
NSFileManager *am=[NSFileManager defaultManager];
//判断该文件是否存在
if (![am fileExistsAtPath:targetFile])//若文件不存在就复制文件到指定目录
{
NSError *error;
[am copyItemAtPath:begainPath toPath:targetFile error:&error];
NSLog(@"%@",error);
}
sqlite3_open([targetFile UTF8String], &stuDb);
return stuDb;
}
@end
//创建一个类作为数据映射类
******************新建一个类(Student*)
Student.h文件
#import
包含以下属性
@property(retain,nonatomic)NSString*sname;
@property(assign,nonatomic)int sage;
@property(retain,nonatomic)NSData*simage;
@property(assign,nonatomic)int sid;
Student.m文件
#import "Student.h"
#import "Db.h"
@implementation Student
@synthesize sname,sage,simage,sid;
//1.数据库的全表查询
+(NSMutableArray*) findall//返回表中所有记录
{
NSMutableArray* stuArray=nil;//存储查询结果 结果是数组类型 在这里只声明不开辟空间 等用的时候再开辟(节省空间)
sqlite3 *sqlite=[Db OpenDb];//打开数据库 并且定义了一个指针sqlite指向dbpoint所指向的区域(数据库)
sqlite3_stmt *stmt=nil;//定义一个指向sql语句的指针对象
int flag=sqlite3_prepare_v2(sqlite, "select * from stu", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象 sqlite:数据库 -1:系统自动算出要存的sql语句的长度(也可以自己给出) &stmt:一个指向sql语句的内存的地址 nil:sql语句中没有用到的一部分(一般为空) 返回值为一个int(宏)SQLITE_OK 0 SQLITE_ERROR 1
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)];//获取当前表中当前行第二列的值
//sqlite3_column_text(stmt, 1):返回的是一个无符号c字符串 (const char *)进行强转为有符号c字符串 stringWithUTF8String:将一个c字符串转为nsstring类型
int length=sqlite3_column_bytes(stmt,3);//获取二进制数据的长 sqlite3_column_bytes():获取当前行某一列的所占内存的字节数
NSData *img1=[NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:length]; //将二进制数据转换位NSData对象
//sqlite3_column_blob(stmt, 2):返回的是byte型(c) dataWithBytes:length:将(c)二进制转为nsdata(oc)
//定义一个(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*)对象
+(Student*) findbysid:(int) sid
{
Student *stu;//用于返回的学生对象
sqlite3 *sqlite=[Db 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];//返回包含学生信息的对象
}
*注意这里一般学生姓名并不是唯一标示所以可能会查到多条记录符合条件所以要返回一个数组来存储符合条件的(Student*)对象 但现在我们的数据库不涉及重名的事例所以这里只返回学生对象
+(Student*) findbysname:(NSString*)sname
{
Student *stu;//用于返回的学生对象
sqlite3 *sqlite=[Db OpenDb];//打开数据库
sqlite3_stmt *stmt=nil;//定义sql语句对象
int flag=sqlite3_prepare_v2(sqlite, "select * from tblstudent where stuname=?", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象
if (flag==SQLITE_OK)
{
sqlite3_bind_text(stmt, 1, [sname UTF8String], -1, nil);//给问号占位符赋值
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对象
stu=[[Student alloc]init];//此时开辟空间节省内存
stu.sid=sid;
stu.sname=sname;
stu.simage=img;
stu.sage=sage;
}
}
sqlite3_finalize(stmt);//回收stmt对象
return [stu autorelease];//返回包含学生信息的(Student*)对象
}
3.向数据库增加一条记录
+(void) insertstudent:(NSString*) name age:(int)age image:(NSData*)image
{
sqlite3 *sqlite=[Db 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=[Db 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=[Db 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);
}
一般时候想要操作数据库,需要先建立连接。我先新建一个Db类作为数据连接类(Db*)
在做以前一定要先导入libsqlite3.dylib框架
*********Db.h
#import
#import //导入数据库文件
@interface Db : NSObject
+(sqlite3*)openDb;//声明打开数据库方法声明
@end
*********Db.m
#import "Db.h"
@implementation Db
//开启数据连接函数,得到可用的数据连接对象
+(sqlite3*)openDb
{
}
@end
//创建一个类作为数据映射类
******************新建一个类(Student*)
Student.h文件
#import
包含以下属性
@property(retain,nonatomic)NSString*sname;
@property(assign,nonatomic)int sage;
@property(retain,nonatomic)NSData*simage;
@property(assign,nonatomic)int sid;
Student.m文件
#import "Student.h"
#import "Db.h"
@implementation Student
@synthesize sname,sage,simage,sid;
//1.数据库的全表查询
+(NSMutableArray*) findall//返回表中所有记录
{
}
//2.通过姓名或者学号查询
*注意这里学号是主键所以肯定查回来是有唯一确定的(Student*)对象
+(Student*) findbysid:(int) sid
{
}
*注意这里一般学生姓名并不是唯一标示所以可能会查到多条记录符合条件所以要返回一个数组来存储符合条件的(Student*)对象
+(Student*) findbysname:(NSString*)sname
{
}
3.向数据库增加一条记录
+(void) insertstudent:(NSString*) name age:(int)age image:(NSData*)image
{
}
4.修改更新数据库的数据
*注意更新数据库时要通过一定的限制条件来确定要更新的记录,可能是一条也可能是多条,当要更新的记录是多条时要注意所有符合条件的记录都会改为你定义的值。
+(void) updatestudent:(Student*) stu
{
}
5.删除数据库的记录
*注意删除数据库的记录时要通过一定的限制条件来确定要删除的记录,可能是一条也可能是多条,当要删除的记录是多条时要注意所有符合条件的记录都会被删除。
+(void) deletebysid:(int) sid
{
}