iOS:面向对象的思想使用sqlite数据库

SQLite支持的常见数据类型如下所示。
–INTEGER 有符号的整数类型
–REAL 浮点类型
–TEXT 字符串类型,采用UTF-8和UTF-16字符编码
–BLOB 二进制大对象类型,能够存放任何二进制数据
 
(C语言中)使用步骤:
1.新建项目时,先导入系统框架(C语言). (libsqlite3)
2.头文件#import<sqlite3.h>
3. sqlite3_open(fileName.UTF8String, &_db); 打开或者创建一个数据

    *_db自己定义一个sqlite3的成员变量.进行增删改查时要用

 
4.sqlite3_exec(_db, sql, NULL, NULL,&error);  //不带结果集的语句,只是对表做操作,不会返回出结果
*该函数可进行insert,delete,update操作.
5.查询操作select. //带结果集的查询语句,会返回出结果,从表中查询到的数据都会放到stmt结构体中
*sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);做查询前准备,检测SQL语句是否正确.
*sqlite3_step(stmt) 提取查询到的数据,一次提取一条.//通过循环可以取出所有数据
*sqlite3_column_text(stmt, 0)取出第0列的数据.
6.关闭数据库 sqlite3_close(sqlite3 *);
————————————————————————————————————————————————————
————————————————————————————————————————————————————
执行带参数的SQL语句

NSString *sqlStr = @"INSERT OR REPLACE INTO note (cdate,content) VALUES (?,?)";

sqlite3_stmt *statement;
//预处理过程,产生结果集
if (sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &statement, 

NULL) == SQLITE_OK)

 {

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
  NSString *nsdate = [dateFormatter stringFromDate:model.date]; 

  //绑定参数开始
  sqlite3_bind_text(statement, 1, [nsdate UTF8String], -1, NULL);  sqlite3_bind_text(statement, 2, [model.content UTF8String], 

-1,    NULL);

  //执行插入
if (sqlite3_step(statement) != SQLITE_DONE)

 {  

NSAssert(NO, @"插入数据失败。"); } 

 } 

}

//清理结果集,防止内存泄露

 sqlite3_finalize(statement);

 

单例模式:(这里主要用来保证初始化的数据库是唯一的,只要创建了一次,那么它就不会被再创建)

+ (NoteDAO*)sharedManager 

  static dispatch_once_t once; 

  dispatch_once(&once, ^{ 

  sharedManager = [[self alloc] init]; 

  [sharedManager   createEditableCopyOfDatabaseIfNeeded]; }

  );

   return sharedManager;

 }

 

举例代码如下:

Student.h

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Student : NSObject
 4 @property (assign,nonatomic)NSInteger ID;
 5 @property (copy,nonatomic)NSString *name;
 6 @property (assign,nonatomic)NSInteger age;
 7 @property (assign,nonatomic)char gender;
 8 @property (assign,nonatomic)float math;
 9 @property (assign,nonatomic)float english;
10 @property (assign,nonatomic)float chinese;
11 @end

 

Student.m

1 #import "Student.h"
2 
3 @implementation Student
4 -(NSString*)description
5 {
6     return [NSString stringWithFormat:@"ID:%ld,name:%@,age:%ld,gender:%c,math:%.2lf,english:%.2lf,chinese:%.2lf",_ID,_name,_age,_gender,_math,_english,_chinese];
7 }
8 @end

 

StudentDAO.h(对每一个实体类的数据库封装起来,就采用这种XXXDAO.h/m的命名风格)

 1 #import <Foundation/Foundation.h>
 2 #import <sqlite3.h>
 3 @class Student;
 4 @interface StudentDAO : NSObject
 5 {
 6     sqlite3 *_db;
 7 }
 8 //单例的方法
 9 +(StudentDAO*)shareManager;
10 
11 //初始化数据库:创建表,添加数据
12 -(void)initDb;
13 
14 //添加学生记录
15 -(BOOL)addStudent:(Student *)stu;
16 
17 //删除学生记录
18 -(BOOL)deleteStudentByName:(NSString *)name;
19 
20 //修改学生记录
21 -(BOOL)updateStudnet:(Student*)stu;
22 
23 //查询学生记录
24 //1.查询全部
25 -(NSArray *)queryStudentAll;
26 //2.查询符合条件的
27 -(Student *)queryStudentByName:(NSString*)name;
28 
29 @end

 

