iOS SQLite的使用

SQLite

独立的文件,占用资源少、速度快,框架是纯 C 语言的,主要功能就是数据的检索和查询,存储一组相类似的数据,所有数据的结构是相同的,但内容不同,类似于对象数组

  • SQLit是一个开源、轻型嵌入式关系数据库,诞生于2000年5月
  • 占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了
  • 能够支持Windows/Linux/Unix等等主流的操作系统
  • 比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快

SQL语法写法特点

1、不区分大小写(CREATE = create)
2、每条语句以分号(;)结尾
3、关键字建议大写

主键

唯一区别每一条记录,通常是整数,绝大多数都是自动增加的,开始的时候数据没有 id ,当开始存储一条数据的时候,网络数据库会加 “排它锁”,防止其他数据进入,当数据存储完成,数据的 id 由数据库自动设置,撤销 “排它锁”,等待的数据进入网络数据库存储

表是数据库中存放关系数据的集合,一个数据库中可以保存多张表,不同的表之间建立“关系”,创建表的时候,一般加前缀 "T_"

使用

首先需要在项目中导入libsqlite3.tbd框架

设置类方法创建单例对象-OC中创建单例可以单独生成类方法创建单例对象,也可使用原始init方法创建普通对象

 1 .h
 2 @interface SQLiteManager : NSObject
 3 //类方法生成单例对象
 4 +(instancetype)shareInstance;
 5 @end
 6 
 7 .m
 8 @implementation SQLiteManager
 9 static SQLiteManager *instance;
10 +(instancetype)shareInstance{
11     static dispatch_once_t onceToken;
12     dispatch_once(&onceToken, ^{
13         instance = [[self alloc] init];
14     });
15     return instance;
16 }
17 @end

然后在SQLiteManager数据库管理类引入头文件

1 #import <sqlite3.h>

在.h文件中暴露打开数据库的接口

1 //打开数据库
2 -(BOOL)openDB;

.m文件中实现使用原生SQLite框架的各种操作数据库的方法.

 1 #pragma mark - 打开/创建数据库
 2 -(BOOL)openDB{
 3     //app内数据库文件存放路径-一般存放在沙盒中
 4     NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
 5     NSString *DBPath = [documentPath stringByAppendingPathComponent:@"appDB.sqlite"];
 6     //创建(指定路径不存在数据库文件)/打开(已存在数据库文件) 数据库文件
 7     //sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)  filename:数据库路径  ppDb:数据库对象
 8     if (sqlite3_open(DBPath.UTF8String, &_db) != SQLITE_OK) {
 9         //数据库打开失败
10         return NO;
11     }else{
12         //打开成功创建表
13         return [self creatTable];
14     }
15 }
16 -(BOOL)creatTable{
17     //创建表的SQL语句
18     //用户 表
19     NSString *creatUserTable = @"CREATE TABLE IF NOT EXISTS 't_User' ( 'ID' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'name' TEXT,'age' INTEGER,'icon' TEXT);";
20     //车 表
21     NSString *creatCarTable = @"CREATE TABLE IF NOT EXISTS 't_Car' ('ID' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'type' TEXT,'output' REAL,'master' TEXT)";
22     //项目中一般不会只有一个表
23     NSArray *SQL_ARR = [NSArray arrayWithObjects:creatUserTable,creatCarTable, nil];
24     return [self creatTableExecSQL:SQL_ARR];
25 }
26 -(BOOL)creatTableExecSQL:(NSArray *)SQL_ARR{
27     for (NSString *SQL in SQL_ARR) {
28         //参数一:数据库对象  参数二:需要执行的SQL语句  其余参数不需要处理
29         if (![self execSQL:SQL]) {
30             return NO;
31         }
32     }
33     return YES;
34 }
35 #pragma 执行SQL语句
36 -(BOOL)execSQL:(NSString *)SQL{
37     return sqlite3_exec(self.db, SQL.UTF8String, nil, nil, nil) == SQLITE_OK;
38 }

更新数据库对应表中数据

