zoukankan      html  css  js  c++  java
  • iOS- SQLite3的基本使用

    iOS- 简单说说iOS移动客户端SQLite3的基本使用
     1.为什么要使用SQLite3?                    
     
    •大量数据需要存储
    •管理数据,存储数据
     
    SQLite是一种关系型数据库(也是目前移动客户端的主流数据库)
     
     
    2.SQLite3的几种存储类型                    
     
     
    a.NULL: 表示该值为NULL值
    b.INTEGER: 无符号整型值
    c.REAL: 浮点值
    d.TEXT: 文本字符串
    e.BLOB: 二进制数据(比如文件)
     
    •实际上SQLite是无类型的,建表时声明或不声明类型都可以,也就意味着创表语句可以这么写:
    create table t_student(name, age);
     
    但为了保持良好的编程规范,方便程序员之间的交流,编写建表语句的时候最好加上每个字段的具体类型
     
     
    3.SQLite3的具体实现                      
     
    3.1                                          
     
    •在iOS中要使用SQLite3,需要添加库文件:libsqlite3.dylib并导入主头文件,这是一个C语言的库
     
    3.2                                          
     
    创建数据库(sqlite3_opendb)
     
    复制代码
     1 // 设置沙盒中的文件路径
     2     // 提示:在自己开发中,不要用.db结尾的sqlite数据库文件名
     3     NSString *dbPath = [@"readme.db" appendDocumentDir];
     4     NSLog(@"%@", dbPath);
     5     
     6     /**
     7      sqlite3_open
     8      
     9      1) 如果数据库存在,直接打开
    10      2) 如果数据库不存在,先创建数据库文件,再打开
    11      */
    12     _db = NULL;
    13     
    14     if (SQLITE_OK == sqlite3_open([dbPath UTF8String], &_db)) {
    15         NSLog(@"数据库打开成功");
    16     } else {
    17         NSLog(@"数据库打开失败");
    18     }
    复制代码
     
     
     
     
    3.3                                            
     
    1.单步执行操作(sqlite3_exec)
    复制代码
    #pragma mark 单步执行SQL
    - (void)execSQL:(NSString *)sql message:(NSString *)message
    {
        // 执行SQL语句
     
        char *errmsg = NULL;
        if (SQLITE_OK == sqlite3_exec(_db, [sql UTF8String], NULL, NULL, &errmsg)) {
            NSLog(@"%@成功!", message);
        } else {
            // C语言中字符串输出应该用%s
            NSLog(@"%@失败 - %s", message, errmsg);
        }
    }
    复制代码
     
     
     
    2.创建数据表
    复制代码
    1     // 1. 检查沙盒,判断数据库文件是否存在,如果存在就不再建表;
    2     // 2. 数据库的方法:IF NOT EXISTS,放在表名之前即可
    3     // 定义SQL语句
    4     NSString *sql = @"CREATE TABLE IF NOT EXISTS T_Person (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT, gender INTEGER, age INTEGER, height REAL)";
    6     [self execSQL:sql message:@"创建数据表"];
    复制代码
     
     
     
    4.插入数据
    1     // 1. SQL
    2     NSString *sql = [NSString stringWithFormat:@"INSERT INTO T_Person (name, gender, age, height) VALUES ('%@', %d, %d, %f)", person.name, person.gender, person.age, person.height];
    3     
    4     [self execSQL:sql message:@"新增个人记录"];
     
     
    5.更新数据
    复制代码
    1 //修改
    2 - (void)updatePerson:(Person *)person{
    3     
    4     
    5     NSString *sql = [NSString stringWithFormat:@"update t_Person set name = '%@' where id=%d",person.name,person.ID];
    6     
    7     [self execSQL:sql msg:@"修改"];
    9 }
    复制代码
     
     
    6.删除数据
    复制代码
    1 //删除
    2 - (void)removePerson:(NSInteger)personID{
    3     
    4     
    5     NSString *sql = [NSString stringWithFormat:@"delete from t_Person where id=%d",personID];
    6     
    7     [self execSQL:sql msg:@"删除"];
    9 }
    复制代码
     
     
    7.查询操作
    –sqlite3_prepare_v2检查sql的合法性
    –sqlite3_step逐行获取查询结果
    –sqlite3_coloum_xxx获取对应类型的内容
    –sqlite3_finalize释放stmt
    复制代码
     1  // 1. SQL
     2     NSString *sql = @"SELECT id, name, age, gender, height FROM T_Person";
     3     
     4     // 2. 查询语句通常是使用字符串拼接出来的
     5     // 因此,在正常使用查询语句之前,需要检查SQL语句的语法正确!
     6     sqlite3_stmt *stmt = NULL;
     7     
     8     if (SQLITE_OK == sqlite3_prepare_v2(_db, [sql UTF8String], -1, &stmt, NULL)) {
     9         NSLog(@"语法正确");
    10         // 利用句柄,逐一查询符合条件的数据
    11         // sqlite3_step 每次提取一条查询的记录行,不断重复,一直取到最后一条记录位置
    12         while (SQLITE_ROW == sqlite3_step(stmt)) {
    13             // 取到行信息,逐一获取每一列的内容
    14             // iCol对应的就是SQL语句中字段的顺序,从0开始
    15             // 根据实际查询字段的属性,使用sqlite3_column_xxx取得对应的内容即可
    16             int ID = sqlite3_column_int(stmt, 0);
    17             const unsigned char *name = sqlite3_column_text(stmt, 1);
    18             int age = sqlite3_column_int(stmt, 2);
    19             int gender = sqlite3_column_int(stmt, 3);
    20             CGFloat height = sqlite3_column_double(stmt, 4);
    21             
    22             // const unsigned char *直接输出看不出结果,需要转换
    23             NSString *nameUTF8 = [NSString stringWithUTF8String:(const char *)name];
    24             
    25             Person *p = [Person personWithID:ID name:nameUTF8 age:age gender:gender height:height];
    26             
    27             NSLog(@"%@", p);
    28         }
    29     } else {
    30         NSLog(@"语法错误");
    31     }
    复制代码
  • 相关阅读:
    -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.
    map合并,相同键对应的值相加
    oracle截取字符串去掉字段末尾指定长度的字符
    springMVC结合AjaxForm上传文件
    hibernate中指定非外键进行关联
    Maven安装及MyEclipse中使用Maven
    js判断字符串出现的次数
    PL/SQL如何调试sql语句、存储过程
    如何让pl/sql developer记住密码,实现快速登录
    【学亮IT手记】jQuery each()函数用法实例
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/3545962.html
Copyright © 2011-2022 走看看