MesaSQLite数据库
2015-08-25 17:31
246 查看
dataBaseTool.h
#import <sqlite3.h>
#import "Student.h"
@interface dataBaseTool : NSObject
{//用来保存数据库对象的地址
sqlite3 *dbPoint;}
//为了保证当前数据库在工程里是唯一的,我们用单例的方式创建一个数据库工具对象
+ (dataBaseTool *)shareDataBaseTool;
//打开数据库
-(void)openDB;
//给数据库创建张表格,table
-(void)createTable;
//插入一个学生数据
-(void)insertStu:(Student *)stu;
//修改学生数据(更新表里的学生数据)
-(void)update:(Student *)stu;
//删除学生信息
-(void)delete:(Student *)stu;
//查询数据库中所有学生表里的数据
-(NSMutableArray *)selectAllStu;
//关闭数据库
-(void)closeDB;
dataBaseTool.m
//单例对象调用方法
+(dataBaseTool *)shareDataBaseTool{
static dataBaseTool *tool;
static dispatch_once_t oneToken;
dispatch_once(&oneToken, ^{
tool=[[dataBaseTool alloc] init];});
return tool;}
//打开数据库
-(void)openDB{
//数据库文件也保存在沙盒的documents文件里,所以先找沙盒路径
NSArray *arr=NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);
NSString *arrStr=arr[0];
//拼接文件路径,如果系统根据这个文件路径查找的时候有对应文件则直接打开数据库,如果空会创建一个数据库
NSString *path=[arrStr stringByAppendingPathComponent:@"Student.sqlite"];
int result=sqlite3_open([path UTF8String], &dbPoint);
if(result==SQLITE_OK){
NSLog(@"数据库打开成功");
NSLog(@"%@",path);
}else{
NSLog(@"数据库打开失败");}}
//创建表
-(void)createTable{
//primary key是主键的意思,主键在当前表里数据是唯一的,不能重复,可以唯一标示一条数据,一般是整数
//autoincrement自增,为了让主键不重复,会让逐渐采用自增的方式
//if not exists如果唯有表才会创建,防止重复创建覆盖之前的数据
//数据库问题90%是sql语句出问题,所以先保证语句没问题,在放到工程里使用
NSString *sqlStr=@"create table if not exists stu(number integer primary key autoincrement,name text,sex text,age integer,hobby text)";
//执行这条sql语句
int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);
if(result==SQLITE_OK){
NSLog(@"表创建成功");}
else{
NSLog(@"表创建失败");}}
//插入数据
-(void)insertStu:(Student *)stu{
//语句里值得为之要加上单引号
NSString *sqlStr=[NSString stringWithFormat:@"insert into stu (name,age,sex,hobby) values ('%@',%ld,'%@','%@') ",stu.name,stu.age,stu.sex,stu.hobby];
//执行sql语句
int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);
if(result==SQLITE_OK){
NSLog(@"插入成功");
}else{NSLog(@"插入失败");
}}
//更新数据
-(void)update:(Student *)stu{
NSString *sqlStr=[NSString stringWithFormat:@"update stu set name='%@',sex='%@',hobby='%@',age=%ld where number='6'",stu.name,stu.sex,stu.hobby,stu.age];
//执行sql语句
int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);
if(result==SQLITE_OK){
NSLog(@"更新成功");}else{
NSLog(@"更新失败");}}
-(void)delete:(Student *)stu{
NSString *sqlStr=[NSString stringWithFormat:@"delete from stu where name='%@'",stu.name];
int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);
if(result==SQLITE_OK){
NSLog(@"删除成功");}
else{
NSLog(@"删除失败");
}}
//查询数据
-(NSMutableArray *)selectAllStu{
//查询的逻辑
//1.先从本地的数据库中读取某张表里的所有数据
//2.然后逐条进行读取,对model进行赋值
//3.把已经赋值号的model放到数组中,并且返回
NSString *sqlStr=[NSString stringWithFormat:@"select * from stu where name='小王子'"];
//在语句里*是通配符的意思,通过一个*相当于代替了表里的所有的字段名
//接下来需要定义一个跟随指针,它用来遍历数据库表中的每一行数据
//第三个参数:查询语句字数限制,-1是没有限制
sqlite3_stmt *stmt=nil;
int result=sqlite3_prepare_v2(dbPoint, [sqlStr UTF8String], -1, &stmt, nil);
//这个方法相当于把数据库和跟随指针相关联,一同完成查询功能
//初始化一个用来装学生的数组
NSMutableArray *stuArr=[NSMutableArray array];
if(result==SQLITE_OK){
NSLog(@"查找成功");
//开始遍历查询数据库的每一行数据
while (sqlite3_step(stmt)==SQLITE_ROW) {
//让跟随指针进行遍历查询,如果没有行,才会停止循环
//满足条件,则逐列的读取内容
//第二个参数表示当前这一列数据在表的第几列
const unsigned char *name=sqlite3_column_text(stmt,1);
const unsigned char *sex=sqlite3_column_text(stmt, 2);
int age=sqlite3_column_int(stmt, 3);
const unsigned char *hobby=sqlite3_column_text(stmt, 4);
NSInteger stuAge=age;
NSString *stuName=[NSString stringWithUTF8String:(const char *)name];
NSString *stusex=[NSString stringWithUTF8String:(const char *)sex];
NSString *stuhobby=[NSString stringWithUTF8String:(const char *)hobby];
//给对象赋值,然后把对象放到数组里
Student *stu=[[Student alloc] init];
stu.name=stuName;
stu.hobby=stuhobby;
stu.sex=stusex;
stu.age=stuAge;
[stuArr addObject:stu];
[stu release];}}
else{NSLog(@"查找失败");}
return stuArr;}
//关闭数据库
-(void)closeDB{
//数据库文件也保存在沙盒的documents文件里,所以先找沙盒路径
NSArray *arr=NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);
NSString *arrStr=arr[0];
//拼接文件路径,如果系统根据这个文件路径查找的时候有对应文件则直接打开数据库,如果空会创建一个数据库
NSString *path=[arrStr stringByAppendingPathComponent:@"Student.sqlite"];
int result=sqlite3_close(dbPoint);
if(result==SQLITE_OK){
NSLog(@"数据库已经关闭");
NSLog(@"%@",path);
}else{NSLog(@"数据库无法关闭");}}
#import <sqlite3.h>
#import "Student.h"
@interface dataBaseTool : NSObject
{//用来保存数据库对象的地址
sqlite3 *dbPoint;}
//为了保证当前数据库在工程里是唯一的,我们用单例的方式创建一个数据库工具对象
+ (dataBaseTool *)shareDataBaseTool;
//打开数据库
-(void)openDB;
//给数据库创建张表格,table
-(void)createTable;
//插入一个学生数据
-(void)insertStu:(Student *)stu;
//修改学生数据(更新表里的学生数据)
-(void)update:(Student *)stu;
//删除学生信息
-(void)delete:(Student *)stu;
//查询数据库中所有学生表里的数据
-(NSMutableArray *)selectAllStu;
//关闭数据库
-(void)closeDB;
dataBaseTool.m
//单例对象调用方法
+(dataBaseTool *)shareDataBaseTool{
static dataBaseTool *tool;
static dispatch_once_t oneToken;
dispatch_once(&oneToken, ^{
tool=[[dataBaseTool alloc] init];});
return tool;}
//打开数据库
-(void)openDB{
//数据库文件也保存在沙盒的documents文件里,所以先找沙盒路径
NSArray *arr=NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);
NSString *arrStr=arr[0];
//拼接文件路径,如果系统根据这个文件路径查找的时候有对应文件则直接打开数据库,如果空会创建一个数据库
NSString *path=[arrStr stringByAppendingPathComponent:@"Student.sqlite"];
int result=sqlite3_open([path UTF8String], &dbPoint);
if(result==SQLITE_OK){
NSLog(@"数据库打开成功");
NSLog(@"%@",path);
}else{
NSLog(@"数据库打开失败");}}
//创建表
-(void)createTable{
//primary key是主键的意思,主键在当前表里数据是唯一的,不能重复,可以唯一标示一条数据,一般是整数
//autoincrement自增,为了让主键不重复,会让逐渐采用自增的方式
//if not exists如果唯有表才会创建,防止重复创建覆盖之前的数据
//数据库问题90%是sql语句出问题,所以先保证语句没问题,在放到工程里使用
NSString *sqlStr=@"create table if not exists stu(number integer primary key autoincrement,name text,sex text,age integer,hobby text)";
//执行这条sql语句
int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);
if(result==SQLITE_OK){
NSLog(@"表创建成功");}
else{
NSLog(@"表创建失败");}}
//插入数据
-(void)insertStu:(Student *)stu{
//语句里值得为之要加上单引号
NSString *sqlStr=[NSString stringWithFormat:@"insert into stu (name,age,sex,hobby) values ('%@',%ld,'%@','%@') ",stu.name,stu.age,stu.sex,stu.hobby];
//执行sql语句
int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);
if(result==SQLITE_OK){
NSLog(@"插入成功");
}else{NSLog(@"插入失败");
}}
//更新数据
-(void)update:(Student *)stu{
NSString *sqlStr=[NSString stringWithFormat:@"update stu set name='%@',sex='%@',hobby='%@',age=%ld where number='6'",stu.name,stu.sex,stu.hobby,stu.age];
//执行sql语句
int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);
if(result==SQLITE_OK){
NSLog(@"更新成功");}else{
NSLog(@"更新失败");}}
-(void)delete:(Student *)stu{
NSString *sqlStr=[NSString stringWithFormat:@"delete from stu where name='%@'",stu.name];
int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);
if(result==SQLITE_OK){
NSLog(@"删除成功");}
else{
NSLog(@"删除失败");
}}
//查询数据
-(NSMutableArray *)selectAllStu{
//查询的逻辑
//1.先从本地的数据库中读取某张表里的所有数据
//2.然后逐条进行读取,对model进行赋值
//3.把已经赋值号的model放到数组中,并且返回
NSString *sqlStr=[NSString stringWithFormat:@"select * from stu where name='小王子'"];
//在语句里*是通配符的意思,通过一个*相当于代替了表里的所有的字段名
//接下来需要定义一个跟随指针,它用来遍历数据库表中的每一行数据
//第三个参数:查询语句字数限制,-1是没有限制
sqlite3_stmt *stmt=nil;
int result=sqlite3_prepare_v2(dbPoint, [sqlStr UTF8String], -1, &stmt, nil);
//这个方法相当于把数据库和跟随指针相关联,一同完成查询功能
//初始化一个用来装学生的数组
NSMutableArray *stuArr=[NSMutableArray array];
if(result==SQLITE_OK){
NSLog(@"查找成功");
//开始遍历查询数据库的每一行数据
while (sqlite3_step(stmt)==SQLITE_ROW) {
//让跟随指针进行遍历查询,如果没有行,才会停止循环
//满足条件,则逐列的读取内容
//第二个参数表示当前这一列数据在表的第几列
const unsigned char *name=sqlite3_column_text(stmt,1);
const unsigned char *sex=sqlite3_column_text(stmt, 2);
int age=sqlite3_column_int(stmt, 3);
const unsigned char *hobby=sqlite3_column_text(stmt, 4);
NSInteger stuAge=age;
NSString *stuName=[NSString stringWithUTF8String:(const char *)name];
NSString *stusex=[NSString stringWithUTF8String:(const char *)sex];
NSString *stuhobby=[NSString stringWithUTF8String:(const char *)hobby];
//给对象赋值,然后把对象放到数组里
Student *stu=[[Student alloc] init];
stu.name=stuName;
stu.hobby=stuhobby;
stu.sex=stusex;
stu.age=stuAge;
[stuArr addObject:stu];
[stu release];}}
else{NSLog(@"查找失败");}
return stuArr;}
//关闭数据库
-(void)closeDB{
//数据库文件也保存在沙盒的documents文件里,所以先找沙盒路径
NSArray *arr=NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);
NSString *arrStr=arr[0];
//拼接文件路径,如果系统根据这个文件路径查找的时候有对应文件则直接打开数据库,如果空会创建一个数据库
NSString *path=[arrStr stringByAppendingPathComponent:@"Student.sqlite"];
int result=sqlite3_close(dbPoint);
if(result==SQLITE_OK){
NSLog(@"数据库已经关闭");
NSLog(@"%@",path);
}else{NSLog(@"数据库无法关闭");}}
相关文章推荐
- oracle根据pid查询出正在执行的执行语句
- 在Oracle中查询表的大小、表的占用情况和表空间的大小
- oracle根据pid查询出正在执行的执行语句
- mysql-cluster数据自动修复(节点崩溃期间写入其他节点数据)
- oracle10g数据库管理艺术
- 正确使用MySQL update语句
- 利用SQL语句查找某数据库中所有存储过程包含的内容(转)
- mysql日期用法
- MYSQL 不依赖其他表构建日期范围内的连续月份或日期
- 【未解决】DB2数据库数据的导出导入
- Mysql数据库使用
- 正确使用MySQL INSERT INTO语句
- postgreSQL插入语句返回主键
- oracle日期时间段查询遇到问题to_date ora-01847 day of month must be between 1 and last day of month
- Sqlite学习笔记(11)-API(2)
- Sqlite学习笔记(10)-API(1)
- 安装二进制软件包的mysql出现 error while loading shared libraries: libaio.so.1:
- Redis 持久化数据方式 RDB AOF
- SQLite3查询表结构
- 数据库事物隔离级别通俗理解