.h文件声明:

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

//打开数据库
- (void)openDB;
// 关闭数据库
- (void)closeDB;
// 创建表
- (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;
====================================== .m 实现

// 引入数据库操作的头文件
#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)openDB
{
    //打开数据库,使用int去接受打开的结果
    //第一个参数: filename代表数据库的存储路径
    //第二个参数: 二级指针,数据库的地址
    int result = sqlite3_open([self.dbPath UTF8String], &db);
    //result是个枚举值,有很多种情况
    if (result == SQLITE_OK) {
        NSLog(@"数据库打开成功");
    } else {
        NSLog(@"数据库打开失败");
    }
}

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

// 创建一个表
- (void)createTable
{
    // 创建一个person表,字段: uid integer类型主键 自增 不能为空, name text类型,gender text类型,age integer类型
     NSString *createStr = @"create table if not exists 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 = %@", self.dbPath);

}

// 插入数据
- (void)insertName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age
{
    //当values不确定的情况下使用?代替,之后会进行其绑定的过程
    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语句执行完毕
        // 执行伴随指针,根据伴随指针的情况判定是否插入成功[SQLITE_DONE代表伴随指针执行数据成功]
        if (sqlite3_step(stmt) == SQLITE_DONE) {
            NSLog(@"插入成功");
        } else {
            NSLog(@"插入失败");
        }
        
    } else {
        
        NSLog(@"result = %d", result);
    }
    // 一定要释放伴随指针
    sqlite3_finalize(stmt);
    
}

// 通过uid去更新数据
- (void)updateWithUID:(NSInteger)uid
{
    NSString *updateStr = @"update person set name = '悟空' where uid = ?";
    // 预执行语句
    //伴随指针
    sqlite3_stmt *stmt = nil;
    
    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);
}

// 通过uid去删除数据
- (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循环
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            // 第一个参数: 伴随指针
            // 第二个参数: 代表这个字段的位置[只有带? 的是从1开始,其余所有都是从0开始]
            int uid = sqlite3_column_int(stmt, 0);
            NSLog(@"uid = %d", uid);
            //在OC代码中要使用C语言的相关内容应该使用UTF8String
            NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
            NSLog(@"name = %@", name);
            NSString *gender = [NSString stringWithUTF8String:(const char *) sqlite3_column_text(stmt, 2)];
            NSLog(@"gender = %@", gender);
            int age = sqlite3_column_int(stmt, 3);
            NSLog(@"age = %d", age);
            
        }
    } else {
        NSLog(@"result = %d", result);
    }
    
    sqlite3_finalize(stmt);
    
}

// 根据名字去查找相关的数据信息
- (void)searchWithName:(NSString *)name
{
    NSString *selectStr = @"select uid,gender,age from person where name = ?";
    
    sqlite3_stmt *stmt = nil;
    
    int result = sqlite3_prepare(db, selectStr.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(@"++++uid = %d,gender = %@,age = %d",uid,gender,age);
        }
    }
    
    sqlite3_finalize(stmt);
    
}

转载于:https://www.cnblogs.com/leikun1113/p/5488122.html

本地存储Sqlite的用法:相关推荐

  1. 本地存储localStorage的用法总结

    一.什么是localStorage? 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cook ...

  2. 【JS缓存技术】-本地存储

    JS缓存技术-本地存储 本地存储 window.sessionStorage window.localStorage 记住用户名案例 本地存储 window.sessionStorage 用法示例: ...

  3. C#数据本地存储方案之SQLite

    即使是做网络应用,在断线情况下,也需要考虑数据的本地存储.在SQLite出现之前,数据量大的情况下,我们一直使用ACCESS,数据量小,则文件存储.ACCESS不支持事务原子性,在断电情况下(这种情况 ...

  4. C#数“.NET研究”据本地存储方案之SQLite

    即使是做网络应用,在断线情况下,也需要考虑数据的本地存储.在SQLite出现之前,数据量大的情况下,我们一直使用ACCESS,数据量小,则文件存储.ACCESS不支持事务原子性,在断电情况下(这种情况 ...

  5. Vue本地存储及用法

    目录 1.本地存储是什么? 2.本地存储的应用场景 3.存储的使用 4. 练习用法 1.本地存储是什么? 以文件的方式存储在本地,通过把数据存在浏览器中,用户不必每次都向服务器请求 获取同一个信息.在 ...

  6. 本地存储localStorage用法详解

    一.什么是localStorage? 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cook ...

  7. java localstorage_本地存储localStorage用法详解

    一.什么是localStorage? 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cook ...

  8. localStorage本地存储的用法

    localStorage.getItem(key):获取指定key本地存储的值 localStorage.setItem(key,value):将value存储到key字段 localStorage. ...

  9. android模拟器的数据存放,Android模拟器在哪里存储SQLite数据库?

    Android模拟器在哪里存储SQLite数据库? 我正在开发一个将数据存储在SQLite数据库中的Android应用程序. 我的问题是,当您使用模拟器时,此数据库文件存储在文件系统中的哪个位置? 我 ...

  10. iOS开发-------Sqlite3实现本地存储简易通讯录

    最近几天整了下Sqlite3,也就是iOS的另外一种储存方式,那么coreData是有什么不足么,不是,一般数据比较简易的时候是不会用coreData的,反而会用自身的sqlte3来实现本地的存储,这 ...

最新文章

  1. C#时间格式化(Datetime)用法详解
  2. 每日一皮:这个不要轻易尝试,执行有生命危险
  3. uboot移植9个步骤_不知道具体的新房装修步骤?9个步骤教你吃透装修
  4. python中比较运算符怎么使用_实例说明Python中比较运算符的使用
  5. Robot Framework自动化测试(一)--- 安装
  6. 第一次CODING附parentElement.insertBefore使用详解
  7. Fixjs——显示基类DisplayObject
  8. Illustrator中文版教程,如何在 Illustrator 中添加文字?
  9. matlab引擎下载,安装用于 Python 的 MATLAB 引擎 API
  10. 显示器黑屏的原因解析及解决方法
  11. day12 函数高级
  12. 自然语言处理和python_Python与自然语言处理搭建环境
  13. win10红警遇到的各种问题
  14. html奇偶选择器,css奇偶后代选择器
  15. 官方scratch3.0正式发布,全面支持移动设备在线编程!
  16. 安卓隐藏摄像_隐藏拍摄app
  17. 如何用C语言对文件进行简单加密
  18. BUUCTF MISC刷题笔记(一)
  19. 简单介绍API分类接口
  20. java极光推送实例

热门文章

  1. ajax基本概念,方法
  2. Git详解之二 Git基础(第二部分)
  3. 我的电脑能装苹果吗?
  4. 搭建Open××× Server路由模式、证书认证
  5. VS2008 + WDK 配置 及其编译错误
  6. 选择排序(C++/Java实现)
  7. Oracle 进程 说明
  8. 【接口测试】axios测试接口
  9. javascript_11-函数面试题
  10. # heapsort