http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 3276|回复: 7

[新手开发之旅] 【iOS新手开发之旅】原生数据库SQLite使用

[复制链接]
发表于 2018-12-12 14:03:52 | 显示全部楼层 |阅读模式
本帖最后由 竹林风 于 2018-12-14 12:16 编辑

  文章导航  

【iOS新手开发之旅】   http://www.sufeinet.com/thread-24000-1-1.html


概念

SQLite是一个轻量级的关系数据库。SQLite最初的设计目标是用于嵌入式系统,TA占用资源非常少,在嵌入式设备中,只需要几百K的内存就够了,目前应用于Android、iOS、Windows Phone等智能手机。iOS使用时SQLite,只需要加入libsqlite3.tbd依赖以及引入sqlite3.h头文件即可


82B4900C270EDD744B5469B6BD105AA1.jpg

输入关键字,点击add就可以了
F1C5E96A720AA26C7EBE3901C1FDC578.jpg

数据库的特征:

  • 以一定方式存储在一起
  • 能为多个用户共享
  • 具有尽可能少的冗余代码
  • 与程序彼此独立的数据集合

使用

创建一个类 MySqlite 来管理对数据库的操作

1.打开或创建数据库

[Objective-C] 纯文本查看 复制代码
- (void)openSqlite{
    
    //1.打开数据库(如果指定的数据库文件存在就直接打开,不存在就创建一个新的数据文件)
    //参数1:需要打开的数据库文件路径(iOS中一般将数据库文件放到沙盒目录下的Documents下)
    NSString *nsPath = [NSString stringWithFormat:@"%@/Documents/Person.db", NSHomeDirectory()];
    const char *path = [nsPath UTF8String];
    NSLog(@"sqlite path == %@",nsPath);
    //参数2:指向数据库变量的指针的地址
    //返回值:数据库操作结果
    int ret = sqlite3_open(path, &db);
    
    //判断执行结果
    if (ret == SQLITE_OK) {
        NSLog(@"打开数据库成功");
        if (![self isExistTable:@"student"]) {
            [self creatTable];
        }
    }else{
        NSLog(@"打开数据库失败");
    }
}


2.创建表 student

[Objective-C] 纯文本查看 复制代码
/**
 判断一张表是否已经存在
 @param tablename 表名
 */
- (BOOL)isExistTable:(NSString *)tablename{
    char *err;
    NSString *sql = [NSString stringWithFormat:@"SELECT COUNT(*) FROM sqlite_master where type= 'table' and name= '%@';",tablename];
    const char *sql_stmt = [sql UTF8String];
    if(sqlite3_exec(db, sql_stmt, NULL, NULL, &err) == 1){
        return YES;
    }else{
        return NO;
    }
    return NO;
}

- (void)creatTable{
    //1.设计创建表的sql语句
    const char * sql = "CREATE TABLE IF NOT EXISTS student(ID INTEGER PRIMARY KEY AUTOINCREMENT, num integer,name 'text', 'sex' 'text','age' integer);";
    
    //2.执行sql语句
    //通过sqlite3_exec方法可以执行创建表、数据的插入、数据的删除以及数据的更新操作;但是数据查询的sql语句不能使用这个方法来执行
    //参数1:数据库指针(需要操作的数据库)
    //参数2:需要执行的sql语句
    //返回值:执行结果
    int ret = sqlite3_exec(db, sql, NULL, NULL, NULL);
    
    //3.判断执行结果
    if (ret == SQLITE_OK) {
        NSLog(@"创建表成功");
    }else{
        NSLog(@"创建表失败");
    }
}


3.向表中插入一条数据

[Objective-C] 纯文本查看 复制代码
//添加数据
- (void)addStudent:(Student *)stu {
    
    //操作之前先打开数据库
    [self openSqlite];
    
    //1.准备sqlite语句
    NSString *sqlite = [NSString stringWithFormat:@"insert into student(num,name,age,sex) values (%@,'%@','%@','%@')",@(stu.num),stu.name,@(stu.age),stu.sex];
    //2.执行sqlite语句
    char *error = NULL;//执行sqlite语句失败的时候,会把失败的原因存储到里面
    int result = sqlite3_exec(db, [sqlite UTF8String], nil, nil, &error);
    if (result == SQLITE_OK) {
        NSLog(@"添加数据成功");
    } else {
        NSLog(@"添加数据失败 %s",error);
    }
    
    //    结束之后要记得关闭: 这一点很重要
    [self closeSqlite];
}


4.更新一条数据