StudentDAO.m

  1 #import "StudentDAO.h"
  2 #import "Student.h"
  3 
  4 
  5 static StudentDAO *instance = nil;
  6 @implementation StudentDAO
  7 
  8 //对象只创建一次
  9 +(StudentDAO*)shareManager
 10 {
 11     static dispatch_once_t once;
 12     dispatch_once(&once, ^{
 13         //只执行一次
 14         instance = [StudentDAO new];
 15         
 16         [instance initDb];
 17     });
 18      
 19     return instance;
 20 }
 21 
 22 //执行不返回结果集的sql语句
 23 -(BOOL)execSql:(NSString *)sql
 24 {
 25     char *errmsg = NULL;
 26     //增删改操作
 27     sqlite3_exec(_db, [sql UTF8String], NULL, NULL, &errmsg);
 28     
 29     if(errmsg)
 30     {
 31         return NO;
 32     }
 33     else
 34     {
 35         return YES;
 36     }
 37 }
 38 //创建数据库文件路径
 39 -(NSString*)pathForDB
 40 {
 41     NSArray *dirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 42     NSString *documentPath = [dirs lastObject];
 43     
 44     //NSLog(@"%@",documentPath);
 45     
 46     return [documentPath stringByAppendingPathComponent:@"student.db"];
 47 }
 48 
 49 //初始化数据库:创建表,添加数据
 50 -(void)initDb
 51 {
 52     //打开数据库
 53     //sqlite3_open(fileName.UTF8String,&_db);打开或创建一个数据
 54     //*_db自己定义一个sqlite3的成员变量.进行增删改查时要用
 55     if(sqlite3_open([[self pathForDB] UTF8String], &_db) == SQLITE_OK)
 56     {
 57         //创建学生表
 58         if([self execSql:@"create table student (id integer primary key autoincrement,name text,age integer,gender integer,math real,english real,chinese real)"])
 59         {
 60             //表中添加测试数据
 61             for(int i=0; i<5; i++)
 62             {
 63                 Student *stu = [Student new];
 64                 stu.name = [NSString stringWithFormat:@"stu%d",i+1];
 65                 stu.age = 20+i;
 66                 stu.gender = 'M';
 67                 stu.math = 80+i;
 68                 stu.english = 90+i;
 69                 stu.chinese = 80+i;
 70                 
 71                 [self addStudent:stu];
 72             }
 73         }
 74         //关闭数据库
 75        sqlite3_close(_db);
 76     }
 77 }
 78 
 79 //添加学生记录
 80 -(BOOL)addStudent:(Student *)stu
 81 {
 82     NSString *insertSql = @"insert into student (name,age,gender,math,english,chinese) values(?,?,?,?,?,?)";
 83     
 84     //打开数据库
 85     if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK)
 86     {
 87         //准备结果集
 88         //提取数据一次一条
 89         sqlite3_stmt *Pstmt = NULL;
 90         //查询前准备,看是否正确
 91         if(sqlite3_prepare_v2(_db, [insertSql UTF8String], -1, &Pstmt, NULL) == SQLITE_OK)
 92         {
 93             //绑定参数
 94             sqlite3_bind_text(Pstmt, 1, [stu.name UTF8String], -1, NULL);
 95             sqlite3_bind_int(Pstmt, 2, (int)stu.age);
 96             sqlite3_bind_int(Pstmt, 3, stu.gender);
 97             sqlite3_bind_double(Pstmt, 4, stu.math);
 98             sqlite3_bind_double(Pstmt, 5, stu.english);
 99             sqlite3_bind_double(Pstmt, 6, stu.chinese);
100             
101             //执行SQL语句
102             if(sqlite3_step(Pstmt) == SQLITE_DONE)
103             {
104                 return YES;
105             }
106         }
107         //清理结果集
108         sqlite3_finalize(Pstmt);
109         
110         //关闭数据库
111         sqlite3_close(_db);
112     }
113     return NO;
114 }
115 
116 //删除学生记录
117 -(BOOL)deleteStudentByName:(NSString *)name
118 {
119     NSString *sql = @"delete from student where name = ?";
120     
121     //打开数据库
122     if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK)
123     {
124         //准备结果集
125         sqlite3_stmt *Pstmt = NULL;
126         if(sqlite3_prepare_v2(_db, [sql UTF8String], -1, &Pstmt, NULL)== SQLITE_OK)
127         {
128             //绑定参数
129             sqlite3_bind_text(Pstmt, 1, [name UTF8String], -1, NULL);
130             
131             
132             //执行SQL语句
133             if(sqlite3_step(Pstmt) == SQLITE_DONE)
134             {
135                 return YES;
136             }
137         }
138         //清理结果集
139         sqlite3_finalize(Pstmt);
140         
141         //关闭数据库
142         sqlite3_close(_db);
143     }
144     return NO;
145 }
146 
147 //修改学生记录
148 -(BOOL)updateStudnet:(Student*)stu
149 {
150     NSString *sql = @"update student set math = ? where name = ?";
151     
152     //打开数据库
153     if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK)
154     {
155         //准备结果集
156         sqlite3_stmt *Pstmt = NULL;
157         if(sqlite3_prepare_v2(_db, [sql UTF8String], -1, &Pstmt, NULL) == SQLITE_OK)
158         {
159             //绑定参数
160             sqlite3_bind_double(Pstmt,1,stu.math);
161             sqlite3_bind_text(Pstmt, 2, [stu.name UTF8String], -1, NULL);
162             
163             //执行SQL语句
164             if(sqlite3_step(Pstmt) == SQLITE_DONE)
165             {
166                 return YES;
167             }
168         }
169         //清理结果集
170         sqlite3_finalize(Pstmt);
171         
172         //关闭数据库
173         sqlite3_close(_db);
174     }
175     return NO;
176 }
177 
178 //查询学生记录
179 //1.查询全部
180 -(NSArray *)queryStudentAll
181 {
182     NSMutableArray *arrayM = [NSMutableArray array];
183     
184     //打开数据库
185     if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK)
186     {
187         //准备结果集
188         sqlite3_stmt *Pstmt = NULL;
189         if(sqlite3_prepare_v2(_db, "select * from student", -1, &Pstmt, NULL) == SQLITE_OK)
190         {
191             //遍历结果集
192             while (sqlite3_step(Pstmt) == SQLITE_ROW)
193             {
194                 Student *stu = [Student new];
195                 
196                 stu.ID = sqlite3_column_int(Pstmt, 0);
197                 stu.name = [NSString stringWithFormat:@"%s",sqlite3_column_text(Pstmt, 1)];
198                 stu.age = sqlite3_column_int(Pstmt, 2);
199                 stu.gender = sqlite3_column_int(Pstmt, 3);
200                 stu.math = sqlite3_column_double(Pstmt, 4);
201                 stu.english = sqlite3_column_double(Pstmt, 5);
202                 stu.chinese = sqlite3_column_double(Pstmt, 6);
203                 
204                 [arrayM addObject:stu];
205             }
206         }
207         //清理结果集
208         sqlite3_finalize(Pstmt);
209         
210         //关闭数据库
211         sqlite3_close(_db);
212     }
213     return arrayM;
214 }
215 //2.查询符合条件的
216 -(Student *)queryStudentByName:(NSString*)name
217 {
218     Student *stu;
219     NSString *sql = @"select * from student where name = ?";
220     
221     //打开数据库
222     if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK)
223     {
224         //准备结果集
225         sqlite3_stmt *Pstmt = NULL;
226         if(sqlite3_prepare_v2(_db, [sql UTF8String], -1, &Pstmt, NULL) == SQLITE_OK)
227         {
228             //绑定参数
229             sqlite3_bind_text(Pstmt, 1, [name UTF8String], -1, NULL);
230             
231             //执行SQL语句
232             if(sqlite3_step(Pstmt) == SQLITE_ROW)
233             {
234                 stu = [Student new];
235                 
236                 stu.ID = sqlite3_column_int(Pstmt, 0);
237                 stu.name = [NSString stringWithFormat:@"%s",sqlite3_column_text(Pstmt, 1)];
238                 stu.age = sqlite3_column_int(Pstmt, 2);
239                 stu.gender = sqlite3_column_int(Pstmt, 3);
240                 stu.math = sqlite3_column_double(Pstmt, 4);
241                 stu.english = sqlite3_column_double(Pstmt, 5);
242                 stu.chinese = sqlite3_column_double(Pstmt, 6);
243             }
244         }
245         
246         //清理结果集
247         sqlite3_finalize(Pstmt);
248         
249         //关闭数据库
250         sqlite3_close(_db);
251     }
252     return stu;;
253 }
254 @end

 

