数据库和之前的数据持久化要做的功能我觉得是基本一样的.但是我感觉数据库写的东西更加清晰,方便之后的使用,就是写起来比持久化的方法存入本地更费劲点,但是熟悉就好了(仅仅个人理解,如有不妥的地方欢迎批评指正).
为了保证当前的数据库是工程里的唯一的,用单例的方法去创建一个数据库工具对象(和之前数据持久化发现的问题一样,不用单例的话会发生之后创建的将之前的给覆盖掉,就像持久化里保存的一直是一个最新的内容一样)
创建一个继承于NSobject的dataBaseTool类
并且创建一个Student的类
定义属性:name,age(NSInteger),hobby,sex;
并且添加文件 libsqlite3.0.dylib !!!!!
//创建单例
+ (dataBaseTool *)shareDataBaseTool;
//同时在创建一个保存数据库地址的成员变量
{
sqlite3 *dbPoint;
}
在.m中写具体的内容
+ (dataBaseToll *)shareDataBaseTool
{
static dataBaseTool *tool;
static dispatch_once_t oneToken;
dispatch_once_(&onToken,^{
tool = [[dataBaseTool alloc]init];
});
return tool;
}
先打开数据库
在.h写
- (void)openDB;
- (void)openDB
{
//数据库文件也保持在沙盒的documents文件里,所以先找到沙盒路径
NSArray *sandBox = NSSearchPathForDirectorsInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *sandBoxPath = sandBox[0];
//拼接文件路径,如果系统根据这个路径查找的时候有对应文件,则直接打开数据库,如果没有则会去创建相应的数据库
NSString *document = [sandBoxPath stringByAppendingPathComponent:@"Student.sqlite"];
int reuslt = sqlite3_open([document UTF8String],&dbPoint);
if(result == SQLITE_OK){
NSLog(@"数据库打开成功");
NSLog(@"%@",document);
}else{
NSLog(@"数据库打开失败");
}
}
打开数据库之后里面是空的,我们得在其内创建一个table(类十余excl的东西)
在.h写
- (void)createTable;
- (void)createTable
{
//proimary key 是主键的意思,主键在当前表里数据是唯一的,不能重复的,可以唯一标示一条数据,一般是整数;
//autoincrement 自增,为了让主键不重复,会让主键采用自增的方式
//if not exists如果没有变才会创建,防止重复创建覆盖之前的数据
//数据库的问题90%是sql语句出问题,所以先保证语句有没有问题,再放到工程里使用,
NSString *sqlStr = @"create table if not exists stu(number integer primary key auto increment ,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
- (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语句
NSLog(@"%@",sqlStr);
int result = sqlite_exec(dbPoint,[sqlStr UT8String],nil,nil,nil);
if(result == SQLITE_OK){
NSLog(@"添加成功");
}else{
NSLog(@"添加失败");
}
}
更新学生数据
- (void)updateStu:(Student *)stu
{
NSString *sqlStr = [NSString stringWithFormat:@”update stu set sex = ‘%@’ , hobby = ‘%@’ , age = ‘%ld’ where name = ‘%@’” , stu.sex ,stu.hobby ,stu.age , stu.name];
//执行sql语句
int reuslt = sqlite3_exec(dbPoint,[sqlStr UTF8String],nil.nil,nil);
if (result == SQLITE_OK){
NSLog(@”更新成功”);
}else{
NSLog(@”更新失败”);
}
}
delegate删除数据,为物理删除,删除后无法恢复,一般不用
- (void)deleteStu:(Studegnt *)stu
{
NSString *sqlStr = [NSString stringWithFormat:@"delete from stu where sex = '%@'",stu.sex];
int reuslt = sqlite3_exec(dbPoint,[sqlStr UTF8String],nil,nil,nil);
if (result == SQLITE_OK){
NSLog(@"删除成功");
}else{
NSLog(@"删除失败");
}
}
查询数据库中所有学生表里的数据
- (NSMutableArray *)selectAllStu
{
//查询的逻辑
//1.先从本地的数据库中读取某张表里的所有数据
//2.然后逐条进行读取,对Model进行赋值,
//3.把已经赋值好的Model放到数组中去,并且返回;
NSString *sqlStr = @"select * from stu where name = '高高姐'";
//在语句中 *是通配符的意思,通过一个 * 相当于代替了表里的所有的字段名
//接下来需要定义一个跟随指针,它用来遍历数据库表中得每行数据
sqlite3_stmt = nil;
//第三个参数:-1 查询语句字数限制,-1 是没有限制
int reuslt = sqlite3_prepare_v2(dbPoint,[sqlStr UTF8String],-1,&stmt,nil);
//这个方法相当于把数据库和跟随指针相关联,一同完成查询的功能
//初始化一个数组来装学生数组
NSMutableArray *strArr = [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.sex = stuSex;
stu.age = stuAge;
stu.hobby = stuHobby;
[stuArr addObject:stu];
[stu release];
}
}else{
NSLog(@"查询失败");
}
}
还有一个关闭数据库 和开启一样.