ios在SQLite3基本操作
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的数据库文件的地址
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"database_name"];
2 打开iPhone上的sqlite3的数据库文件
sqlite3_open([path UTF8String], &database);
3 准备sql文---sql语句
const char *sql = "SELECT * FROM table_name WHERE pk=? and name=?";
sqlite3_prepare_v2(database, sql, -1, &stmt, NULL);
4 邦定參数
sqlite3_bind_int(stmt, 1, 1);
// 邦定第二个字符串參数
sqlite3_bind_text(stmt, 2, [title UTF8String], -1, SQLITE_TRANSIENT);
5 运行sql文
6 释放sql文资源
7 关闭iPhone上的sqlite3的数据库
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);
过程将回到没有运行之前的状态,绑定的參数不会变化。
样例:
创建数据库
NSString *docsDir;
NSArray *dirPaths;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
databasePath = [[NSString alloc]initWithString:[docsDir stringByAppendingPathComponent:@"info.db"]];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:databasePath]==NO) {
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &dataBase)==SQLITE_OK) {
char *errmsg;
const char *createSql = "CREATE TABLE IF NOT EXISTS INFO (ID INTEGER PRIMARY KEY AUTOINCREMENT,NUM TEXT,CLASSNAME TEXT,NAME TEXT)";
if (sqlite3_exec(dataBase, createSql, NULL, NULL, &errmsg)!=SQLITE_OK) {
status.text = @"create table failed";
}
}
else{
status.text = @"create/open failled";
}
}
保存:
sqlite3_stmt *statement;
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &dataBase)==SQLITE_OK) {
if ([num.text isEqualToString:@""]) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"SORRY!" message:@"number cannot be nil!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
else {
NSString *insertSql = [NSString stringWithFormat:@"INSERT INTO INFO (num,classname,name) VALUES(\"%@\",\"%@\",\"%@\")",num.text,classname.text,name.text];
const char *insertsatement = [insertSql UTF8String];
sqlite3_prepare_v2(dataBase, insertsatement, -1, &statement, NULL);
if (sqlite3_step(statement)==SQLITE_DONE) {
status.text = @"save to DB.";
num.text = @"";
classname.text = @"";
name.text = @"";
}
else {
status.text = @"save failed!";
}
sqlite3_finalize(statement);
sqlite3_close(dataBase);
}
}
清除:
num.text = @"";
classname.text = @"";
name.text = @"";
status.text = @"";
查询:
const char *dbpath = [databasePath UTF8String];
sqlite3_stmt *statement;
if (sqlite3_open(dbpath, &dataBase)==SQLITE_OK) {
NSString *querySQL = [NSString stringWithFormat:@"SELECT classname,name from info where num=\"%@\"",num.text];
const char *querystatement = [querySQL UTF8String];
if (sqlite3_prepare_v2(dataBase, querystatement, -1, &statement, NULL)==SQLITE_OK) {
if (sqlite3_step(statement)==SQLITE_ROW) {
NSString *classnameField = [[NSString alloc] initWithUTF8String:(const char *)sqlite3_column_text(statement, 0)];
classname.text = classnameField;
NSString *nameField = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)];
name.text = nameField;
status.text = @"find~~~";
}
else {
status.text = @"did not find you need.";
}
sqlite3_finalize(statement);
}
sqlite3_close(dataBase);
}
其它工具函数
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。
然後在 console 下達下面指令 來產生 data.rdb 這個 sqlite file
iOS 專案使用 Sqlite 資料庫
先將剛才產生的資料庫增加專案中,然後在專案中增加 libsqlite3.0.dylib。
接下來开始撰寫程式碼了,xxxAppDelegate.h 必須 import sqlite3.h,並宣告一個 sqlite3 結構。
在 xxxAppDelegate.m 的 didFinishLaunchingWithOptions 函式 开始增加相關程式碼
簡 單說明一下,將 data.rdb 增加專案中後,該資料庫會出現在 app 套件內。但每個 app 就仅仅有專屬 Documents 目錄能够讀寫。所以必須判斷 Documents 目錄下該檔案是否存在。假设不存在則 copy 過去該目錄後再 open 資料庫。至於為什麼做判斷?為什麼不每次都 copy 過去就可以?因為假设不希望該資料庫在每次 app 版本号更新後,都會被覆蓋掉,就得做檔案存在與否的判斷。
讀取資料庫
有成功 open 資料庫之後。就能够开始進行讀寫了。
讀取資料庫的方法,其實也是非常簡單,仅仅要熟悉 SQL 語法,應該就沒什麼問題了。
当中必須注意的是 sqlite3_column_text, sqlite3_column_int 負責取得資料,必須指定是哪個 column index。
執行 SQL 命令
上述是 SELECT 的使用方法,可是假设须要做 INSERT, DELETE, UPDATE 等動作時。則更是簡單,仅仅需下面指令就可以。
ios在SQLite3基本操作的更多相关文章
- ios对SQLite3的使用
ios对SQLite3的使用 一.在Firefox中打开sqlite3(如果没有,选择工具->附加组件,添加即可)新建sqlite3数据库,Contacts, 建立一个members表,字段 i ...
- C语言SQLite3基本操作Demo
/************************************************************************** * C语言SQLite3基本操作Demo * 声 ...
- 使用iOS原生sqlite3框架对sqlite数据库进行操作
摘要: iOS中sqlite3框架可以很好的对sqlite数据库进行支持,通过面向对象的封装,可以更易于开发者使用. 使用iOS原生sqlite3框架对sqlite数据库进行操作 一.引言 sqlit ...
- iOS关于sqlite3操作
原文:http://hi.baidu.com/clickto/blog/item/0c6904f787c34125720eec87.html iPhone中支持通过sqlite3来访问iPhone本地 ...
- iOS之Sqlite3封装
一.代码下载 代码下载地址 二.实例效果展示 imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="效果图二.png&q ...
- iOS:转载sqlite3
SQLITE3 使用总结 2012-08-21 13:48:28 分类: SQLite/嵌入式数据库 SQLITE3 使用总结 2009-09-16 07:36 2624人阅读 评论(10) 收藏 ...
- iOS 数据库sqlite3.0操作--超简单--看我就够啦
iOS客户端数据存储的方式有很多,下面主要是介绍苹果自带的sqlite3.0的使用方法. 首先导入sqlite3.0的框架.然后导入头文件#import <sqlite3.h>就行了 下面 ...
- iOS- 简单说说iOS移动客户端SQLite3的基本使用
1.为什么要使用SQLite3? •大量数据需要存储 •管理数据,存储数据 SQLite是一种关系型数据库(也是目前移动客户端的主流数据库) 2.SQLite3的几种存储类型 a.NU ...
- sqlite3基本操作
在移动设备上进行高性能高效率的大量数据存储,我们一般用得时sqlite这款轻巧型的数据库,这里介绍其增删改查基本功能 在ios开发中我们需要先导入"libsqlite3.dylib" ...
随机推荐
- niu人
金步国简历 金步国简历 基本资料 姓名 金步国 性别 男 年龄 30 籍贯 江苏 淮安 院校 同济大学 专业 土木工程 学历 本科肄业 工作经验 5年 期望地点 长江以南 期望薪水 18000/月 个 ...
- 14.4.1 InnoDB Startup Configuration
14.4 InnoDB Configuration :InnoDB 配置: 14.4 InnoDB Configuration 14.4.1 InnoDB Startup Configuration ...
- 14.3.3 Locks Set by Different SQL Statements in InnoDB 不同的SQL语句在InnoDB里的锁设置
14.3.3 Locks Set by Different SQL Statements in InnoDB 不同的SQL语句在InnoDB里的锁设置 locking read, 一个UPDATE,或 ...
- Load and Unload
一.前言 在前一段时间,我遭遇了一个现象诡异的Bug,最后原因归结为在DllMain里错误地调用了FreeLibrary(在本文最后对此Bug有详细的解释). MSDN里关于禁止在DllMain里调用 ...
- ORALCE 之LRU链与脏LRU链【转载】
今天是2013-09-09,时别n久的一篇经典文章,有被我在google发现了,再次转载一下.学习一下. 一.LRU链: 任何缓存的大小都是有限制的,并且总不如被缓存的数据多.就像Buffer cac ...
- 算法 《秦九韶算法java实践》
[历史背景] 秦九韶算法是中国南宋时期的数学家秦九韶表述求解一元高次多项式的值的算法--正负开方术.它也能够配合牛顿法用来求解一元高次多项式的根.在西方被称作霍纳算法(Horner algorithm ...
- Android Application Fundamentals——Android应用程序基础知识
Application Fundamentals--应用程序基础知识 Key classes--关键类 Activity Service BroadcastReceiver ContentProvid ...
- grep命令参数和使用方法
功能说明:查找符合串的条件的文件. 语言 法国:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
- HttpGet协议与正则表达
使用HttpGet协议与正则表达实现桌面版的糗事百科 写在前面 最近在重温asp.net,找了一本相关的书籍.本书在第一章就讲了,在不使用浏览器的情况下生成一个web请求,获取服务器返回的内容.于 ...
- XML实例文档
from: http://www.w3school.com.cn/xpath/xpath_examples.asp XML实例文档 我们将在下面的例子中使用这个 XML 文档: "books ...