zoukankan      html  css  js  c++  java
  • ios开发之数据存取1-SQLite

    iOS开发中常用的数据存取方式有:

    XML属性列表-PList

    NSKeyedArchiver 归档

    Preference-偏好设置

    SQLite3

    Core Data-以面向对象的方式操作数据库SQLite

    1、SQLite3简介

    > SQLite属于嵌入式的关系型数据库

    > SQL语句

    - SQL(structured query language):结构化查询语言,一种对关系型数据库中的数据进行定义和操作的句法

    - 要操作和访问数据库中存储的数据,必须编写SQL语句

    - SQL语句是不区分大小写的

    - SQL语句都以分号结尾

    • 数据定义语言-DDL Data Definition Language 其语句包括动词CREATE 和 DROP,用于在数据库中创建新表或删除表-CREATE TABLE 或 DROP TABLE
    • 数据操作语言-DML Data Manipolation Language 其语句包括INSERT,UPDATE,DELETE,也成为动作查询语言
    • 数据查询语言-DQL Data Query Language 也成为“数据检索语句”,用以从表中获取数据 - 保留字SELECT 是DQL用的最多的动词,其它DQL保留字还有WHERE,ORDER BY, GROUP BY 和 HAVING

    > SQLite3使用步骤

    名词解释:handle句柄,在C语言中,通常把用于控制某类东西的叫做句柄,实际上是一个指针,通过这个指针就可以达到操作对象的目的。

    SQLITE_OK 表示数据库操作成功

    导入libsqlite3.dylib框架,并引入头文件<sqlite3.h>

    1、要使用数据库,首先要创建或者打开一个数据库

      > 数据库的存放位置问题

        * 如果是只查询不修改的数据库,可以放在MainBundle(只读)里

        * 如果需要对数据库进行操作,数据文件应该放在沙盒中

      > sqlite3_open 打开数据库

        * 如果数据库已经存在,直接打开

        * 如果数据库不存在,新建一个空白的数据库,然后打开

    #pragma mark 打开数据库
    - (void)openDB
    {
        // 设置沙盒中的文件路径
        // 提示:在自己开发中,不要用.db结尾的sqlite数据库文件名
        NSString *dbPath = [@"readme.db" appendDocumentDir];
        NSLog(@"%@", dbPath);
        
        /**
         sqlite3_open
         
         1) 如果数据库存在,直接打开
         2) 如果数据库不存在,先创建数据库文件,再打开
         */
        _db = NULL; // sqlite3 *_db; 数据库句柄 成员变量
        
        if (SQLITE_OK == sqlite3_open([dbPath UTF8String], &_db)) {
            NSLog(@"数据库打开成功");
        } else {
            NSLog(@"数据库打开失败");
        }
    }

    2、创建数据表

    > 定义数据操作SQL

    > 调用sqlite3_exec执行SQL

    为了避免重复建表,可以在建表的SQL语句中增加 IF NOTEXISTS

        // 避免重复建表的思路
        // 1. 检查沙盒,判断数据库文件是否存在,如果存在就不再建表;
        // 2. 数据库的方法:IF NOT EXISTS,放在表名之前即可
        // 定义SQL语句
        NSString *sql = @"CREATE TABLE IF NOT EXISTS T_Person (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT, gender INTEGER, age INTEGER, height REAL)";

    3、单步执行操作

    1> 增加数据

    2> 修改数据

    3> 删除数据

    定义SQL语句,然后执行   SQLITE_OK == sqlite3_exec

    4、查询语句

    1> 准备SQL语句

        // sql  注意, %@ 字符串需要用 '' 包起来
        NSString *sqlString = [NSString stringWithFormat:@"INSERT INTO T_Person (name, age, height) VALUES ('%@', %d, %.2f)", person.name, person.age, person.height];
    
        const char *sql = [sqlString UTF8String];

    2> 检查SQL语句是否正确 sqlite3_prepare_v2

    SQLITE_API int sqlite3_prepare_v2(
      sqlite3 *db,            /* Database handle */
      const char *zSql,       /* SQL statement, UTF-8 encoded */
      int nByte,              /* Maximum length of zSql in bytes. */
      sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
      const char **pzTail     /* OUT: Pointer to unused portion of zSql */
    );

    3> 单步执行,一次获取查询到的记录 SQLITE_ROW == sqlite3_step(stmt)

    while (sqlite3_step(_stmt) == SQLITE_ROW) 

    4> 按照查询顺序,依次取出每一个字段的内容

      sqlite3_column_text 取字符串

      sqlite3_column_int 取整数

      sqlite3_column_double 取浮点数

                char *name = (char *)sqlite3_column_text(_stmt, 0);
                float height = sqlite3_column_double(_stmt, 1);
                int age = sqlite3_column_int(_stmt, 2);
                int ID = sqlite3_column_int(_stmt, 3);

    总结: SQLite操作的主要步骤为:

    1、定义sql语句

    2、检查sql语句语法是否有问题  sqlite3_prepare_v2

    3、执行sql语句  sqlite3_exec

  • 相关阅读:
    深度历险:Redis 内存模型详解
    Redis 的 8 大应用场景!
    Java并发计数器探秘
    更改系统环境设置,让alias永远生效
    GoldenGate中使用FILTER,COMPUTE 和SQLEXEC命令
    数据集成实例
    客户视角:Oracle ETL工具ODI
    OGG-00782
    Oracle过程包加密
    Concurrent Request:Inactive phase,No Manager status
  • 原文地址:https://www.cnblogs.com/liufeng24/p/3508059.html
Copyright © 2011-2022 走看看