sqlite3基础

要使用sqlite,首先需要添加库文件libsqlite3.dylib。当你搜索libsqlite3关键字时,会发现还有一个libsqlite3.0.dylib的库文件,这里还是建议添加libsqlite3.dylib,原因在于libsqlite3.dylib是一个替身文件,它总是指向最新的sqlite3动态库;假如出现了新的动态库libsqlite3.1.dylib,那么libsqlite3.dylib将指向它,而libsqlite3.0.dylib无法指向。

在对sqlite数据库进行操作前先声明一个sqlite3类型的对象:

sqlite3 *db;

sqlite3_open — 创建并打开一个sqlite数据库

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

sqlite3_close — 关闭一个sqlite数据库

SQLITE_API int sqlite3_close(sqlite3*);

示例1:创建并打开sqlite数据库

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
NSLog(@"documentsPath: %@",documentsPath);

NSString *databasePath = [documentsPath stringByAppendingPathComponent:@"personinfo.sqlite"];
NSLog(@"databasePath: %@",databasePath);

int state = sqlite3_open([databasePath UTF8String], &db);
NSLog(@"%d",state);

if(state != SQLITE_OK) {
    sqlite3_close(db);
    NSLog(@"数据库打开失败");
}

sqlite3_exec — 执行非查询的sql语句

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

示例2:执行创建表、插入数据操作

- (BOOL)execSql:(NSString *)sql {
    char *err;
    if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
        sqlite3_close(db);
        NSLog(@"execute sql fail!");
        return NO;
    }
    else {
        NSLog(@"execute sql succeed!");
        return YES;
    }
}

- (IBAction)createTable:(id)sender {
    NSLog(@"button clicked");
    NSString *strSql = @"CREATE TABLE IF NOT EXISTS PERSONINFO (ID INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, address TEXT)";

    [self execSql:strSql];
}

- (IBAction)insertAction:(id)sender {
    NSLog(@"insert action");
    NSString *sql1 = [NSString stringWithFormat:
                      @"INSERT INTO ‘PERSONINFO‘ (‘name‘, ‘age‘, ‘address‘) VALUES (‘%@‘, ‘%@‘, ‘%@‘)",
                      @"张三", @"23", @"西城区"];

    NSString *sql2 = [NSString stringWithFormat:
                      @"INSERT INTO ‘PERSONINFO‘ (‘name‘, ‘age‘, ‘address‘) VALUES (‘%@‘, ‘%@‘, ‘%@‘)",
                      @"老六", @"20", @"东城区"];
    [self execSql:sql1];
    [self execSql:sql2];
}

sqlite3_stmt — 相当于ODBC的command对象,用于保存编译好的sql语句

sqlite3_prepare_v2 — 这个函数将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针。它实际上并不执行这个sql语句,仅仅为执行而准备这个sql语句,也就是说,在调用该函数成功(SQLITE_OK)后,sqlite3_stmt将不再为空对象。

SQLITE_API int sqlite3_prepare_v2(
  sqlite3 *db,            /* Database handle(数据库指针) */
  const char *zSql,       /* SQL statement, UTF-8 encoded(使用UTF-8编码的SQL语句) */
  int nByte,              /* Maximum length of zSql in bytes.(如果nByte小于0,则函数取出zSql中从开始到第一个0终止符的内容;如果nByte为非负数,那么它就是这个函数能从zSql中读取的最大字节数。如果nBytes为非负数,zSql在第一次遇见/000或u000的时候终止) */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle(能够使用sqlite3_step()执行的编译好的准备语句的指针,如果错误发生,它被置为NULL,例如输入一个不正确的sql语句。调用过程必须负责在编译好的sql语句完成使用后,调用sqlite3_finalize()删除它。 */
  const char **pzTail     /* OUT: Pointer to unused portion of zSql(当zSql在遇见终止符或者达到设定的nByte结束后,如果还有剩余的内容,那么这些剩余的内容将被存放到pzTail中,不包含终止符) */
);

sqlite3_step — 执行由sqlite3_prepare创建的准备语句。当调用后返回SQLITE_ROW,则代表还有更多行,可继续调用sqlite3_step直至返回SQLITE_DONE。对于insert、update或delete语句,也可以用sqlite3_step来执行,但更推荐用sqlite3_exec。

SQLITE_API int sqlite3_step(sqlite3_stmt*);

sqlite3_step的返回值取决于创建sqlite3_stmt参数所使用的函数,假如使用老版本的接口sqlite3_prepare()或sqlite3_prepare16(),返回值会是SQLITE_BUSY、SQLITE_DONE, SQLITE_ROW, SQLITE_ERROR 或 SQLITE_MISUSE;而v2版本的接口sqlite3_prepare_v2()和sqlite3_prepare16_v2()除了这些值以外,还可能返回扩展状态码。

sqlite3_reset — 重置一个准备语句(prepared statement)对象到它的初始状态,准备被重新执行。在V3.6.23.1以后,sqlite3_step()将会自动调用sqlite3_reset。

SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);

sqlite3_finalize — 销毁一个准备语句(prepared statement)对象,在需要时执行这个销毁函数以防止内存泄露。在准备语句对象为空指针时调用这个函数也没有什么影响。

SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);

示例3:利用sqlite3_step执行更新操作

- (IBAction)updateAction:(id)sender {
    NSString *sqlQuery = @"update PERSONINFO set address=‘成都市‘ where age=‘20‘";

    sqlite3_stmt *statement;

    if(sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {
        if(sqlite3_step(statement) == SQLITE_DONE) {
            NSLog(@"update succeed");
        }
        else {
            NSLog(@"update failed");
        }
    }
    sqlite3_finalize(statement);
}

sqlite3_column — 并不存在sqlite3_column这个函数,它只是一个前缀,下面是相关的具体函数:

SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol);
SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol);
SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);