1 -(void)updateIcon{
2     //更新对应的SQL语句
3     NSString *SQL = [NSString stringWithFormat:@"UPDATE 't_User' SET icon='%@' WHERE name = '%@'",@"http://qiuxuewei.com/newIcon.png",@"name_6"];
4     if ([[SQLiteManager shareInstance] execSQL:SQL]) {
5         NSLog(@"对应数据修改成功");
6     }
7 }

查询数据库中对应表中所有数据

 1 #pragma mark - 查询数据库中数据
 2 -(NSArray *)querySQL:(NSString *)SQL{
 3     //准备查询
 4     // 1> 参数一:数据库对象
 5     // 2> 参数二:查询语句
 6     // 3> 参数三:查询语句的长度:-1
 7     // 4> 参数四:句柄(游标对象)
 8 //    sqlite3_prepare_v2(<#sqlite3 *db#>, <#const char *zSql#>, <#int nByte#>, <#sqlite3_stmt **ppStmt#>, <#const char **pzTail#>)
 9     sqlite3_stmt *stmt = nil;
10     if (sqlite3_prepare_v2(self.db, SQL.UTF8String, -1, &stmt, nil) != SQLITE_OK) {
11         NSLog(@"准备查询失败!");
12         return NULL;
13     }
14     //准备成功,开始查询数据
15     //定义一个存放数据字典的可变数组
16     NSMutableArray *dictArrM = [[NSMutableArray alloc] init];
17     while (sqlite3_step(stmt) == SQLITE_ROW) {
18         //一共获取表中所有列数(字段数)
19         int columnCount = sqlite3_column_count(stmt);
20         //定义存放字段数据的字典
21         NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
22         for (int i = 0; i < columnCount; i++) {
23             // 取出i位置列的字段名,作为字典的键key
24             const char *cKey = sqlite3_column_name(stmt, i);
25             NSString *key = [NSString stringWithUTF8String:cKey];
26 
27             //取出i位置存储的值,作为字典的值value
28             const char *cValue = (const char *)sqlite3_column_text(stmt, i);
29             NSString *value = [NSString stringWithUTF8String:cValue];
30 
31             //将此行数据 中此字段中key和value包装成 字典
32             [dict setObject:value forKey:key];
33         }
34         [dictArrM addObject:dict];
35     }
36     return dictArrM;
37 }

在自定义模型中有必要定义个工厂方法可将数据库对应表中所有数据取出,以模型数组的形式输出

 1 +(NSArray *)allUserFromDB{
 2     //查询表中所有数据的SQL语句
 3     NSString *SQL = @"SELECT name,age,icon FROM 't_User'";
 4     //取出数据库用户表中所有数据
 5     NSArray *allUserDictArr = [[SQLiteManager shareInstance] querySQL:SQL];
 6     NSLog(@"%@",allUserDictArr);
 7     //将字典数组转化为模型数组
 8     NSMutableArray *modelArrM = [[NSMutableArray alloc] init];
 9     for (NSDictionary *dict in allUserDictArr) {
10         [modelArrM addObject:[[User alloc] initWithDict:dict]];
11     }
12     return modelArrM;
13 }

没有封装的情况下

打开数据库和创建表

 1 //1.获取沙盒文件名
 2  NSString *fileName = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"student.sqlite"];
 3 NSLog(@"fileName = %@",fileName);
 4 
 5 //2.创建(打开)数据库 (如果数据库不存在,会自动创建)
 6  int result = sqlite3_open(fileName.UTF8String, &_db);
 7 /*代码解析:sqlite3_open()将根据文件路径打开数据库,如果不存在,则会创建一个新的数据库。如果result等于常量SQLITE_OK,则表示成功打开数据库
 8 sqlite3 *db:一个打开的数据库实例
 9 数据库文件的路径必须以C字符串(而非NSString)传入*/
