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 的内存数据就够了.他的处理速 ...
随机推荐
- 第六章:加载或保存JSON数据
加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地存储需要序列化数据),交换数据最方便的就是使用JSON格式 – 大多 ...
- 将内存图像数据封装成QImage V2
转:http://www.cnblogs.com/bibei1234/p/3161555.html 如何将内存图像数据封装成QImage 当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行 ...
- Markdown 实现首行缩进
把输入法由半角改为全角. 两次空格之后就能够有两个汉字的缩进. 在开头的时候,先输入这个,然后紧跟着输入文本即可.分号也不要掉.
- 【3.16高一(第二学期)模拟测试】 T3,T4题解
看到这个标题我想你一定会想为什么小编只发T3,T4的题解,原因有很多:1)小编也不怎么会讲:2)小编搜遍各大OJ,都没有找到可以提交的地方:3)虽然给了测试数据,小编懒得一个一个试.如果你找到了测评网 ...
- Ubuntu系统安装网易云音乐、搜狗输入法
这两个软件都很良心,提供了Ubuntu版本,直接下载安装即可. 网易云音乐: 下载-打开-安装 http://music.163.com/#/download 搜狗拼音输入法 下载-打开-安装 htt ...
- 我的OI生涯 第四章
第四章 晚上来机房的人越来越多了,我也注意到一个常年独自坐在一个角落的男人————郝哥. 郝哥为人很安静,只是那时我还不知道他好不好,就没有与他交流过什么,这个优秀的男人以后我们还会提到,这里先不讲. ...
- [BZOJ1791][IOI2008]Island岛屿(环套树DP)
同NOI2013快餐店(NOI出原题?),下面代码由于BZOJ栈空间过小会RE. 大致是对每个连通块找到环,在所有内向树做一遍DP,再在环上做两遍前缀和优化的DP. #include<cstdi ...
- 【轮廓线DP】POJ2411-Mondriaan's Dream
今天美国的院士过来讲课XD以为会很无聊但是谜之好听,而且英语基本上都听懂了的样子♪(´▽`) 逃到图书馆来写解题报告 [题目大意] 给出一个m*n的方格,用2*1的骨牌覆盖有几种情况. [思路] 最基 ...
- Activity研究
ActivityManagerService 业务的整个逻辑关系被各种复杂的数据结构包裹着,因此对ActivityManagerService 的分析主要就是对各种数据结构的分析,明白了这些数据结构, ...
- 实战-130W表增加字段耗时
工作需要对130W的表增加字段,因为是操作线上数据库,所以提前在本地调查下耗时. 首先建表: CREATE TABLE `alter_cloumn_test` ( `id` int(11) unsig ...