UISQLHanlder数据库的使用

数据库

今天给大家分享ios数据库的应用😳
说道数据库我们就要先说到单例,什么是单例呢???😳 你猜我猜不猜你猜不猜😂
好了,说正事,单例是ios中常用的一种设计模式,单例变量,简单的说就是在整个应用程序声明周期内只能有一个实例对象,这个对象只初始化一次,恩!差不多就这意思。。。
其实在ios程序开发中我们也有许多经常用到的单例。

  • 单例的例子:
    • [NSFileManager defaultManager];
    • [UIScreen mainScreen];
    • [UIApplication sharedApplication];
    • [NSOperationQueue mainQueue];
      说完单例我们接下来说说今天的主题,数据库。
      数据库在我们做项目的时候经常会用到,我们经常会把来自网络的数据存到本地的数据库中。
      代码部分:😳
  • 首先我们要简单的了解sql语句,我们只说最基础的几个要是想说的话太复杂了一时间说不完😳
    常用的sql语句有以下几个:
    创建表的语句:
// create table 表名(数据名 数据类型 设置主键, 数据名 数据类型)
create table student (id integer primary key, name text)

插入数据的语句:

// insert into 表名 values(上面创建表中数据按顺序给值)
insert into student values(1,'大宝宝');

删除数据的语句:

// delete from 表名 where 条件
delete from student where id = 1

更改数据的语句

update student set name='宇宙无敌超级大宝宝' where id=1

查询语句

// 查询表中的全部数据
select *from student

好,回到我们的开发代码当中

  • 创建一个数据库的类继承于NSObject 我这里命名为SQLHandler
  • 首先在SQLHandler.h文件中我们先搞些事情
  • 在SQLHandler.h文件中我们搞一个指针😳 并声明我们要用的方法详见代码
@interface SQLHandler : NSObject
{
    // 指向本地数据库的指针,保存的是数据库的内存地址.
    sqlite3 *DBPoint;
}
// 创建一个单例方法
// 单例方法一般都是 + 方法
+(SQLHandler *)shareInstance;

// 打开数据库方法
-(void)openDB;
// 关闭数据库方法
-(void)closeDB;
// 创建表的方法
-(void)createTable;
// 修改数据的方法
-(void)update;
// 插入数据的方法
-(void)insert:(Student *)stu;
// 查询所有数据的方法
-(NSArray *)selectedAll;
  • 然后到SQLHandler.m文件中搞事情😳
  • 创建一个单例方法
+(SQLHandler *)shareInstance {
    // 1.单例方法第一次调用,就会创建一个静态的指针变量,起始置空
    static SQLHandler *handler = nil;
    // 2.如果判断为空,说明是第一次执行,就创建对象。
    //   如果不为空,说明已经执行过,不要创建对象,可以直接使用
    if (handler == nil) {
        handler = [[SQLHandler alloc] init];
    }
    return handler;
}
  • 实现打开数据库的方法
// 获得documents文件夹地址,创建数据库文件地址
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *dbPath = [docPath stringByAppendingString:@"/test.db"];
    
    // 参数1:数据库保存地址
    // 参数2:数据库指针地址
    int result = sqlite3_open([dbPath UTF8String], &DBPoint);
    NSLog(@"%d", result);
    
    if (result == SQLITE_OK) {
        NSLog(@"数据库打开成功, %@", dbPath);
    } else {
        NSLog(@"数据库打开失败");
        
    }
  • 实现关闭数据库的方法
-(void)closeDB {
    
    int result = sqlite3_close(DBPoint);
    
    if (result == SQLITE_OK) {
        NSLog(@"数据库关闭成功");
    } else {
        NSLog(@"数据库关闭失败");
    }
}
  • 实现创建表的方法
-(void)createTable {
    
    // 创建表
    // 写sql语句
    NSString *sql = [NSString stringWithFormat:@"create table student (id integer primary key, name text)"];
    // 参数1:数据库指针地址
    // 参数2:sql语句
    int result = sqlite3_exec(DBPoint, [sql UTF8String], NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"创建表成功");
    } else {
        
        NSLog(@"创建表失败");
    }
    
}
  • 实现插入数据的方法
