• IOS开发中的数据库的学习


    IOS开发学习笔记iOS数据库编程是本文要介绍的内容,主要是来了解IOS开发中的数据库的学习,具体内容来看详解。在IOS开发过程中常常会用到数据库,而SQLite3是中支持的数据库。下面简单介绍一下iPhone中SQLite3数据库的用法:
    SQLite3是一个轻量级的数据库,完全使用C语言编写,使用简单方便。它是一个嵌入到程序进程的数据库,和其他一些数据库(MySQL,MS SQL)不同,它没有独立的进程。
    1、打开数据库
    首先声明一个数据库变量
    [pre]

        sqlite3 *

    db

         = 

    NULL

      ;

    [/pre]每一个SQLite3都是一个文件,打开一个数据库只需要调用一次sqlite3_open函数:
    [pre]

      SQLITE_API int sqlite3_open(  
    1. const char *filename,   /* Database filename (UTF-8) */  
    2. sqlite3 **ppDb          /* OUT: SQLite db handle */  
    3. );

    [/pre]filename是数据库的路径,ppDb是指向返回的sqlite3数据库,返回SQLITE3_OK则表示正常。比如我们打开Document目录下的“Test.db”数据库:
    [pre]

        int 

    result

         = 

    sqlite3_open

      ([dbPath UTF8String], &db);  
    1. NSAssert(result==SQLITE_OK, @”Can’t open database %@”, dbPath);

    [/pre]注意:如果dbPath路径下的数据库不存在,那么打开这个数据库将会创建一个空的数据库。
    2、执行SQL语句
    SQLite3有3种执行SQL语句的方法:
    通过sqlite3_exec()函数,适用于执行(非查询)语句:如CREATE TABLE、INSERT,REPLACE,DELETE等。
    [pre]

      SQLITE_API int sqlite3_exec(  
    1. sqlite3*,                                  /* An open database */  
    2. const char *sql,                           /* SQL to be evaluated */  
    3. int (*callback)(void*,int,char**,char**),  /* Callback function */  
    4. void *,                                    /* 1st argument to callback */  
    5. char **errmsg                              /* Error msg written here */  
    6. );

    [/pre]比如我们要创建一个表示个人(person)的表,就可以使用sqlite3_exec()函数。person表中包括名字(name)、性别(gender)、年龄(age)和生日(birthday)这几个字段。代码如下:
    [pre]

        char *

    errmsg

         = 

    NULL

        ;  
      1. result = sqlite3_exec(db, “CREATE TABLE person (”  
      2. “name 

    TEXT

        ,”  
      1. “gender INTEGER,”  
      2. “age INTEGER,”  
      3. “birthday DATE)”, NULL, NULL, &errmsg);  
      4. NSAssert(

    result

      ==SQLITE_OK, @”Can’t CREATE TABLE: %s”, errmsg);

    [/pre]通过sqlite3_get_table()函数,适用于查询语句SELECT。由于此函数返回一个字符串数组,因此对于要求结果为二进制数据(如图像数据)的不能用此函数返回。
    [pre]

      SQLITE_API int sqlite3_get_table(  
    1. sqlite3 *db,          /* An open database */  
    2. const char *zSql,     /* SQL to be evaluated */  
    3. char ***pazResult,    /* Results of the query */  
    4. int *pnRow,           /* Number of result rows written here */  
    5. int *pnColumn,        /* Number of result columns written here */  
    6. char **pzErrmsg       /* Error msg written here */  
    7. );

    [/pre]例如我们要查询person中的所有数据:
    [pre]

        char **

    table

         = 

    NULL

        ;  
      1. int row,col;  

    result

         = 

    sqlite3_get_table

      (db, “SELECT name,age,birthday from person”, &table, &row, &col, &errmsg);  
    1. NSAssert(result==SQLITE_OK, @”SQL ERROR: %s”, errmsg);

    [/pre]那么字符串数组table中就包含所有的表信息,本例中每行3个元素(name、age和birthday),table第一行元素是字段名字,如table[0]是”name”,table[1]是”age”,table[2]是”birthday”。table的第二行才是实际的数据,如table[3]是”张三”,table[4]是”24″,table[5]是”1981-10-21 12:00:01″。
    通过sqlite3_prepare()、sqlite3_step()、sqlite3_bind_xxx()以及sqlite3_finalize()等一系列函数,可以逐行获取数据,并可以获取二进制数据。
    sqlite3_prepare()用于编译一个SQL语句,返回一个sqlite3_stmt结构指针。sqlite3_stmt结构指针用于sqlite3_step()、sqlite3_bind_xxx()以及sqlite3_finalize()等函数中。sqlite3_step()用于将当前记录指向下一个。sqlite3_bind_xxx()等一系列函数会获取当前记录中各个字段对应的值。最后调用一下sqlite3_finalize()用于释放一些资源。
    3、其他高级应用
    (1)创建内存数据库
    通常SQLite3数据库存储在磁盘文件中,所以对数据库的读写等操作就会精彩的对磁盘文件进行读写。SQLite3也可以将数据库建立在内存中,但是要注意建立内存的数据是易失的(程序退出时内存便会释放)。我们知道磁盘的读写比内存的读写要慢很多很多,有时候我们对读写速度要求很高,但是对数据是否时持久保存并不感兴趣,这时使用内存数据库最好不过了。
    创建内存数据库很简单,只需要把打开数据库的文件名改为“:memory:”即可。
    [pre]

        int 

    result

         = 

    sqlite3_open

      (“:memory:”, &db);  
    1. NSAssert(result==SQLITE_OK, @”Can’t open database %@”, dbPath);

    [/pre](2)创建自定义SQL语句函数
    有时候我们想定义一个函数来判断一个人是否满足结婚条件(男性大于22岁,女性大于20岁),可惜SQL语句中并没有提供如此复杂的判断。这时创建一个自定义函数是非常方便的。
    [pre]

        static void db_func_canmarry(sqlite3_context *context, int argc, sqlite3_value **argv){  
      1. int gender = sqlite3_value_int(argv[0]);  
      2. int 

    age

         = 

    sqlite3_value_int

        (argv[1]);  
      1. int canmarry = 0;  
      2. if (

    gender

         == 0 && age 

    >

         22) {  
      1. canmarry = 1;  
      2. }  
      3. else if (gender == 1 && age > 20){  

    canmarry

         = 

    0

      ;  
    1. }  
    2. sqlite3_result_int(context, canmarry);  
    3. }

    [/pre]定义好函数,把这个函数加入到数据库SQL语句中。
    [pre]

      sqlite3_create_function(db, “CANMARRY”, 2, SQLITE_UTF8, NULL, &db_func_canmarry, NULL, NULL);

    [/pre]以后我们执行SQL语句SELECT * FROM person WHERE CANMARRY(gender,age) 就可以获取到所有满足结婚条件的人。
    (3)分页查询
    数据库查询时常常碰到需要分页显示结果的情况,这时候我们使用SQL语句LIMIT关键字就非常方便了。比如返回20行起的10行数据
    [pre]

        SELECT * FROM person WHERE CANMARRY(gender,age) LIMIT 20, 10
  • 相关阅读:
    音频播放
    控制器的创建和控制器View的创建
    UIWebView之获取所点位置的图片(放大webView中的图片)
    SQLite的应用
    数据库操作(SQLite)
    计算文件(文件夹)大小
    本人专访微信魔法表情“米悠”作者流星剑
    Swift给每个开发者赢取500万的机会!不看一生后悔。
    疯狂猜图产品和盈利模式分析
    开发者改变世界的初心!
  • 原文地址:https://www.cnblogs.com/DamonTang/p/2577900.html
Copyright © 2020-2023  润新知