iPhone中支持通过sqlite3来访问iPhone本地的数据库。
具体使用方法如下
1:添加开发包libsqlite3.0.dylib
首先是设置项目文件,在项目中添加iPhone版的sqlite3的数据库的开发包,在项目下的Frameworks点击右键,然后选择libsqlite3.0.dylib文件。
libsqlite3.0.dylib文件地址:
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/usr/lib/libsqlite3.0.dylib
2,代码中的操作:
那么接下来是代码了。
1 首先获取iPhone上sqlite3的数据库文件的地址
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"database_name"];
2 打开iPhone上的sqlite3的数据库文件
sqlite3 *database;
sqlite3_open([path UTF8String], &database);
3 准备sql文---sql语句
sqlite3_stmt *stmt;
const char *sql = "SELECT * FROM table_name WHERE pk=? and name=?";
sqlite3_prepare_v2(database, sql, -1, &stmt, NULL);
4 邦定参数
// 邦定第一个int参数
sqlite3_bind_int(stmt, 1, 1);
// 邦定第二个字符串参数
sqlite3_bind_text(stmt, 2, [title UTF8String], -1, SQLITE_TRANSIENT);
5 执行sql文
sqlite3_step(stmt);
6 释放sql文资源
sqlite3_finalize(stmt);
7 关闭iPhone上的sqlite3的数据库
sqlite3_close(database);

http://hi.baidu.com/clickto/blog/item/0c6904f787c34125720eec87.html

以下演示一下使用sqlite的步骤,先创建一个数据库,然后查询其中的内容。2个重要结构体和5个主要函数:

sqlite3               *pdb, 数据库句柄,跟文件句柄FILE很类似

sqlite3_stmt      *stmt, 这个相当于ODBC的Command对象,用于保存编译好的SQL语句

sqlite3_open(),   打开数据库

sqlite3_exec(),   执行非查询的sql语句

sqlite3_prepare(), 准备sql语句,执行select语句或者要使用parameter bind时,用这个函数(封装了sqlite3_exec).

Sqlite3_step(), 在调用sqlite3_prepare后,使用这个函数在记录集中移动。

Sqlite3_close(), 关闭数据库文件

还有一系列的函数,用于从记录集字段中获取数据,如

sqlite3_column_text(), 取text类型的数据。

sqlite3_column_blob(),取blob类型的数据

sqlite3_column_int(), 取int类型的数据

PreparedStatement方式处理SQL请求的过程
特点:可以绑定参数,生成过程。执行的时候像是ADO一样,每次返回一行结果。

1. 首先建立statement对象:
int sqlite3_prepare(
  sqlite3 *db,            /* Database handle */
  const char *zSql,       /* SQL statement, UTF-8 encoded */
  int nBytes,             /* Length of zSql in bytes. */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
  const char **pzTail     /* OUT: Pointer to unused portion of zSql */
);

2. 绑定过程中的参数(如果有没有确定的参数)
   int sqlite3_bind_xxxx(sqlite3_stmt*, int, ...);
第二个int类型参数-表示参数的在SQL中的序号(从1开始)。
第三个参数为要绑定参数的值。
  对于blob和text数值的额外参数:
第四参数是字符串(Unicode 8or16)的长度,不包括结束'\0'。
第五个参数,类型为void(*)(void*),表示SQLite处理结束后用于清理参数字符串的函数。
没有进行绑定的未知参数将被认为是NULL。

3. 执行过程
  int sqlite3_step(sqlite3_stmt*);
