sqlite常用语法 增删 修改 例子

Posted 雷坤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlite常用语法 增删 修改 例子相关的知识,希望对你有一定的参考价值。

  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 }

 

以上是关于sqlite常用语法 增删 修改 例子的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段

SQLite在Android程序中的使用方法,SQLite的增删查改方法

sqlite怎么修改源代码默认开启外键约束

如何创建片段以重复变量编号中的代码行

Sqlite数据库增删查改操作