首页 > 移动平台 > 详细

移动端的数据库---SQLite3

时间:2016-03-01 19:13:03      阅读:196      评论:0      收藏:0      [点我收藏+]
  • SQLite3简介

是一款轻型的、跨平台的、嵌入式的关系型数据库

     优点:占用的资源非常的低、在嵌入式设备中,只需要几百K即可,处理速度比MySQL还快

     缺点:并发访问不理想,SQL标准支持不全

     语言接口:C/C++、Java、Python、Ruby、Perl …


实现了自给自足的、无服务器的、零配置的、事务性的SQL数据库引擎

    大部分数据库都是应用于服务器端,而SQLite数据库用于嵌入式终端以及移动终端。

     SQLite直接访问其存储文件,即通过一个文件路径访问


如何存储数据?

     数据库的存储结构和excel很像,以表(table)为单位


数据库存储数据的步骤 :

     1. 新建一张表(table)

     2. 添加多个字段(column、列、属性)

     3. 添加多行记录(row,每行存放多个字段对应的值)


SQLite中的数据类型:

     INTEGER: 整数类型,根据值的大小存储在1 2 3 4 6 8个字节中

     TEXT:       字符串类型

     REAL:       浮点类型,存储为8字节的IEEE浮点数字

     BLOB:      二进制类型,完全根据它的输入存储

     NULL:      是一个空值

     注意:SQLite3本身是一个轻量级数据库,支持的数据类型比较少

     标准SQL中支持很多数据类型,SQLite3将这些类型进行了归类

     参考:http://www.runoob.com/sqlite/sqlite-data-types.html


  • SQLite3编程接口说明

SQLite3提供了纯C的开发接口

Xcode创建项目后,需要在项目中添加SQLite3的库文件:

     项目配置文件 —> Build Phases —> Link Binary With Library 中添加

     技术分享


使用库文件中的接口,需要包含头文件<sqlite3.h>


  • 打开/创建数据库

     使用sqlite3_open函数

 int sqlite3_open(   const char *filename,    sqlite3 **ppDb );

    存在则打开,不存在则创建并打开

     参数filename:sqlite3存储文件路径

     参数ppDb:数据库句柄的出参

     返回值:成功返回SQLITE_OK

如:

NSString * path2 = [NSString stringWithFormat:@"%@/Documents/h.sqlite", NSHomeDirectory()];
int res = sqlite3_open(path2.UTF8String, &_sql);
if ( res != SQLITE_OK ) {
    NSLog(@"数据库打开失败!");
    return ;
}

另外两个open版本:16后缀的使用UTF-16编码,v2后缀的提供了额外参数

int sqlite3_open16(   const void *filename,   sqlite3 **ppDb );
int sqlite3_open_v2(   const char *filename,   sqlite3 **ppDb,   int flags,    const char *zVfs );


  • 关闭数据库

int sqlite3_close(sqlite3*);      int sqlite3_close_v2(sqlite3*);

如:

if ( _sql != NULL ) {
    sqlite3_close(_sql);
    _sql = NULL;
}


  • 执行SQL语句----回到函数方式

int sqlite3_exec(
    sqlite3 *,                                 //数据库句柄
    const char *sql,                           //sql语句字符串
    int (*callback)(void*,int,char**,char**)   //结果集的回调函数
    void *,                                    //回调函数的第一个参数
    char **                                    //出错时的错误描述(出参)
);


说明:一般而言,使用sqlite3_exec()执行没有结果集的更新操作SQL语句,如insert、delete、update

如:从t_hero表单中删除id为1001的行

NSString * path = [NSString stringWithFormat:@"delete from t_hero where id=%@;", @"1001"];
int res = sqlite3_exec(_sql, path.UTF8String, NULL, NULL, NULL);
if ( res != SQLITE_OK ) {
    NSLog(@"%@ 执行失败 %s\n", path, sqlite3_errmsg(_sql));
}


如果有结果集,通过回调函数获得结果集,其函数类型:(很少这样使用的)

int (*callback)(
        void*,     //sqlite3_exec的传递过来的参数
        int,       //结果集的行数
        char**,    //结果集中所有的字段名 
        char**     //结果集中对应的字段值
);


  • 执行SQL语句—prepare方式

select语句的执行推荐使用sqlite3_prepare_v2()函数

int sqlite3_prepare_v2(
    sqlite3 *db,           //数据库句柄
    const char * zSql,     //SQL语句,UTF-8格式
    int nByte,             //zSql参数长度的最大值,可传-1
    sqlite3_stmt **ppStmt, //结果集(出参)
    const char **pzTail    //传NULL即可
};

     返回值:成功返回SQLITE3_OK,否则返回错误码


执行后,可以获得结果集,使用sqlite3_step()遍历结果集 的每一行

int sqlite3_step(sqite3_stmt *);

    每次执行一次,获得结果集中的一行数据,会更改sqlite3_stmt内部的偏移量指针

    返回值:成功返回SQLITE_ROW


获得一行结果的每一个字段,使用以sqlite3_column_开头的函数完成

double sqlite3_column_double(sqlite3_stmt*, int iCol);
int sqlite3_column_int(sqlite3_stmt*, int iCol);
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);


完成一次查询后,一定要销毁结果集

int sqlite3_finalize(sqlite3_stmt *pStmt);


如:获得t_hero中的所有行

sqlite3_stmt *stmt;
NSMutableArray * arr = [NSMutableArray array];

NSString * path = [NSString stringWithFormat:@"select * from t_hero;"];
int res = sqlite3_prepare_v2(_sql, path.UTF8String, -1, &stmt, NULL);
if ( res != SQLITE_OK ) {
    NSLog(@"%@ 执行失败 %s\n", path, sqlite3_errmsg(_sql));
    return arr;
}

while ( sqlite3_step(stmt) == SQLITE_ROW ) {
    NSMutableDictionary * dict = [NSMutableDictionary dictionary];
    
    dict[@"id"] = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 0)];
    dict[@"name"] = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 1)];
    dict[@"title"] = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 2)];
    [arr addObject:dict];
}

sqlite3_finalize(stmt);







本文出自 “teacherAn” 博客,请务必保留此出处http://annmeng.blog.51cto.com/3321237/1746390

移动端的数据库---SQLite3

原文:http://annmeng.blog.51cto.com/3321237/1746390

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!