ViewController.m

 1 #import "ViewController.h"
 2 #import "Student.h"
 3 #import "StudentDAO.h"
 4 
 5 @interface ViewController ()
 6 
 7 @end
 8 
 9 @implementation ViewController
10 
11 - (void)viewDidLoad {
12     [super viewDidLoad];
13     //测试stuDAO
14     //创建单例对象
15     StudentDAO *stuDAO = [StudentDAO shareManager];
16     
17     
18     //查询所有的记录
19     NSArray *students = [stuDAO queryStudentAll];
20     NSLog(@"%@",students);
21     
22     //删除一条记录
23     [stuDAO deleteStudentByName:@"stu3"];
24     
25     //修改记录
26     Student *stu = [Student new];
27     stu.name = @"stu4";
28     stu.math = 94.5f;
29     [stuDAO updateStudnet:stu];
30     
31     
32     //通过名字查询学生
33     Student *stu2 = [stuDAO queryStudentByName:@"stu5"];
34     NSLog(@"%@",stu2);
35     
36     //查询所有的记录
37     students = [stuDAO queryStudentAll];
38     NSLog(@"%@",students);
39 }
40 @end

 

 

转载于:https://www.cnblogs.com/XYQ-208910/p/4824713.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

吴恩达《机器学习》学习笔记四——单变量线性回归(梯度下降法)代码