10 
11 if (result == SQLITE_OK) {
12         
13         NSLog(@"成功打开数据库");
14         
15         //创表(这里以创建一个学生表为例,学生包含姓名和年龄,id integer primary key auto increment 为学生表的主键,并且会更具学生数据条数的增加而自动增加)
16         const char *sql = "create table if not exists t_student (id integer primary key autoincrement, name text, age integer);";
17         
18         char *errorMesg = NULL; // 用来存储错误信息
19         
20         //sqlite3_exec()可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据
21         int result = sqlite3_exec(_db, sql, NULL, NULL, &errorMesg);
22         
23         if (result == SQLITE_OK) {
24             
25             NSLog(@"成功创建t_student表");
26             
27         }else {
28             
29             NSLog(@"创建 t_student失败:%s",errorMesg);
30         }
31         
32     }else {
33         
34         NSLog(@"打开数据库失败");
35     }

插入数据

 1 //插入100条学生的数据
 2 
 3     for (int i = 0; i < 30; i++) {
 4         
 5         StudentModel *student = [[StudentModel alloc] init];
 6         student.name = [NSString stringWithFormat:@"Jacl-%d",arc4random()%100];
 7         student.age = arc4random()%100;
 8         
 9         //插入语句(insert into 表名(字段1,字段2,..)values (字段1值,字段2值,..);)
10         NSString *sql = [NSString stringWithFormat:@"insert into t_student (name,age) values ('%@',%d);",student.name,student.age];
11         
12         char *errorMesg = NULL;
13     int result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errorMesg);
14         
15         if (result == SQLITE_OK) {
16             
17             NSLog(@"添加数据成功");
18         }else {
19                 
20             NSLog(@"添加数据失败");
21         }
22     }

查询数据

 1 //定义一个储存查询结果的数组
 2     NSMutableArray *students = nil;
 3      //1.定义sql语句(查询所有学生的数据)
 4     const char *sql = "select id, name, age from t_student;";
 5     //也可用where条件查询语句,查询年龄大于60的学生年龄
 6      const char *sql = "select id, name, age from t_student where age > 60;";
 7   //2.定义一个stmt存放结果集
 8     sqlite3_stmt *stmt = NULL;
 9  //3.检测SQL语句的合法性
10 int result = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);
11     if (result == SQLITE_OK) {
12         
13         NSLog(@"查询语句合法");
14         students = [NSMutableArray array];
15 
16         //4.执行SQL语句
17         while (sqlite3_step(stmt) == SQLITE_ROW) {
18             
19             StudentModel *student = [[StudentModel alloc] init];
20             
21             //获得第几条的id
22             student.ID = sqlite3_column_int(stmt, 0);
23             //获得第几条的name
24             const unsigned char *sname = sqlite3_column_text(stmt, 1);
25             student.name = [NSString stringWithUTF8String:(const char *)sname];
26             //获得第几条的age
27             student.age = sqlite3_column_int(stmt, 2);
28             NSLog(@"%d %@ %d",student.ID,student.name, student.age);
29             [students addObject:student];
30         }
31         
32     } else {
33         
34         NSLog(@"查询语句非法");
35     }

修改数据

 1 //其实Sqlite的数据插入,修改,删除执行的方法都是一样的只是执行的sql语句不一样,想知道sql的更多语句操作自行百度了,比较多这里就不讲解了,只介绍一些基本的操作方法。
 2 //sqlite3数据(把年龄大于60的学生名字全部改成‘哈哈’)
 3 NSString *sql = @"update t_student set name = '哈哈' where age > 60";
 4 char *errorMesg = NULL;
 5 int result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errorMesg);
 6 if (result == SQLITE_OK) {
 7         
 8         NSLog(@"更改成功");
 9     }else {
10         
11         NSLog(@"更改失败");
12     }

删除数据

 1 //删除表中年龄大于60的学生数据
 2     NSString *sql = @"delete from t_student where age >= 60";
 3     char *errorMesg = NULL;
 4     int result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errorMesg);
 5     if (result == SQLITE_OK) {
 6         
 7         NSLog(@"删除成功");
 8     }else {
 9         
10         NSLog(@"删除失败");
11     }

 

posted @ 2018-03-16 11:56  曼莉  阅读(105)  评论(0)    收藏  举报