Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3826
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-12 01:32
文章分类
文章存档

2013年(4)

我的朋友
最近访客

分类: 其他平台

2013-08-02 15:34:00

在iOS中提供了SQLite的支持,这样可以通过对Sqlite的使用,实现数据的存储和管理。

处理数据库是常用操作,查找资料理解了一些对sqlite3的简单操作,记录下来,方便自己查看。
首先要导入framework,最基本的,不过也容易忘记。初次尝试使用时,就是忘了导入,还调试了好长时间,汗。。。
在AppDelegate中拷入sqlite文件:

    - (void)initSys
    {
        NSUserDefaults *udf = [NSUserDefaults standardUserDefaults];
        //只在程序首次运行时运行
        if (![udf boolForKey:@"hasdatabase"]) {
            //拷贝sqlite文件
            ....
            //记录文件已存在
            [udf setBool:YES forKey:@"hasdatabase"];
        }
    }

调用即可:
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOption:
              (NSDictionary *)launchOptions
    {
        ...
        [self initSys];
        ...
    }

简要说明一下SQLite数据库执行SQL语句的过程

** 调用sqlite3_prepare()将SQL语句编译为sqlite内部一个结构体(sqlite3_stmt).该结构体中包含了将要执行的的SQL语句的信息.
** 如果需要传入参数,在SQL语句中用’?'作为占位符,再调用sqlite3_bind_XXX()函数将对应的参数传入.
** 调用sqlite3_step(),这时候SQL语句才真正执行.注意该函数的返回值,SQLITE_DONE和SQLITE_ROW都是表示执行成功, 不同的是SQLITE_DONE表示没有查询结果,象UPDATE,INSERT这些SQL语句都是返回SQLITE_DONE,SELECT查询语句在 查询结果不为空的时候返回SQLITE_ROW,在查询结果为空的时候返回SQLITE_DONE.
** 每次调用sqlite3_step()的时候,只返回一行数据,使用sqlite3_column_XXX()函数来取出这些数据.要取出全部的数据需要 反复调用sqlite3_step(). (注意, 在bind参数的时候,参数列表的index从1开始,而取出数据的时候,列的index是从0开始).
** 在SQL语句使用完了之后要调用sqlite3_finalize()来释放stmt占用的内存.该内存是在sqlite3_prepare()时分配的.
** 如果SQL语句要重复使用,可以调用sqlite3_reset()来清楚已经绑定的参数.

在这一部分里,sqlite3_prepare不是很好理解,这里有部分资料。

这里给个例子,加强理解:

    + (NSUInteger) getCount:(NSString *)sCategory state:(int)iState
    {
        //DB_PATH为你的数据库文件路径
        NSString *sDBPath = DB_PATH;
        sqlite3 *database;
        if (sqlite3_open([sDBPath UTF8String], &database) == SQLITE_OK) {
            NSString *sSel = @"SELECT count(*) FROM table_name WHERE sCategory=?
                 AND iState=? ORDER BY _id";
            const char *sql = [sSel UTF8String];
            NSUInteger iCount = 0;
            sqlite3_stmt *statement;
            if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
                sqlite3_bind_text(statement, 1, [sCategory UTF8String], -1, NULL);
                sqlite3_bind_int(statement, 2, iState);
                while (sqlite3_step(statement) == SQLITE_ROW) {
                    iCount = (int)sqlite3_column_int(statement, 0);
                }
            }
            sqlite3_finalize(statement);
        }
        else
        {
            sqlite3_close(database);
            database = NULL;
            NSAssert1(0, @"Failed to open database with message '%s', sqlite3_errmsg(database));
        }
        return iCount;
    }

  • 本稿件为独家原创稿件,版权所有,引用或转载请注明出处。
  • 文章出处:
阅读(196) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:linux系统编程之信号(一):中断与信号

给主人留下些什么吧!~~