Sqlite数据库

这里我把数据库做成了单例 方便使用

//注意 在使用之前要添加依赖库 libsqlite3.0tbd

在.h里主要写暴露给外部的方法 代码如下:

@interface DataBaseHandle : NSObject
// 把这个类写成单例 方便外部使用
+ (DataBaseHandle *)shareDataBaseHandle;

//打开数据库
- (void)openDataBase;
//关闭数据库
- (void)closeDataBase;
//创建表
- (void)createTable;
//插入数据
- (void)insertName:(NSString *)name
            gender:(NSString *)gender
               age:(NSInteger)age;
//通过uid去更新数据
- (void)updateWithUID:(NSInteger)uid;
//根据uid去删除数据
- (void)deleteWithUID:(NSInteger)uid;
//查找所有数据
- (void)searchAll;
//根据名字去查找相关的数据信息
- (void)searchWithName:(NSString *)name;
@end

在.m实现相关方法 (这里没用到 第三方 sql语句写的可能比较繁琐)

#import "DataBaseHandle.h"
#import <sqlite3.h>
@interface DataBaseHandle()
///数据库的存储路径
@property (nonatomic, copy) NSString *dbPath;
@end
static DataBaseHandle *dataBase = nil;
@implementation DataBaseHandle
+ (DataBaseHandle *)shareDataBaseHandle {
    if (dataBase == nil) {
        dataBase = [[DataBaseHandle alloc] init];
    }
    return dataBase;
}
//懒加载需要给数据库路径赋值
- (NSString *)dbPath {
    if (_dbPath == nil) {
        // 需求:路径存储在Documents文件夹下,数据库文件为person.sqlite
        NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        _dbPath = [documentPath stringByAppendingPathComponent:@"person.sqlite"];
    }
    return _dbPath;
}
//好多地方都会使用到数据库 所以初始化一个数据库的静态变量
static sqlite3 *db = nil;
- (void)openDataBase {
    //打开数据库 使用int去接收打开的结果
    //第一个参数:filename 代表数据库的存储路径
    //第二个参数 二级指针 数据库的地址
    int result = sqlite3_open([self.dbPath UTF8String], &db);
    //result 是个枚举值 有很多种情况
    if (result == SQLITE_OK) {
        NSLog(@"数据库打开成功");
    } else {
        NSLog(@"数据库打开失败");
    }

}

- (void)closeDataBase {
    int result = sqlite3_close(db);
    if (result == 0) {
        NSLog(@"数据库关闭成功");
    } else {
        NSLog(@"数据库关闭失败");
    }
}

- (void)createTable {
    //创建一个person表 字段:uid integer类型 主键 自增 不能为空,name text类型,gender text类型,age integer类型
    NSString *createStr = @"create table person(uid integer primary key autoincrement not null, name text, gender text, age integer)";
    //第一个参数:数据库
    //第二个参数 sql语句 需要进行编码
    //第三个参数 结果回调的一个函数
    //第四个参数 回调函数的一个参数
    int result = sqlite3_exec(db, [createStr UTF8String], NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"创建成功");
    } else {
        NSLog(@"创建失败");
    }
    NSLog(@"%@", _dbPath);
}

- (void)insertName:(NSString *)name
            gender:(NSString *)gender
               age:(NSInteger)age {

    NSString *insertStr = @"insert into person(name, gender, age)values(?, ?, ?)";
    sqlite3_stmt *stmt = nil;
    //预执行语句
    //第一个参数 数据库
    //第二个参数 sql语句
    //第三个参数 有正负之分 例如:1代表只往后读一个字节  如果为负 遇到特殊符号才会结束读取(\000,u000)
    //第四个参数 伴随指针 会随着数据库的相关操作确定其中?的值
    //第五参数 取值的时候取的不全 剩下的值都存在这里
    int result = sqlite3_prepare(db, insertStr.UTF8String, -1, &stmt, NULL);
    //判断执行结果
    if (result == SQLITE_OK) {
        //在操作成功的方法里进行?值的一些绑定设置
        //第一个参数 伴随指针
        //第二个参数 ?位置 从1开始
        //第三个参数 表示要插入的值
        //第四个值 有正负之分 例如:1代表只往后读一个字节  如果为负 遇到特殊符号才会结束读取(\000,u000)
        sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
        sqlite3_bind_text(stmt, 2, gender.UTF8String, -1, NULL);
        sqlite3_bind_int64(stmt, 3, age);
        //sql语句执行完毕
        //执行伴随指针 根据伴随指针的情况判定是否插入成功
        if (sqlite3_step(stmt) == SQLITE_DONE) {
            NSLog(@"插入成功");
        } else {
            NSLog(@"插入失败");

        }
    }else {
        NSLog(@"result = %d", result);
    }
    //一定要释放伴随指针
    sqlite3_finalize(stmt);
}

- (void)updateWithUID:(NSInteger)uid {
    sqlite3_stmt *stmt = nil;
    NSString *updateStr = @"update person set name = '悟空' where uid = ?";
    int result = sqlite3_prepare(db, updateStr.UTF8String, -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        sqlite3_bind_int64(stmt, 1, uid);
        if (sqlite3_step(stmt) == SQLITE_DONE) {
            NSLog(@"跟新数据成功");
        } else {
            NSLog(@"更新数据失败");
        }
    } else {
        NSLog(@"result = %d", result);
    }
    sqlite3_finalize(stmt);

}

- (void)deleteWithUID:(NSInteger)uid {
    NSString *deleteStr = [NSString stringWithFormat:@"delete from person where uid = %ld", uid];
    int result = sqlite3_exec(db, deleteStr.UTF8String, NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"删除成功");
    } else {
        NSLog(@"删除失败");
    }
}

- (void)searchAll {
    NSString *searchAllStr = @"select *from person";
    sqlite3_stmt *stmt = nil;
    //预执行
    int result = sqlite3_prepare(db, searchAllStr.UTF8String, -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        //查询数据的时候不知道有少次的时候使用while循环
        //sqlite3_step(stmt) == SQLITE_ROW 代表逐行执行数据
        while (sqlite3_step(stmt) == SQLITE_ROW ) {
            //第一个参数 伴随指针
            //第二个参数 代表这个字段的位置【只有带?的是从1开始 其余的所有都是从0开始】
            int uid = sqlite3_column_int(stmt, 0);

        NSString *name = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(stmt, 1)];
        NSString *gender = [NSString stringWithUTF8String:(const char*) sqlite3_column_text(stmt, 2)];
        int age = sqlite3_column_int(stmt, 3);
            NSLog(@"%d, %@, %@, %d", uid, name, gender, age);
        }

    }else {
        NSLog(@"result = %d", result);
    }
    sqlite3_finalize(stmt);
}

- (void)searchWithName:(NSString *)name {
    NSString *searchStr = @"select uid, gender, age from person where name = ?";
    sqlite3_stmt *stmt = nil;
    int result = sqlite3_prepare(db, searchStr.UTF8String, -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            int uid = sqlite3_column_int(stmt, 0);
            NSString *gender = [NSString stringWithUTF8String:(const char*) sqlite3_column_text(stmt, 1)];
            int age = sqlite3_column_int(stmt, 2);

            NSLog(@"%d, %@, %d", uid, gender, age);

        }
    } else {
        NSLog(@"result = %d", result);
    }
    sqlite3_finalize(stmt);


}

当需要用到数据库存储数据的时候就可以引入 然后调用相应的方法了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值