Sqlite数据库

来源:互联网 发布:python exe 编辑:程序博客网 时间:2024/05/22 16:50

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

//注意 在使用之前要添加依赖库 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;@endstatic 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
原创粉丝点击