您的位置:首页 > 数据库

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(@"数据库无法关闭");}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: