数据库

数据库和之前的数据持久化要做的功能我觉得是基本一样的.但是我感觉数据库写的东西更加清晰,方便之后的使用,就是写起来比持久化的方法存入本地更费劲点,但是熟悉就好了(仅仅个人理解,如有不妥的地方欢迎批评指正).

为了保证当前的数据库是工程里的唯一的,用单例的方法去创建一个数据库工具对象(和之前数据持久化发现的问题一样,不用单例的话会发生之后创建的将之前的给覆盖掉,就像持久化里保存的一直是一个最新的内容一样)

创建一个继承于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(@"查询失败");
    }
}

还有一个关闭数据库 和开启一样.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值