[Objective-C] 纯文本查看 复制代码
//修改数据
- (void)updataWithStu:(Student *)stu {
    
    //操作之前先打开数据库
    [self openSqlite];
    
    //1.sqlite语句
    NSString *sqlite = [NSString stringWithFormat:@"update student set name = '%@',sex = '%@',age = '%ld' where num = '%ld'",stu.name,stu.sex,stu.age,stu.num];
    //2.执行sqlite语句
    char *error = NULL;//执行sqlite语句失败的时候,会把失败的原因存储到里面
    int result = sqlite3_exec(db, [sqlite UTF8String], nil, nil, &error);
    if (result == SQLITE_OK) {
        NSLog(@"修改数据成功");
    } else {
        NSLog(@"修改数据失败");
    }
    
    //    结束之后要记得关闭: 这一点很重要
    [self closeSqlite];
}


5.删除一条数据

[Objective-C] 纯文本查看 复制代码
//删除数据
- (void)delete:(Student*)stu {
    
    //操作之前先打开数据库
    [self openSqlite];
    
    //1.准备sqlite语句
    NSString *sqlite = [NSString stringWithFormat:@"delete from student where num = '%ld'",stu.num];
    //2.执行sqlite语句
    char *error = NULL;//执行sqlite语句失败的时候,会把失败的原因存储到里面
    int result = sqlite3_exec(db, [sqlite UTF8String], nil, nil, &error);
    if (result == SQLITE_OK) {
        NSLog(@"删除数据成功");
    } else {
        NSLog(@"删除数据失败%s",error);
    }
    
    //    结束之后要记得关闭: 这一点很重要
    [self closeSqlite];
}


6.查询数据

[Objective-C] 纯文本查看 复制代码
//查询所有数据
- (NSMutableArray*)selecAllStudent {
    
    [self openSqlite];
    NSMutableArray *array = [[NSMutableArray alloc] init];
    //1.准备sqlite语句
//    NSString *sqlite = [NSString stringWithFormat:@"select * from student"];
    char *sql = "select * from student";
    //2.伴随指针
    sqlite3_stmt *stmt = NULL;
    //3.预执行sqlite语句
//    int result = sqlite3_prepare_v2(db, sqlite.UTF8String, -1, &stmt, NULL);//第4个参数是一次性返回所有的参数,就用-1
    int result = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"查询成功");
        //4.执行n次
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            Student *stu = [[Student alloc] init];
            //从伴随指针获取数据,第1列
            int num = sqlite3_column_int(stmt, 1);
            stu.num = num;
            //从伴随指针获取数据,第2列
            stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)] ;
            //从伴随指针获取数据,第3列
            stu.sex = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 3)] ;
            //从伴随指针获取数据,第4列
            stu.age = sqlite3_column_int(stmt, 4);
            
            [array addObject:stu];
        }
    } else {
        NSLog(@"查询失败");
    }
    //5.关闭伴随指针
    sqlite3_finalize(stmt);
    //    结束之后要记得关闭: 这一点很重要
    [self closeSqlite];
    return array;
}


7.关闭数据库

[Objective-C] 纯文本查看 复制代码
#pragma mark - 4.关闭数据库
- (void)closeSqlite {
    
    int result = sqlite3_close(db);
    if (result == SQLITE_OK) {
        NSLog(@"数据库关闭成功");
    } else {
        NSLog(@"数据库关闭失败");
    }
}


我写了一个小例子:

2.gif

附件: Test-SQLite.zip (174.68 KB, 下载次数: 3)


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2018-12-12 14:33:46 | 显示全部楼层
iOS使用SQLite时遇到的一些问题
http://www.sufeinet.com/thread-24266-1-1.html
(出处: 苏飞论坛)
 楼主| 发表于 2018-12-12 14:05:16 | 显示全部楼层
需要注意的是我们的iOS程序中,一般情况下只有一个数据库,我们可以在数据库中创建多张表来保存不同的信息,但是千万不要创建多个数据库,每个数据库中只有一张表,因为不断的连接,关闭数据库是很耗性能的。
发表于 2018-12-12 14:27:30 | 显示全部楼层
我只是路过打酱油的。
发表于 2018-12-12 14:46:01 | 显示全部楼层
强烈支持楼主ing……
发表于 2018-12-12 16:50:17 | 显示全部楼层
强烈支持楼主ing……
发表于 2018-12-13 15:27:01 | 显示全部楼层
强烈支持楼主ing……
发表于 2018-12-15 14:04:57 | 显示全部楼层
真是难得给力的帖子啊。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-6-16 18:12

© 2014-2021

快速回复 返回顶部 返回列表