吴恩达《机器学习》学习笔记四——单变量线性回归&#xff08;梯度下降法&#xff09;代码一、问题介绍二、解决过程及代码讲解三、函数解释1. pandas.read_csv()函数2. DataFrame.head()函数3. Dataframe.insert()函数课程链接&#xff1a; https://www.bilibili.com/video/BV…

从IoT World 2019看全球IoT九大发展趋势

来源&#xff1a;全球物联网观察美国时间5月14日&#xff0c;IoT World2019在美国硅谷圣克拉拉会议中心举行&#xff0c;今年的主题是“工业与IOT的交互”&#xff0c;从大会主题演讲内容和现场产品展示来看&#xff0c;随着5G的商用和人工智能技术的大面积落地&#xff0c;IoT…

TensorFlow实现单隐层神经网络

这里使用MNIST数据集&#xff0c;MNIST数据集的下载地址http://yann.lecun.com/exdb/mnist/ from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf mnist input_data.read_data_sets(r"D:\PycharmProjects\tensorflow\MNIST_data"…

美国一箭投放60颗卫星 马斯克组互联网“星链”

来源&#xff1a;新华网美国太空探索公司当地时间23日晚在美国佛罗里达州一处空军基地发射火箭&#xff0c;将60颗小卫星送入近地轨道。这标志着企业家埃隆马斯克组建互联网卫星群的“星链”项目迈出实质性一步&#xff0c;抢在电子商务巨头亚马逊公司创始人杰夫贝索斯的“柯伊…

Ubuntu 中Mysql 操作

一、mysql服务操作 0、查看数据库版本 sql-> status; 1、net start mysql //启动mysql服务 2、net stop mysql //停止mysql服务  3、mysql -h主机地址 -u用户名 &#xff0d;p用户密码 //进入mysql数据库 4、quit //退出mysql操作 5、mysqladmin -u用户名 -p旧密码 passwor…

吴恩达《机器学习》学习笔记五——逻辑回归

吴恩达《机器学习》学习笔记五——逻辑回归一、 分类&#xff08;classification&#xff09;1.定义2.阈值二、 逻辑&#xff08;logistic&#xff09;回归假设函数1.假设的表达式2.假设表达式的意义3.决策界限三、 代价函数1.平方误差函数的问题2.logistic回归的代价函数四、梯…

协方差与相关系数

定义&#xff1a; 协方差用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况&#xff0c;即当两个变量是相同的情况。 期望值分别为E[X]与E[Y]的两个实随机变量X与Y之间的协方差Cov(X,Y)定义为&#xff1a; 如果两个变量的变化趋势一致&#xff0c;也就是说如果其中一…

吴恩达《机器学习》学习笔记六——过拟合与正则化

吴恩达《机器学习》学习笔记六——过拟合与正则化一、 过拟合问题1.线性回归过拟合问题2.逻辑回归过拟合问题3.过拟合的解决二、 正则化后的代价函数1.正则化思想2.实际使用的正则化三、 正则化的线性回归1.梯度下降的情况2.正规方程的情况四、 正则化的逻辑回归1.梯度下降的情…

Swift - 数组排序方法(附样例)

