iOS:面向对象的思想使用sqlite数据库
*_db自己定义一个sqlite3的成员变量.进行增删改查时要用
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
#import <Foundation/Foundation.h> @interface Student : NSObject
@property (assign,nonatomic)NSInteger ID;
@property (copy,nonatomic)NSString *name;
@property (assign,nonatomic)NSInteger age;
@property (assign,nonatomic)char gender;
@property (assign,nonatomic)float math;
@property (assign,nonatomic)float english;
@property (assign,nonatomic)float chinese;
@end
Student.m
#import "Student.h" @implementation Student
-(NSString*)description
{
return [NSString stringWithFormat:@"ID:%ld,name:%@,age:%ld,gender:%c,math:%.2lf,english:%.2lf,chinese:%.2lf",_ID,_name,_age,_gender,_math,_english,_chinese];
}
@end
StudentDAO.h(对每一个实体类的数据库封装起来,就采用这种XXXDAO.h/m的命名风格)
#import <Foundation/Foundation.h>
#import <sqlite3.h>
@class Student;
@interface StudentDAO : NSObject
{
sqlite3 *_db;
}
//单例的方法
+(StudentDAO*)shareManager; //初始化数据库:创建表,添加数据
-(void)initDb; //添加学生记录
-(BOOL)addStudent:(Student *)stu; //删除学生记录
-(BOOL)deleteStudentByName:(NSString *)name; //修改学生记录
-(BOOL)updateStudnet:(Student*)stu; //查询学生记录
//1.查询全部
-(NSArray *)queryStudentAll;
//2.查询符合条件的
-(Student *)queryStudentByName:(NSString*)name; @end
StudentDAO.m
#import "StudentDAO.h"
#import "Student.h" static StudentDAO *instance = nil;
@implementation StudentDAO //对象只创建一次
+(StudentDAO*)shareManager
{
static dispatch_once_t once;
dispatch_once(&once, ^{
//只执行一次
instance = [StudentDAO new]; [instance initDb];
}); return instance;
} //执行不返回结果集的sql语句
-(BOOL)execSql:(NSString *)sql
{
char *errmsg = NULL;
//增删改操作
sqlite3_exec(_db, [sql UTF8String], NULL, NULL, &errmsg); if(errmsg)
{
return NO;
}
else
{
return YES;
}
}
//创建数据库文件路径
-(NSString*)pathForDB
{
NSArray *dirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [dirs lastObject]; //NSLog(@"%@",documentPath); return [documentPath stringByAppendingPathComponent:@"student.db"];
} //初始化数据库:创建表,添加数据
-(void)initDb
{
//打开数据库
//sqlite3_open(fileName.UTF8String,&_db);打开或创建一个数据
//*_db自己定义一个sqlite3的成员变量.进行增删改查时要用
if(sqlite3_open([[self pathForDB] UTF8String], &_db) == SQLITE_OK)
{
//创建学生表
if([self execSql:@"create table student (id integer primary key autoincrement,name text,age integer,gender integer,math real,english real,chinese real)"])
{
//表中添加测试数据
for(int i=; i<; i++)
{
Student *stu = [Student new];
stu.name = [NSString stringWithFormat:@"stu%d",i+];
stu.age = +i;
stu.gender = 'M';
stu.math = +i;
stu.english = +i;
stu.chinese = +i; [self addStudent:stu];
}
}
//关闭数据库
sqlite3_close(_db);
}
} //添加学生记录
-(BOOL)addStudent:(Student *)stu
{
NSString *insertSql = @"insert into student (name,age,gender,math,english,chinese) values(?,?,?,?,?,?)"; //打开数据库
if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK)
{
//准备结果集
//提取数据一次一条
sqlite3_stmt *Pstmt = NULL;
//查询前准备,看是否正确
if(sqlite3_prepare_v2(_db, [insertSql UTF8String], -, &Pstmt, NULL) == SQLITE_OK)
{
//绑定参数
sqlite3_bind_text(Pstmt, , [stu.name UTF8String], -, NULL);
sqlite3_bind_int(Pstmt, , (int)stu.age);
sqlite3_bind_int(Pstmt, , stu.gender);
sqlite3_bind_double(Pstmt, , stu.math);
sqlite3_bind_double(Pstmt, , stu.english);
sqlite3_bind_double(Pstmt, , stu.chinese); //执行SQL语句
if(sqlite3_step(Pstmt) == SQLITE_DONE)
{
return YES;
}
}
//清理结果集
sqlite3_finalize(Pstmt); //关闭数据库
sqlite3_close(_db);
}
return NO;
} //删除学生记录
-(BOOL)deleteStudentByName:(NSString *)name
{
NSString *sql = @"delete from student where name = ?"; //打开数据库
if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK)
{
//准备结果集
sqlite3_stmt *Pstmt = NULL;
if(sqlite3_prepare_v2(_db, [sql UTF8String], -, &Pstmt, NULL)== SQLITE_OK)
{
//绑定参数
sqlite3_bind_text(Pstmt, , [name UTF8String], -, NULL); //执行SQL语句
if(sqlite3_step(Pstmt) == SQLITE_DONE)
{
return YES;
}
}
//清理结果集
sqlite3_finalize(Pstmt); //关闭数据库
sqlite3_close(_db);
}
return NO;
} //修改学生记录
-(BOOL)updateStudnet:(Student*)stu
{
NSString *sql = @"update student set math = ? where name = ?"; //打开数据库
if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK)
{
//准备结果集
sqlite3_stmt *Pstmt = NULL;
if(sqlite3_prepare_v2(_db, [sql UTF8String], -, &Pstmt, NULL) == SQLITE_OK)
{
//绑定参数
sqlite3_bind_double(Pstmt,,stu.math);
sqlite3_bind_text(Pstmt, , [stu.name UTF8String], -, NULL); //执行SQL语句
if(sqlite3_step(Pstmt) == SQLITE_DONE)
{
return YES;
}
}
//清理结果集
sqlite3_finalize(Pstmt); //关闭数据库
sqlite3_close(_db);
}
return NO;
} //查询学生记录
//1.查询全部
-(NSArray *)queryStudentAll
{
NSMutableArray *arrayM = [NSMutableArray array]; //打开数据库
if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK)
{
//准备结果集
sqlite3_stmt *Pstmt = NULL;
if(sqlite3_prepare_v2(_db, "select * from student", -, &Pstmt, NULL) == SQLITE_OK)
{
//遍历结果集
while (sqlite3_step(Pstmt) == SQLITE_ROW)
{
Student *stu = [Student new]; stu.ID = sqlite3_column_int(Pstmt, );
stu.name = [NSString stringWithFormat:@"%s",sqlite3_column_text(Pstmt, )];
stu.age = sqlite3_column_int(Pstmt, );
stu.gender = sqlite3_column_int(Pstmt, );
stu.math = sqlite3_column_double(Pstmt, );
stu.english = sqlite3_column_double(Pstmt, );
stu.chinese = sqlite3_column_double(Pstmt, ); [arrayM addObject:stu];
}
}
//清理结果集
sqlite3_finalize(Pstmt); //关闭数据库
sqlite3_close(_db);
}
return arrayM;
}
//2.查询符合条件的
-(Student *)queryStudentByName:(NSString*)name
{
Student *stu;
NSString *sql = @"select * from student where name = ?"; //打开数据库
if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK)
{
//准备结果集
sqlite3_stmt *Pstmt = NULL;
if(sqlite3_prepare_v2(_db, [sql UTF8String], -, &Pstmt, NULL) == SQLITE_OK)
{
//绑定参数
sqlite3_bind_text(Pstmt, , [name UTF8String], -, NULL); //执行SQL语句
if(sqlite3_step(Pstmt) == SQLITE_ROW)
{
stu = [Student new]; stu.ID = sqlite3_column_int(Pstmt, );
stu.name = [NSString stringWithFormat:@"%s",sqlite3_column_text(Pstmt, )];
stu.age = sqlite3_column_int(Pstmt, );
stu.gender = sqlite3_column_int(Pstmt, );
stu.math = sqlite3_column_double(Pstmt, );
stu.english = sqlite3_column_double(Pstmt, );
stu.chinese = sqlite3_column_double(Pstmt, );
}
} //清理结果集
sqlite3_finalize(Pstmt); //关闭数据库
sqlite3_close(_db);
}
return stu;;
}
@end
ViewController.m
#import "ViewController.h"
#import "Student.h"
#import "StudentDAO.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
//测试stuDAO
//创建单例对象
StudentDAO *stuDAO = [StudentDAO shareManager]; //查询所有的记录
NSArray *students = [stuDAO queryStudentAll];
NSLog(@"%@",students); //删除一条记录
[stuDAO deleteStudentByName:@"stu3"]; //修改记录
Student *stu = [Student new];
stu.name = @"stu4";
stu.math = 94.5f;
[stuDAO updateStudnet:stu]; //通过名字查询学生
Student *stu2 = [stuDAO queryStudentByName:@"stu5"];
NSLog(@"%@",stu2); //查询所有的记录
students = [stuDAO queryStudentAll];
NSLog(@"%@",students);
}
@end
iOS:面向对象的思想使用sqlite数据库的更多相关文章
- 使用iOS原生sqlite3框架对sqlite数据库进行操作
摘要: iOS中sqlite3框架可以很好的对sqlite数据库进行支持,通过面向对象的封装,可以更易于开发者使用. 使用iOS原生sqlite3框架对sqlite数据库进行操作 一.引言 sqlit ...
- iOS学习36数据处理之SQLite数据库
1. 数据库管理系统 1> SQL语言概述 SQL: SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集, 是一种功能齐全的 ...
- php中用面向对象的思想编写mysql数据库操作类
最近刚入门完mysql,正好学了一阵子php就想着如何把mysql的表信息用php打印页面上.现在就把代码贴出来,以便小伙伴们参考. 先是建立mysql连接: /*建立连接*/ class datab ...
- android 43 SQLite数据库
SQLite数据库很小,占用内存只有几百K,安卓和IOS都是用的SQLite数据库. 页面: <LinearLayout xmlns:android="http://schemas.a ...
- QF——iOS中的数据库操作:SQLite数据库,第三方封装库FMDB,CoreData
SQLite数据库: SQLite是轻量级的数据库,适合应用在移动设备和小型设备上,它的优点是轻量,可移植性强.但它的缺点是它的API是用C写的,不是面向对象的.整体来说,操作起来比较麻烦.所以,一般 ...
- iOS中 FMDB第三方SQLite数据库 UI_20
1.什么是FMDB? FMDB是iOS平台下SQLite数据库,只不过它是OC方式封装了C语言的SQLite语句,使用起来更加面向对象 2.FMDB的优点:1.使用起来更加面向对象; 2.对比苹果自带 ...
- FMDB是iOS平台的SQLite数据库框架
1.FMDB简介 什么是FMDBFMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 为什么使用FMDB使用起来更加面向对象,省去了很多麻烦.冗余的C语言 ...
- Qt5 开发 iOS 应用之访问 SQLite 数据库
开发环境: macOS 10.12.1 Xcode 8.1 Qt 5.8 iPhone 6S+iOS 10.1.1 源代码: 我在 Qt 程序里指定了数据库的名称来创建数据库,在 Win10.An ...
- iOS - SQLite 数据库存储
1.SQLite 数据库 SQLite 是一种轻型的嵌入式数据库,安卓和 iOS 开发使用的都是 SQLite 数据库.它占用资源非常低,在嵌入式设备中,可能需要几百 K 的内存数据就够了.他的处理速 ...
随机推荐
- 2019.2.25 模拟赛T1【集训队作业2018】小Z的礼物
T1: [集训队作业2018]小Z的礼物 我们发现我们要求的是覆盖所有集合里的元素的期望时间. 设\(t_{i,j}\)表示第一次覆盖第i行第j列的格子的时间,我们要求的是\(max\{ALL\}\) ...
- Robot Framework + Selenium2Lib
Robot Framework + Selenium2Lib 最近一段时间,公司在推行自动化测试流程,本人有幸参与了自定义通用控件的关键字封装和脚本辅助编写.数据驱动管理.测试用例执行管理等一系列工具 ...
- lua常用函数
select (index, ···) 功能:当index为数字将返回所有index大于index的参数: 如:select(2,"a","b","c ...
- windows下重置mysql的root密码方法介绍(转)
自己在内网操作的,遇到了一些的问题,其中一个是需要重置密码的,所以网上找了两篇文章,都有一些借鉴的地方. 版本mysql5.7.2,linux系统 除了参考文章还有几点说明: service mysq ...
- STM32使用定时器实现输入捕获
输入捕获简介输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能. STM32的输入捕获,简单地说就是通过检测TIMx_CHx上的边沿信 ...
- scrapy抓取拉勾网职位信息(六)——反爬应对(随机UA,随机代理)
上篇已经对数据进行了清洗,本篇对反爬虫做一些应对措施,主要包括随机UserAgent.随机代理. 一.随机UA 分析:构建随机UA可以采用以下两种方法 我们可以选择很多UserAgent,形成一个列表 ...
- Linux下sublime的中文输入问题
比较久了,今天找到了解决方案: git clone https://github.com/lyfeyaj/sublime-text-imfix.git cd sublime-text-imfix &a ...
- Linux 自动化部署
1.pexpect Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Py ...
- ElasticSearch学习笔记--2、ES相关配置
1.配置文件 ES的配置文件位置:config/elasticsearch.yml可以直接搜索elasticsearch.yml 2.配置远程api访问 network.host: 192.168.1 ...
- poj 1984 并查集
题目意思是一个图中,只有上下左右四个方向的边.给出这样的一些边, 求任意指定的2个节点之间的距离. 就是看不懂,怎么破 /* POJ 1984 并查集 */ #include <stdio.h& ...