上面的函数用来得到结果集当前行中某一列的值,列索引从0开始。

示例4:查询并打印出结果集

- (IBAction)selectAction:(id)sender {
    NSString *sqlQuery = @"SELECT * FROM PERSONINFO";
    sqlite3_stmt *statement;

    if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {
        while (sqlite3_step(statement) == SQLITE_ROW) {
            char *cID = (char*)sqlite3_column_text(statement, 0);
            NSString *strID = [[NSString alloc] initWithUTF8String:cID];

            char *cName = (char*)sqlite3_column_text(statement, 1);
            NSString *strName = [[NSString alloc] initWithUTF8String:cName];

            int age = sqlite3_column_int(statement, 2);

            char *cAddress = (char*)sqlite3_column_text(statement, 3);
            NSString *strAddress = [[NSString alloc] initWithUTF8String:cAddress];

            NSLog(@"id:%@  name:%@  age:%d  address:%@",strID, strName, age, strAddress);
        }
    }
    sqlite3_finalize(statement);
}
时间: 2024-11-05 19:00:18

sqlite3基础的相关文章

【IOS学习基础】归档和解档

一.归档介绍 1.归档是指用某种格式来保存一个或多个对象,以便以后还原这些对象的过程.归档是将数据持久化的一种方式(所谓数据持久化,就是指在IOS开发过程中,将数据保存到本地,能够让程序的运行更加流畅). 2.想要归档的数据对象,需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法. 3.归档就是将临时数据保存成本地文件. 4.归档的缺点:归档的形式来保存数据,只能一次性归档保存以及一次性解压.所以只能针对小量数据,而且对数据

SQLite3深入浅出

文章目录: 1.sqlite3 基础语句 2.sqlite3 API 3.sqlite3 线程安全 4.FMDB 1.基础语句: 学习sqlite3的基础在于SQL语句,开始前请输入$ sqlite3 验证你的电脑是否已经安装了sqlite3 首先我们需要创建一个数据库文件,打开终端,在合适的目录下,输入: $ sqlite3 studyDB.db .database 1.1.创建表 以id为主键并自动增加,创建一个名为book的表: create table if not exists boo

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

Cocos数据篇[3.4](6) ——SQLite3数据库基础用法

[唠叨] 在Cocos2d-x中,简单数据存储,可以使用UserDefault.那么如何存储大量,不规则的数据?我们可以使用 SQLite数据库 存储数据.SQLite 是使用非常广泛的 嵌入式数据库 ,它有小巧 .高效.跨平台.开源免费和易操作的特点.所以大量的被用于手机.PDA.MP3播放器.以及机顶盒设备. SQLite数据库是使用C语言来编写的,因此在Cocos2d-x使用SQLite也是得心应手. 本文介绍一下SQLite3数据库的基础用法:增删改查. PS:另外对于SQLite的可视

Cocos2d-x数据篇06:SQLite3数据库基础用法

尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=2430 [前言] 在Cocos2d-x中,简单数据存储,可以使用UserDefault.那么如何存储大量,不规则的数据?我们可以使用 SQLite数据库 存储数据.SQLite 是使用非常广泛的 嵌入式数据库 ,它有小巧 .高效.跨平台.开源免费和易操作的特点.所以大量的被用于手机.PDA.MP3播放器.以及机顶盒设备. SQLite数据库是使用C语言来编写的,因此在Cocos2d-x使用SQLite也

sqlite3 零基础入门

sqlite3使用简介 一 . 使用的流程   要使用sqlite,需要将libsqlite3.0.dylib导入到工程的配置文件中. 使用过程中的函数大致分为如下几个: > sqlite3_open() > sqlite3_prepare() > sqlite3_step() > sqlite3_column() > sqlite3_finalize() > sqlite3_colse() 这几个过程是概念上的说法,而不完全是程序运行的过程,如sqlite3_colu

Sqlite3数据库Python基础操作

1.数据库操作步骤 使用sqlite3需要导入包sqlite3,数据库在操作时需要先连接数据库,然后创建游标Cursor. 当程序运行完以后,需要先关闭游标,然后再关闭数据库. (1)查询操作 查询操作的步骤为:1.使用SQL语句进行查询,2.从fetchall中将查询结果读出 使用Cursor对象执行select语句时,通过featchall()可以拿到结果集.结果集是一个list,每个元素都是一个tuple,对应一行记录. 示例代码如下 import sqlite3#导入包 conn=sql

python sqlite3使用详解

Python SQLITE数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身.它使用一个文件存储整个数据库,操 作十分方便.它的最大优点是使用方便,功能相比于其它大型数据库来说,确实有些差距.但是性能表现上,SQLITE并不逊色.麻雀虽小,五脏俱全, sqlite 实现了多数 sql-92 的标准,比如说 transaction . trigger 和复杂的查询等. python的数据库模块有统一的接口标准,所以数据库操作都有统一的模式,基本上都是

深入理解iPhone数据持久化(手把手教你iphone开发 – 基础篇)

在所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在symbian中可以保存在相应的磁盘目录中和数据库中.symbian中因为权限认证的原因,在3rd上大多数只能访问应用程序的private目录或其它系统共享目录.在iphone中,apple博采众长,提供了多种数据持久化的方法,下面笔者会逐个进行详细的讲解. iphone提供的数据持久化的方法,从数据保存的方式上讲可以分为三大部分:属性列表.对象归档.嵌入式数据库(SQLite3).其他方法. 一.属