-(void)insert:(Student *)stu {
    
    NSString *sql = [NSString stringWithFormat:@"insert into student values(%ld, '%@')", stu.Id, stu.name];
    int result = sqlite3_exec(DBPoint, [sql UTF8String], NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"插入成功");
    } else {
        
        NSLog(@"插入失败");
    }
    
}
  • 实现删除数据的方法
-(void)delete {
    
    NSString *sql = [NSString stringWithFormat:@"delete from student where id=1"];
    
    int result = sqlite3_exec(DBPoint, [sql UTF8String], NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"删除成功");
    } else {
        NSLog(@"删除失败");
    }
    
}
  • 实现更改数据的方法
-(void)update {
    
    
    NSString *sql = [NSString stringWithFormat:@"update student set name='大宝宝' where id=2"];
    
    int result = sqlite3_exec(DBPoint, [sql UTF8String], NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"更新成功");
    } else {
        
        NSLog(@"更新失败");
    }
    
}
  • 重点:实现查询方法,需要创建一个student类属性为数据库中要存的数据
-(NSArray *)selectedAll {
    
    // 1.创建一个状态指针
    // stmt相当于一个临时数据库,负责暂时保存sql执行的结果。在结束时集中对数据库进行写入
    sqlite3_stmt *stmt = nil;
    
    // 2.sql语句
    NSString *sql = @"select * from student";
    
    // 3.执行sql语句,检查sql格式,将结果保存到stmt指针中
    
    // 参数3:sql语句的长度限制,-1为不限制
    // 参数4:stmt指针的地址
    int result = sqlite3_prepare_v2(DBPoint, [sql UTF8String], -1, &stmt, NULL);
    
    // 创建一个空数组,为了稍后添加student对象
    NSMutableArray *stuArr = [NSMutableArray array];
    
    if (result == SQLITE_OK) {
        
        // sqlite3_step 每次执行都取出一行数据,直到最后一条数据为止。
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            
            // 对每一行的数据进行分解,获取
            
            // 按列获取数据
            int Id = sqlite3_column_int(stmt, 0);
            
            const unsigned char *name = sqlite3_column_text(stmt, 1);
            
            // 使用上面的数据创建爱你student对象,放到数组中
            Student *stu = [[Student alloc] init];
            stu.Id = Id;
            stu.name = [NSString stringWithUTF8String:(char *)name];
            
            [stuArr addObject:stu];
        }
        
    }
    
    // 销毁stmt指针,回收内存,将变化写入本地数据库
    sqlite3_finalize(stmt);
    
    return [NSArray arrayWithArray:stuArr];
    
}

😳OK在SQLHanlder文件中搞完事情后我们就可以去我们的.ViewControll里去用我们的SQLHanlder类去调用我们的单例方法了,想其他的单例一样:[SQLHanlder shareInstance]

想要执行操作数据库只要调用方法就行了:

    [[SQLHandler shareInstance] openDB];
    
    [[SQLHandler shareInstance] createTable];
    
    Student *stu1 = [[Student alloc] init];
    stu1.name = @"宝宝";
    stu1.Id = 1;
    [[SQLHandler shareInstance] insert:stu1];
    
    Student *stu2 = [[Student alloc] init];
    stu2.name = @"大宝宝";
    stu2.Id = 2;
    [[SQLHandler shareInstance] insert:stu2];
    
    NSLog(@"%@", [[SQLHandler shareInstance]selectedAll]);
    
    
    [[SQLHandler shareInstance] update];

关于数据库的代码最基础的就这些了,希望能对宝宝们有一些帮助,本宝宝是程序猿一枚,想交流知识随时可以找我😳 本宝宝随时奉陪

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,966评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,170评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,909评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,959评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,851评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,583评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,956评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,590评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,878评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,892评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,719评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,501评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,957评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,124评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,440评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,003评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,211评论 2 339

推荐阅读更多精彩内容