可能的返回值:
 *SQLITE_BUSY:   数据库被锁定,需要等待再次尝试直到成功。
 *SQLITE_DONE:   成功执行过程(需要再次执行一遍以恢复数据库状态)
 *SQLITE_ROW:    返回一行结果(使用sqlite3_column_xxx(sqlite3_stmt*,, int iCol)得到每一列的结果。
         再次调用将返回下一行的结果。
 *SQLITE_ERROR:  运行错误,过程无法再次调用(错误内容参考sqlite3_errmsg函数返回值)
 *SQLITE_MISUSE: 错误的使用了本函数(一般是过程没有正确的初始化)

4. 结束的时候清理statement对象
  int sqlite3_finalize(sqlite3_stmt *pStmt);
应该在关闭数据库之前清理过程中占用的资源。

5. 重置过程的执行
  int sqlite3_reset(sqlite3_stmt *pStmt);
过程将回到没有执行之前的状态,绑定的参数不会变化。

其他工具函数
1. 得到结果总共的行数
  int sqlite3_column_count(sqlite3_stmt *pStmt);
如果过程没有返回值,如update,将返回0

2. 得到当前行中包含的数据个数
  int sqlite3_data_count(sqlite3_stmt *pStmt);
如果sqlite3_step返回SQLITE_ROW,可以得到列数,否则为零。

3. 得到数据行中某个列的数据
  sqlite3_column_xxx(sqlite3_stmt*, int iCol);
在sqlite3_step返回SQLITE_ROW后,使用它得到第iCol列的数据。
其中的xxx代表:
blob:指向保存数据内存的指针
bytes, bytes16: 得到该blob类型数据的大小,或者text转换为UTF8/UTF16的字符串长度。
double, int, int64: 数值
text,text16:字符串指针
type:该列的数据类型(SQLITE_INTEGER,SQLITE_FLOAT,SQLITE_TEXT,SQLITE_BLOB,SQLITE_NULL)
注意:如果对该列使用了不同与该列本身类型适合的数据读取方法,得到的数值将是转换过的结果。

4. 得到数据行中某个列的数据的类型
  int sqlite3_column_type(sqlite3_stmt*, int iCol);
返回值:SQLITE_INTEGER,SQLITE_FLOAT,SQLITE_TEXT,SQLITE_BLOB,SQLITE_NULL
使用的方法和sqlite3_column_xxx()函数类似。

//////////////////////////////////////
Sqlite 資料庫檔案的產生

MAC 上有許多應用程式都可以用來產生它,有 UI 界面很方便。但如果不想另外安裝軟體,MAC 系統也內建 sqlite3 的元件,可由 console 來建立。首先我們先開啟任何一款文書編輯軟體,以 sql 語法來手動建立,並存成 data.sql。

1    
BEGINTRANSACTION;

2    
CREATETABLE

'Info'
(_id INTEGERPRIMARY

KEY,'Name'TEXT,
'Tel'TEXT,
'Address'TEXT);

3    
INSERTINTO

'Info'
VALUES(1,'Richie','1234567','台中市');

4    
INSERTINTO

'Info'
VALUES(2,'Eric','7654321','台北市');

5    
INSERTINTO

'Info'
VALUES(3,'Andy','1234321','高雄市');

6    
COMMIT;

然後在 console 下達以下指令 來產生 data.rdb 這個 sqlite file

1    
sqlite3
 data.rdb < data.sql

iOS 專案使用 Sqlite 資料庫

先將剛才產生的資料庫加入專案中,然後在專案中加入 libsqlite3.0.dylib。

接下來開始撰寫程式碼了,xxxAppDelegate.h 必須 import sqlite3.h,並宣告一個 sqlite3 結構。

1    
#import
 "sqlite3.h"

2

3    
@interfacexxxAppDelegate
 : NSObject<UIApplicationDelegate>

4    
{

5    
    sqlite3*
 database;

6    
}

在 xxxAppDelegate.m 的 didFinishLaunchingWithOptions 函式 開始加入相關程式碼

1    
-
 (BOOL)application:(UIApplication*)application
 didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

2    
{

3    
    //
 檢查資料庫是否存在,不存在時則 copy

4    
    NSString*path
 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)
 lastObject];

5    
    NSString*file
 = [path stringByAppendingPathComponent:@"data.rdb"];

6    
    if([[NSFileManagerdefaultManager]
 fileExistsAtPath:file] == FALSE)

7    
    {

8    
        NSString*fromFile
 = [[NSBundlemainBundle]
 pathForResource:@"data.rdb"ofType:nil];

9    
        [[NSFileManagerdefaultManager]
 copyItemAtPath:fromFile toPath:file error:nil];

10    
    }

11    
    //
 open

12    
    if(sqlite3_open([file
 UTF8String], &database) != SQLITE_OK)

13    
        NSAssert1(0,
 @"Failed
 to open database with message '%s'.",
 sqlite3_errmsg(database));