下面通过一个样例演示如何对数组元素进行排序。数组内为自定义用户对象&#xff0c;最终要实现按用户名排序&#xff0c;数据如下&#xff1a; 1234var userList [UserInfo]()userList.append(UserInfo(name: "张三", phone: "4234"))userList.append(Use…

5G时代,智能工厂迎来4大改变!

来源&#xff1a;亿欧网作为新一代移动通信技术&#xff0c;5G技术切合了传统制造企业智能制造转型对无线网络的应用需求&#xff0c;能满足工业环境下设备互联和远程交互应用需求。在物联网、工业自动化控制、物流追踪、工业AR、云化机器人等工业应用领域&#xff0c;5G技术起…

主成分分析PCA以及特征值和特征向量的意义

定义&#xff1a; 主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#xff09;&#xff0c; 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量&#xff0c;转换后的这组变量叫主成分。PCA的思想是将n维特征映射到k维上…

吴恩达《机器学习》学习笔记七——逻辑回归(二分类)代码

吴恩达《机器学习》学习笔记七——逻辑回归&#xff08;二分类&#xff09;代码一、无正则项的逻辑回归1.问题描述2.导入模块3.准备数据4.假设函数5.代价函数6.梯度下降7.拟合参数8.用训练集预测和验证9.寻找决策边界二、正则化逻辑回归1.准备数据2.特征映射3.正则化代价函数4.…

需要自己调研的框架,以及需要学习的内容

_webView 图文解析需要学习 Core Text 来解决图文混合的xml文件 项目中用到哪些数据持久化&#xff0c;什么场景下使用&#xff1f; http://www.cocoachina.com/ios/20150720/12610.html 解决问题的网站 CSDN.NETCocoaChina51CTO技术论坛特酷吧国外it技术论坛stack overflow 需…

Python获得一篇文档的不重复词列表并创建词向量

获得一篇文档的不重复词列表&#xff1a; def loadDataSet():postingList [[my, dog, has, flea, problems, help, please],[maybe, not, take, him, to, dog, park, stupid],[my, dalmation, is, so, cute, I, love, him],[stop, posting, stupid, worthless, garbage],[mr,…

从认知学到进化论,详述强化学习两大最新突破

来源&#xff1a;大数据文摘深层强化学习&#xff08;deep RL&#xff09;近年来在人工智能方面取得了令人瞩目的进步&#xff0c;在Atari游戏、围棋及无限制扑克等领域战胜了人类。通过将表征学习与奖励驱动行为相结合&#xff0c;深层强化学习又引发了心理学和神经科学领域的…

Python实现一个数组除以一个数

如果直接用python的一个list除以一个数&#xff0c;会报错&#xff1a; a [1.0, 1.0, 1.0] c a/3 print(c) TypeError: unsupported operand type(s) for /: list and int 使用Numpy可以轻松做到&#xff1a; import numpy as npa np.array([1,1,1]) c a/3 print(c)

吴恩达《机器学习》学习笔记九——神经网络相关(1)

吴恩达《机器学习》学习笔记九——神经网络相关&#xff08;1&#xff09;一、 非线性假设的问题二、 神经网络相关知识1.神经网络的大致历史2.神经网络的表示3.前向传播&#xff1a;向量化表示三、 例子与直觉理解1.问题描述&#xff1a;异或XOR、同或XNOR2.单个神经元如何计算…

刚刚,科学家发现了一大堆解释人类进化的基因...

图片来源&#xff1a;《Nature Genetics》来源&#xff1a;中国生物技术网 5月27日发表在《Nature Genetics》上的一项新研究发现&#xff0c; 以前被认为在不同生物体中具有相似作用的数十种基因&#xff0c;实际上是人类独有的&#xff0c; 这或许有助于解释我们这个物种是如…

Android数据存储——SQLite数据库(模板)

本篇整合Android使用数据库&#xff0c;要保存一个实体类的样本。 首先看一下数据库语句&#xff1a; ORM:关系对象映射 添加数据&#xff1a; ContentValues values new ContentValues();values.put("name", "小丽");values.put("phone", &qu…

Python切分文本(将文本文档切分为词列表)

对于一个句子&#xff0c;一种简单的方法是使用split() a This is an apple. Do you like apple? b a.split() print(b) # [This, is, an, apple., Do, you, like, apple?] 可以看到切分结果不错&#xff0c;但标点符号也当成了词的一部分&#xff0c;可以使用正则表达式…