要使用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:];
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 ('%@', '%@', '%@')",
@"张三", @"", @"西城区"]; NSString *sql2 = [NSString stringWithFormat:
@"INSERT INTO 'PERSONINFO' ('name', 'age', 'address') VALUES ('%@', '%@', '%@')",
@"老六", @"", @"东城区"];
[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], -, &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], -, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
char *cID = (char*)sqlite3_column_text(statement, );
NSString *strID = [[NSString alloc] initWithUTF8String:cID]; char *cName = (char*)sqlite3_column_text(statement, );
NSString *strName = [[NSString alloc] initWithUTF8String:cName]; int age = sqlite3_column_int(statement, ); char *cAddress = (char*)sqlite3_column_text(statement, );
NSString *strAddress = [[NSString alloc] initWithUTF8String:cAddress]; NSLog(@"id:%@ name:%@ age:%d address:%@",strID, strName, age, strAddress);
}
}
sqlite3_finalize(statement);
}

sqlite3基础的更多相关文章

  1. sqlite3编程使用简介

    sqlite3使用范围 SQLite不同于其他大部分的SQL数据库引擎,因为它的首要设计目标就是简单化: 1.易于管理 2.易于使用 3.易于嵌入其他大型程序 4.易于维护和配置  许多人喜欢SQLi ...

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

    一.归档介绍 1.归档是指用某种格式来保存一个或多个对象,以便以后还原这些对象的过程.归档是将数据持久化的一种方式(所谓数据持久化,就是指在IOS开发过程中,将数据保存到本地,能够让程序的运行更加流畅 ...

  3. Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

    第一步:下载第三方库,点击 连接 下载, 第二部:准备数据库:按照连接&中博客的步骤实现数据库, 数据库的设计大致如下表: id        username             pas ...

  4. Django基础 - 修改默认SQLite3数据库连接为MySQL

    Django数据库连接默认为SQLite3,打开setting.py可以看到数据库部分的配置如下: DATABASES = { 'default': { 'ENGINE': 'django.db.ba ...

  5. android 基础学习(6)-----sqlite3查看表结构

    原文:http://blog.csdn.net/richnaly/article/details/7831933 sqlite3查看表结构 在android下通过adb shell命令可以进入sqli ...

  6. iOS中数据库应用基础

    iOS 数据库入门 一.数据库简介 1.什么是数据库? 数据库(Database) 是按照数据结构来组织,存储和管理数据的仓库 数据库可以分为2大种类 关系型数据库(主流) PC端 Oracle My ...

  7. Django基础之安装配置

    安装配置 一 MVC和MTV模式 著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的 ...

  8. SQLite源程序分析之sqlite3.c

    /****************************************************************************** ** This file is an a ...

  9. iOS-Objective-C基础

    一.Foundation框架 概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NS ...

随机推荐

  1. 用 NuGet Package Explorer 管理你的攻城武器

    缘由:每次新建一个工程,总是要从自己的“弹药库”或者之前的工程里面手动引用一些类库和脚本插件,难免有些繁琐和遗漏.想起经常用到的NuGet,跑到NuGet主页一看,发现有 NuGet Package ...

  2. .NET面试题大全,包括微软、华为、中兴等大企业的面试真题

    简要地写出一个.NET Remoting的示例 [考点].NET Remoting程序的原理,.NET Remoting的基本编写方法.[出现频率]★★☆☆☆[解答]在VS 2008中添加新的类库项目 ...

  3. 安卓-PC-Arduino3方通信实现

    请仔细理解相关参数,如端口设置.IP设置.COM口设置......等等.....不要盲目COPY.....这涉及手机.电脑和一个单片机,其中一台电脑作为服务器并与单片机相连,负责通过网络与客户端通信( ...

  4. [ACM_图论] Highways (变形说法的最小生成树)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28972#problem/C 题目给出T种情况,每种情况有n个城镇,接下来每一行是第i个城 ...

  5. 【Android】Eclipse Memory Analyzer 进行堆内存溢出分析

    MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件.     不同厂家的 JVM 所生成的堆转储文件在数据存储格式以及数据存储内容上有很多区别,但是比较主流的厂家和格式,例如 Sun, HP, ...

  6. atitit.atitit.hb many2one relate hibernate 多对一关联配置..

    atitit.atitit.hb many2one relate hibernate 多对一关联配置.. 1. 多对一单向 @ManyToOne 1 1. 其中@JoinColumn 注解 2 2.  ...

  7. atitit.eclipse 新特性总结3.1--4.3

    atitit.eclipse 新特性总结3.1--4.3 Eclipse 3.1 1 Eclipse 3.2 Java开发工具的新特性 2 1. 内容辅助(Ctrl+Space)模板 2 2. 动态地 ...

  8. Jsp技术总结

    这节我们总结一下Jsp的相关技术. 1. 什么是JSP JSP即Java Server Pages,它和servlet技术一样,都是sun公司定义的一种用于开发动态web资源的技术.该技术的最大特点在 ...

  9. Huxley 是一个用于Web应用 UI 测试的工具

    Huxley 是一个用于Web应用 UI 测试的工具,由  Pete Hunt 和 Maykel Loomans 用 Python 开发. UI 测试比较令人头疼. UI测试不好写,而且很容易失效: ...

  10. Python 之range 和 xrange

    我目前使用的版本是2.7.6 >>> help (range)Help on built-in function range in module __builtin__: range ...