zoukankan      html  css  js  c++  java
  • 本地存储Sqlite的用法:

    .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,代表只往后读一个字节,如果为负值,遇到特殊符号才会结束读取(00,u000)
        // 第四个参数: 伴随指针,会随着数据库的相关操作确定其中?的值
        // 第五个参数: 取值的时候取不全,剩下的值都存在这里
        int result = sqlite3_prepare(db, insertStr.UTF8String, -1, &stmt, NULL);
        // 判断执行结果
        if (result == SQLITE_OK) {
            //在操作成功的方法里进行?值的一些绑定设置
            // 第一个参数: 伴随指针
            // 第二个参数: ?的位置,从1开始
            // 第三个参数: 表示要插入的值
            // 第四个参数: 有正负之分,例如:1,代表只往后读一个字节,如果为负值,遇到特殊符号才会结束读取(00,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);
        
    }

  • 相关阅读:
    最长回文子串(马拉车)
    ubutun 启动/停止/重启MySQL数据库
    臭大佬_LZW
    Beauty Contest(求凸包最大直径)
    Smallest Bounding Rectangle(最小面积外接矩形)
    Triangle(求凸包最大内接三角形)
    P4196 [CQOI2006]凸多边形
    P4724 【模板】三维凸包(简洁)
    P2600 [ZJOI2008]瞭望塔【半平面交】
    退役记
  • 原文地址:https://www.cnblogs.com/leikun1113/p/5488122.html
Copyright © 2011-2022 走看看