14

15    
    self.window.rootViewController
 = self.viewController;

16    
    [self.window
 makeKeyAndVisible];

17    
    returnYES;

18    
}

19

20    
-
 (void)dealloc

21    
{

22    
    sqlite3_close(database);

23    
    [superdealloc];

24    
}

簡 單說明一下,將 data.rdb 加入專案中後,該資料庫會出現在 app 套件內,但每個 app 就只有專屬 Documents 目錄可以讀寫。所以必須判斷 Documents 目錄下該檔案是否存在,如果不存在則 copy 過去該目錄後再 open 資料庫。至於為什麼做判斷?為什麼不每次都 copy 過去即可?因為如果不希望該資料庫在每次 app 版本更新後,都會被覆蓋掉,就得做檔案存在與否的判斷。

讀取資料庫

有成功 open 資料庫之後,就可以開始進行讀寫了。讀取資料庫的方法,其實也是很簡單,只要熟悉 SQL 語法,應該就沒什麼問題了。

1    
NSString*sql
 = [NSStringstringWithFormat:@"SELECT
 * FROM Event "];

2    
sqlite3_stmt
 *statement;

3    
if(sqlite3_prepare_v2(database,
 1, -1, &statement, NULL)
 == SQLITE_OK)

4    
{

5    
    while
 (sqlite3_step(statement) == SQLITE_ROW)

6    
    {

7    
        NSString*strValue
 = [NSStringstringWithUTF8String:(char*)sqlite3_column_text(statement,
 0)];

8    
        intintValue
 = sqlite3_column_int(statement, 1);

9    
    }

10    
}

11    
sqlite3_finalize(statement);

其中必須注意的是 sqlite3_column_text, sqlite3_column_int 負責取得資料,必須指定是哪個 column index。

執行 SQL 命令

上述是 SELECT 的用法,但是如果需要做 INSERT, DELETE, UPDATE 等動作時,則更是簡單,只需以下指令即可。

1    
char*errMsg;

2    
NSString*sql
 = [NSStringstringWithFormat:@"CREATE
 TABLE 'Info' (_id INTEGER PRIMARY KEY, 'Name' TEXT, 'Tel' TEXT, 'Address' TEXT)"];

3    
sqlite3_exec(database,
 1, nil,nil,
 &errMsg);

IOS数据库操作SQLite3使用详解

iPhone中支持通过sqlite3来访问iPhone本地的数据库。

具体使用方法如下

1:添加开发包libsqlite3.0.dylib

首先是设置项目文件,在项目中添加iPhone版的sqlite3的数据库的开发包,在项目下的Frameworks点击右键,然后选择libsqlite3.0.dylib文件。

libsqlite3.0.dylib文件地址:

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/usr/lib/libsqlite3.0.dylib

2,代码中的操作:

那么接下来是代码了。

1 首先获取iPhone上sqlite3的数据库文件的地址

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *path = [documentsDirectory stringByAppendingPathComponent:@"database_name"];

2 打开iPhone上的sqlite3的数据库文件

sqlite3 *database;

sqlite3_open([path UTF8String], &database);

3 准备sql文---sql语句

sqlite3_stmt *stmt;

const char *sql = "SELECT * FROM table_name WHERE pk=? and name=?";

sqlite3_prepare_v2(database, sql, -1, &stmt, NULL);

4 邦定参数

// 邦定第一个int参数

sqlite3_bind_int(stmt, 1, 1);

// 邦定第二个字符串参数

sqlite3_bind_text(stmt, 2, [title UTF8String], -1, SQLITE_TRANSIENT);

5 执行sql文

sqlite3_step(stmt);

6 释放sql文资源

sqlite3_finalize(stmt);

7 关闭iPhone上的sqlite3的数据库

sqlite3_close(database);

http://hi.baidu.com/clickto/blog/item/0c6904f787c34125720eec87.html

以下演示一下使用sqlite的步骤,先创建一个数据库,然后查询其中的内容。2个重要结构体和5个主要函数:

sqlite3               *pdb, 数据库句柄,跟文件句柄FILE很类似

sqlite3_stmt      *stmt, 这个相当于ODBC的Command对象,用于保存编译好的SQL语句

sqlite3_open(),   打开数据库

sqlite3_exec(),   执行非查询的sql语句

sqlite3_prepare(), 准备sql语句,执行select语句或者要使用parameter bind时,用这个函数(封装了sqlite3_exec).

Sqlite3_step(), 在调用sqlite3_prepare后,使用这个函数在记录集中移动。

Sqlite3_close(), 关闭数据库文件

还有一系列的函数,用于从记录集字段中获取数据,如

sqlite3_column_text(), 取text类型的数据。

sqlite3_column_blob(),取blob类型的数据

sqlite3_column_int(), 取int类型的数据

PreparedStatement方式处理SQL请求的过程

特点:可以绑定参数,生成过程。执行的时候像是ADO一样,每次返回一行结果。

1. 首先建立statement对象:

int sqlite3_prepare(

sqlite3 *db,            /* Database handle */

const char *zSql,       /* SQL statement, UTF-8 encoded */

int nBytes,             /* Length of zSql in bytes. */

sqlite3_stmt **ppStmt,  /* OUT: Statement handle */

const char **pzTail     /* OUT: Pointer to unused portion of zSql */

);

2. 绑定过程中的参数(如果有没有确定的参数)

int sqlite3_bind_xxxx(sqlite3_stmt*, int, ...);

第二个int类型参数-表示参数的在SQL中的序号(从1开始)。

第三个参数为要绑定参数的值。

对于blob和text数值的额外参数:

第四参数是字符串(Unicode 8or16)的长度,不包括结束'\0'。

第五个参数,类型为void(*)(void*),表示SQLite处理结束后用于清理参数字符串的函数。

没有进行绑定的未知参数将被认为是NULL。

3. 执行过程

int sqlite3_step(sqlite3_stmt*);

可能的返回值:

*SQLITE_BUSY:   数据库被锁定,需要等待再次尝试直到成功。

*SQLITE_DONE:   成功执行过程(需要再次执行一遍以恢复数据库状态)

*SQLITE_ROW:    返回一行结果(使用sqlite3_column_xxx(sqlite3_stmt*,, int iCol)得到每一列的结果。

再次调用将返回下一行的结果。

*SQLITE_ERROR:  运行错误,过程无法再次调用(错误内容参考sqlite3_errmsg函数返回值)

*SQLITE_MISUSE: 错误的使用了本函数(一般是过程没有正确的初始化)

4. 结束的时候清理statement对象

int sqlite3_finalize(sqlite3_stmt *pStmt);

应该在关闭数据库之前清理过程中占用的资源。

5. 重置过程的执行

int sqlite3_reset(sqlite3_stmt *pStmt);

过程将回到没有执行之前的状态,绑定的参数不会变化。

其他工具函数

1. 得到结果总共的行数

int sqlite3_column_count(sqlite3_stmt *pStmt);

如果过程没有返回值,如update,将返回0

2. 得到当前行中包含的数据个数

int sqlite3_data_count(sqlite3_stmt *pStmt);

如果sqlite3_step返回SQLITE_ROW,可以得到列数,否则为零。

3. 得到数据行中某个列的数据

sqlite3_column_xxx(sqlite3_stmt*, int iCol);

在sqlite3_step返回SQLITE_ROW后,使用它得到第iCol列的数据。

其中的xxx代表:

blob:指向保存数据内存的指针

bytes, bytes16: 得到该blob类型数据的大小,或者text转换为UTF8/UTF16的字符串长度。

double, int, int64: 数值

text,text16:字符串指针

type:该列的数据类型(SQLITE_INTEGER,SQLITE_FLOAT,SQLITE_TEXT,SQLITE_BLOB,SQLITE_NULL)

注意:如果对该列使用了不同与该列本身类型适合的数据读取方法,得到的数值将是转换过的结果。

4. 得到数据行中某个列的数据的类型

int sqlite3_column_type(sqlite3_stmt*, int iCol);

返回值:SQLITE_INTEGER,SQLITE_FLOAT,SQLITE_TEXT,SQLITE_BLOB,SQLITE_NULL

使用的方法和sqlite3_column_xxx()函数类似。

IOS数据库操作SQLite3使用详解(转)的更多相关文章

  1. C# Oracle数据库操作类实例详解

    本文所述为C#实现的Oracle数据库操作类,可执行超多常用的Oracle数据库操作,包含了基础数据库连接.关闭连接.输出记录集.执行Sql语句,返回带分页功能的dataset .取表里字段的类型和长 ...

  2. iOS中MVC等设计模式详解

    iOS中MVC等设计模式详解 在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来.(事实证明这是值得的!) 模型-视图-控制器(MVC)设计 ...

  3. oracle数据库的完整性约束规则详解

    CSDN日报20170303--<百亿互金平台救火故事> 程序员2月书讯 社区有奖问答--一起舞动酷炫的iOS动画 基于Spark的分布式深度学习和认知计算 oracle数据库的完 ...

  4. iOS 视图控制器转场详解

    iOS 视图控制器转场详解 前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标有了大幅度的增长,多谢唐巧前辈的推荐.有些人问我相关的问题 ...

  5. SQL Server数据库ROW_NUMBER()函数使用详解

    SQL Server数据库ROW_NUMBER()函数使用详解 摘自:http://database.51cto.com/art/201108/283399.htm SQL Server数据库ROW_ ...

  6. iOS 开发之照片框架详解(2)

    一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLib ...

  7. oracle数据库exp/imp命令详解

    转自http://wenku.baidu.com/link?url=uD_egkkh7JtUYJaRV8YM6K8CLBT6gPJS4UlSy5WKhz46D9bnychTPdgJGd7y6UxYtB ...

  8. iOS 6分享列表——UIActivityViewController详解

    iOS 6分享列表——UIActivityViewController详解 2013-06-03 01:42:33     发表评论 在iOS 6之后提供了一个分享列表视图,它通过UIActivity ...

  9. iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

    本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...

随机推荐

  1. WCF 服务端异常封装

    通常WCF服务端异常的详细信息只有在调试环境下才暴露出来,但我目前有需求需要将一部分异常的详细信息传递到客户端,又需要保证一定的安全性. 最简单的办法当然是在服务端将异常捕获后,序列化传给客户端,但这 ...

  2. bat批量目光声明

    写bat同一批次,盯着函数应使用.这个程序对可读性 在批处理,凝视节还有一种更常用的方法: goto start      = 能够是多行文本,能够是命令      = 能够包括重定向符号和其它特殊字 ...

  3. NET开发面向对象2

    面向对象 (2) 继续上一篇<ASP.NET开发,从二层至三层,至面向对象>http://www.cnblogs.com/insus/p/3822624.html .我们了解到怎样把自己的 ...

  4. openGL线s的绘制

    /** * 缓冲区工具类 */ public class BufferUtil { /** * 将浮点数组转换成字节缓冲区 */ public static ByteBuffer arr2ByteBu ...

  5. 实现Client Credentials Grant

    [OAuth]基于DotNetOpenAuth实现Client Credentials Grant   Client Credentials Grant是指直接由Client向Authorizatio ...

  6. Binder机制,从Java到C (7. Native Service)

    1.什么是NativeService Native Service,是通过C或C++代码写出來,提供给Java进行远程调用的RemoteService.向Android开机就启动的surfacefli ...

  7. linux下telnet mysql的3306断口,提示Can't connect to MySQL server on localhost (110)

    新购买的阿里云ECS服务器,食用lnmp环境,安装完毕后,telnet localhost 3306提示Can't connect to MySQL server on localhost (110) ...

  8. Block formatting context

    不会JS中的OOP,你也太菜了吧!(第一篇)   一.你必须知道的 1) 字面量 2) 原型 3) 原型链 4) 构造函数 5) 稳妥对象(没有公共属性,而且其方法也不引用this的对象.稳妥对象适合 ...

  9. javascript full screen 全屏显示 页面元素

    javascript full screen 全屏显示 页面元素 要想让页面的某个元素全屏显示,就像在网页上看视频的时候,可以全屏观看一样,该怎么实现呢? 一种最简单的方式,就是动态改变你想要全屏显示 ...

  10. addEventListener和attachEvent以及element.onclick的区别

    addEventListener和attachEvent以及element.onclick的区别 attachEvent是ie添加事件处理程序,接收两个参数,其中事件类型名称要加"on&qu ...