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 的内存数据就够了.他的处理速 ...
随机推荐
- 救济金发放(UVa133)
题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...
- 搭建 GIT 服务器
Git 是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 此实验以 CentOS 7.2 x64 的系统为环境,搭建 git 服务器. 安装依赖库和编译工具 为了后续安装能 ...
- bzoj 1102
思路:用dfs 会爆栈,巨坑,要用bfs. #include<bits/stdc++.h> #define LL long long #define fi first #define se ...
- Python基本语法[二]
Python基本语法 1.定义变量: 代码正文: x= y= z=x+y 代码讲解: 2.判断语句: 代码正文: score= : print("你真棒") print(&qu ...
- 牛客练习赛9 F - 珂朵莉的约数
题目描述 珂朵莉给你一个长为n的序列,有m次查询 每次查询给两个数l,r 设s为区间[l,r]内所有数的乘积 求s的约数个数mod 1000000007 输入描述: 第一行两个正整数n,m第二行一个长 ...
- angular4 动态Form中获取表单字段并在页面中使用的方法
主要有两种方式 第一种 使用get属性 页面中使用如下: 第二种 使用普通方法事件 页面中使用如下 *转载请附出处
- spring杂碎
spring优点 方便解耦,简化开发 Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理 AOP编程的支持 Spring提供面向切面编程,可以方便的实现对程序进行权限拦 ...
- Python 2.7.x 和 3.x 版本的语法区别
<__future__模块> Python 3.x引入了一些与Python 2不兼容的关键字和特性,在Python 2中,可以通过内置的__future__模块导入这些新内容.如果你希望在 ...
- BZOJ1087【状压DP】
题目链接[http://www.lydsy.com/JudgeOnline/problem.php?id=1087] 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击 ...
- [BZOJ1492][NOI2007]货币兑换Cash(斜率优化+CDQ分治)
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5838 Solved: 2345[Submit][Sta ...