1 例子:有个学生类数据库studentDb.sqlite,使用sqlite进行增减修改操作
2 一般时候想要操作数据库,需要先建立连接。我先新建一个Db类作为数据连接类(Db*)
3 在做以前一定要先导入libsqlite3.dylib框架 拽进studentDb.sqlite文件
4 *********Db.h
5 #import
6 #import //导入数据库文件
7 @interface Db : NSObject
8 +(sqlite3*)openDb;//声明打开数据库方法声明
9 @end
10 *********Db.m
11 #import "Db.h"
12 @implementation Db
13 //开启数据连接函数,得到可用的数据连接对象
14 +(sqlite3*)openDb
15 {
16 static sqlite3 *stuDb;//表示与studentDb的连接
17 NSString *begainPath=[[NSBundle mainBundle]pathForResource:@"studentDb" ofType:@"sqlite"];//NSBundle目录下的东西是不能修改的,将studentDb从沙盒的bundle目录复制到docment目录
18 NSString *targetPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
19 NSString *targetFile=[targetPath stringByAppendingPathComponent:@"studentDb.sqlite"];//生成studentDb在Document文件的路径(本人理解,不知是否准确)
20 //创建文本管理器对象,辅助做文件管理
21 NSFileManager *am=[NSFileManager defaultManager];
22 //判断该文件是否存在
23 if (![am fileExistsAtPath:targetFile])//若文件不存在就复制文件到指定目录
24 {
25 NSError *error;
26 [am copyItemAtPath:begainPath toPath:targetFile error:&error];
27 NSLog(@"%@",error);
28 }
29 sqlite3_open([targetFile UTF8String], &stuDb);
30 return stuDb;
31 }
32
33 @end
34
35
36 //创建一个类作为数据映射类
37 ******************新建一个类(Student*)
38 Student.h文件
39 #import
40 包含以下属性
41 @property(retain,nonatomic)NSString*sname;
42 @property(assign,nonatomic)int sage;
43 @property(retain,nonatomic)NSData*simage;
44 @property(assign,nonatomic)int sid;
45
46 Student.m文件
47 #import "Student.h"
48 #import "Db.h"
49 @implementation Student
50 @synthesize sname,sage,simage,sid;
51
52 //1.数据库的全表查询
53 +(NSMutableArray*) findall//返回表中所有记录
54 {
55 NSMutableArray* stuArray=nil;//存储查询结果 结果是数组类型 在这里只声明不开辟空间 等用的时候再开辟(节省空间)
56 sqlite3 *sqlite=[Db OpenDb];//打开数据库 并且定义了一个指针sqlite指向dbpoint所指向的区域(数据库)
57 sqlite3_stmt *stmt=nil;//定义一个指向sql语句的指针对象
58 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
59 if (flag==SQLITE_OK) //预编译成功
60 {
61 stuArray=[[NSMutableArray alloc]init];//为数组开辟空间
62 while (sqlite3_step(stmt)==SQLITE_ROW) //开始指向第一行的上面 判断下一行是否存在(存在:做准备指针移到下一行)(不存在:跳出循环)
63 {
64 int sid1=sqlite3_column_int(stmt, 0);//获取表中当前行第一列的值
65 int sage=sqlite3_column_int(stmt, 2);
66 NSString *sname1=[NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];//获取当前表中当前行第二列的值
67 //sqlite3_column_text(stmt, 1):返回的是一个无符号c字符串 (const char *)进行强转为有符号c字符串 stringWithUTF8String:将一个c字符串转为nsstring类型
68 int length=sqlite3_column_bytes(stmt,3);//获取二进制数据的长 sqlite3_column_bytes():获取当前行某一列的所占内存的字节数
69 NSData *img1=[NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:length]; //将二进制数据转换位NSData对象
70 //sqlite3_column_blob(stmt, 2):返回的是byte型(c) dataWithBytes:length:将(c)二进制转为nsdata(oc)
71
72 //定义一个(Student*)对象并将从数据库取来的数据赋值给对象的相应属性
73 Student *stu=[[Student alloc]init];//实例化
74 stu.sid=sid1;
75 stu.sname=sname1;
76 stu.simage=img1;
77 stu.sage=sage;
78 [stuArray addObject:stu];//将一个对象存入数组
79 [stu release];//释放对象
80 }
81 }
82 sqlite3_finalize(stmt);//回收stmt对象
83 return [stuArray autorelease];//返回包含学生信息的数组 并设为自动释放
84 }
85 //2.通过姓名或者学号查询
86 *注意这里学号是主键所以肯定查回来是有唯一确定的(Student*)对象
87 +(Student*) findbysid:(int) sid
88 {
89 Student *stu;//用于返回的学生对象
90 sqlite3 *sqlite=[Db OpenDb];//打开数据库
91 sqlite3_stmt *stmt=nil;//定义sql语句对象
92 int flag=sqlite3_prepare_v2(sqlite, "select * from tblstudent where stuid=?", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象
93 if (flag==SQLITE_OK)
94 {
95 sqlite3_bind_int(stmt, 1, sid);//给问号占位符赋值
96 while (sqlite3_step(stmt)==SQLITE_ROW)//因为一个学号肯定对应一个学生所以这里其实只执行一次
97 {
98 //根据列顺序(从零开始)
99 int sid=sqlite3_column_int(stmt, 0);//取整型数据
100 int sage=sqlite3_column_int(stmt, 2);
101 NSString *sname=[NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];//取nsstring数据
102 int length=sqlite3_column_bytes(stmt,3);//获取二进制数据的长度
103 NSData *img=[NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:length]; //将二进制数据转换位NSData对象
104 //将从数据库中查询来的数据存到(Student*)对象中,用于返回
105 stu=[[Student alloc]init];//此时开辟空间节省内存
106 stu.sid=sid;
107 stu.sname=sname;
108 stu.simage=img;
109 stu.sage=sage;
110 }
111 }
112 sqlite3_finalize(stmt);//回收stmt对象
113 return [stu autorelease];//返回包含学生信息的对象
114 }
115 *注意这里一般学生姓名并不是唯一标示所以可能会查到多条记录符合条件所以要返回一个数组来存储符合条件的(Student*)对象 但现在我们的数据库不涉及重名的事例所以这里只返回学生对象
116 +(Student*) findbysname:(NSString*)sname
117 {
118 Student *stu;//用于返回的学生对象
119 sqlite3 *sqlite=[Db OpenDb];//打开数据库
120 sqlite3_stmt *stmt=nil;//定义sql语句对象
121 int flag=sqlite3_prepare_v2(sqlite, "select * from tblstudent where stuname=?", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象
122 if (flag==SQLITE_OK)
123 {
124 sqlite3_bind_text(stmt, 1, [sname UTF8String], -1, nil);//给问号占位符赋值
125 while (sqlite3_step(stmt)==SQLITE_ROW)
126 {
127 //根据列顺序(从零开始)
128 int sid=sqlite3_column_int(stmt, 0);//取整型数据
129 int sage=sqlite3_column_int(stmt, 2);
130 NSString *sname=[NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];//取nsstring数据
131 int length=sqlite3_column_bytes(stmt,3);//获取二进制数据的长度
132 NSData *img=[NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:length]; //将二进制数据转换位NSData对象
133 stu=[[Student alloc]init];//此时开辟空间节省内存
134 stu.sid=sid;
135 stu.sname=sname;
136 stu.simage=img;
137 stu.sage=sage;
138 }
139 }
140 sqlite3_finalize(stmt);//回收stmt对象
141 return [stu autorelease];//返回包含学生信息的(Student*)对象
142 }
143 3.向数据库增加一条记录
144 +(void) insertstudent:(NSString*) name age:(int)age image:(NSData*)image
145 {
146 sqlite3 *sqlite=[Db OpenDb];//打开数据库
147 sqlite3_stmt *stmt=nil;//定义sql语句对象
148 int flag=sqlite3_prepare_v2(sqlite, "insert into tblstudent(stuname,stuage,stuimage) values(?,?,?)", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象 多值绑定逗号隔开
149 if (flag==SQLITE_OK)
150 {
151 sqlite3_bind_text(stmt, 1, [name UTF8String],-1,nil);//给问号占位符赋值
152 sqlite3_bind_int(stmt, 2, age);//对整型数据的绑定
153 sqlite3_bind_blob(stmt, 3, [image bytes], [image length], nil);//对二进制类型数据的绑定 数据的字节数(-1 针对字符串的长度比较准)
154 if(sqlite3_step(stmt)==SQLITE_ERROR)//执行insert动作
155 {
156 NSLog(@"insert error");
157 }
158 }
159 sqlite3_finalize(stmt);//回收stmt对象
160 }
161 4.修改更新数据库的数据
162 *注意更新数据库时要通过一定的限制条件来确定要更新的记录,可能是一条也可能是多条,当要更新的记录是多条时要注意所有符合条件的记录都会改为你定义的值。
163 +(void) updatestudent:(Student*) stu
164 {
165 sqlite3 *sqlite=[Db OpenDb];//打开数据库
166 sqlite3_stmt *stmt=nil;//定义sql语句对象
167 int flag=sqlite3_prepare_v2(sqlite, "update tblstudent set stuname=?,stuage=?,stuimage=? where stuid=?", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象
168 if (flag==SQLITE_OK)
169 {
170 sqlite3_bind_text(stmt, 1, [stu.sname UTF8String],-1,nil);//给问号占位符赋值
171 //stu.sname为nsstring UTF8String nsstring---->ctring
172 sqlite3_bind_int(stmt, 4, stu.sid);//给问号占位符赋值
173 sqlite3_bind_int(stmt, 2, stu.sage);//给年龄赋值
174 sqlite3_bind_blob(stmt, 3, [stu.simage bytes], [stu.simage length], nil);
175 if(sqlite3_step(stmt)==SQLITE_ERROR)//执行update动作
176 {
177 NSLog(@"update error");
178 }
179 sqlite3_finalize(stmt);//回收stmt对象
180 }
181 }
182 5.删除数据库的记录
183 *注意删除数据库的记录时要通过一定的限制条件来确定要删除的记录,可能是一条也可能是多条,当要删除的记录是多条时要注意所有符合条件的记录都会被删除。
184 +(void) deletebysid:(int) sid
185 {
186 sqlite3 *sqlite=[Db OpenDb];//打开数据库
187 sqlite3_stmt *stmt=nil;//定义sql语句对象
188 int flag=sqlite3_prepare_v2(sqlite, "delete from tblstudent where stuid=?", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象
189 if (flag==SQLITE_OK)
190 {
191 sqlite3_bind_int(stmt, 1, sid);//给问号占位符赋值 1.语句2.占位符的序号3.给占位符赋得值
192 //执行delete动作
193 if(sqlite3_step(stmt)==SQLITE_ERROR)//未执行成功
194 {
195 NSLog(@"delete error");
196 }
197 }
198 sqlite3_finalize(stmt);//回收stmt对象
199
200 NSLog(@"删除了第%d",sid);
201 }