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"];
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"database_name"];
2 打开iPhone上的sqlite3的数据库文件
sqlite3 *database;
sqlite3_open([path UTF8String], &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);
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);
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);
过程将回到没有执行之前的状态,绑定的参数不会变化。
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 *)getDataBasePath
{
NSString* path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString* filePath = [path stringByAppendingPathComponent:@"database.db"];
// NSString* filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Document/database.db"];
return filePath;
}
打开数据库
- (void)openDatabase
{
//1、获取文件路径
NSString* filePath = [self getDataBasePath];
//2、oc字符串--->c字符串
const char * filename = [filePath UTF8String];
//3、打开数据库 :如果数据库文件存在直接打开,不存在,系统会在该路径下创建同名文件.
//1‘ 数据库文件名 c字符串
//2‘ 数据库对象 sqlite3 **ppDb
int rc = sqlite3_open(filename,&_database);
//SQLITE_OK 操作成功
//数据库打开失败
if (rc != SQLITE_OK) {
//关闭数据库:
sqlite3_close(_database);
//插入断言:如果条件表达式的值为NO,程序崩溃,会输出参数2的值
//1'<#condition#>条件判断
//2'desc 程序崩溃后输出的字符串
NSAssert(NO, @"数据库打开失败,请检查文件路径");
}else{
NSLog(@"数据库打开成功");
}
}
数据表创建
- (IBAction)createTable:(id)sender
{
//1、打开数据库
[self openDatabase];
//2、创建表的SQL语句: ContactTable
NSString* createSql = @"CREATE TABLE ContactTable (name TEXT,phone TEXT) ";
char* errmsg = nil;
//3、执行创建表的sql语句:
//1' 数据库对象
//2' SQL语句 -C字符串 将OC字符串转换成C字符串
//3' C语言的回调函数:类似于代理方法,NULL
//4' 回调函数中的第一个参数: NULL
//5' 执行的错误信息
int rc = sqlite3_exec(_database, [createSql UTF8String], NULL, NULL, &errmsg);
//SQLITE_OK 执行成功
//表的创建失败
if (rc != SQLITE_OK) {
NSLog(@"数据表创建失败");
}else{
NSLog(@"数据库表创建成功");
}
//使用完关闭数据库
sqlite3_close(_database);
}
插入数据
- (IBAction)insertData:(id)sender
{
//1.打开数据库
[self openDatabase];
//2.SQL语句:?代表字段内容的占位符,有几个字段需要几个"?"
NSString* insertSql = @"INSERT INTO ContactTable VALUES(?,?)";
//准备一个缓冲区 结构体
sqlite3_stmt * stmt = nil;
//3、准备插入数据:将sql语句转化成字节码,并不执行语句
//1' 数据库对象
//2' sql语句c字符串
//3' sql语句的长度:strlen函数获取strlen([insertSql UTF8String],此处一般填写-1,代表从sql语句的第一个字符 读取到 第一个终止符;读取完整地sql语句
//4' 语句的缓冲区
//5' pzTail:如果参数3指定的不是完整地sql语句,此参数会保留剩余的部分;NULL
int rc = sqlite3_prepare_v2(_database, [insertSql UTF8String], -1, &stmt, NULL);
//如果数据准备完成 :SQLITE_OK
if (rc == SQLITE_OK) {
//4、将内容绑定到缓存区:
//1' 指定的缓存区
//2' 字段索引:从1开始;默认每一条记录都会添加一个ROWID
//3' 字段的值:c字符串
//4' 字符串的长度
//5' 函数指针:NULL
NSString* name = @"zhangsan";
sqlite3_bind_text(stmt, 1, [name UTF8String], strlen([name UTF8String]),NULL);
NSString* phone = @"电话号码";
sqlite3_bind_text(stmt, 2, [phone UTF8String], strlen([phone UTF8String]), NULL);
//5、执行sql语句,如果绑定过程发生错误,会将缓存区的内容置空
int rc = sqlite3_step(stmt);
//执行插入操作是否成功
//SQLITE_DONE:如果执行成功,表示插入一条记录执行完毕,没有下一条记录
//SQLITE_ROW:执行一条记录完成,还有下一条记录
if (rc == SQLITE_DONE) {
NSLog(@"插入数据成功");
}else{
NSLog(@"插入数据失败____%s",sqlite3_errmsg(_database));
}
//6、释放缓存区 : 句柄
sqlite3_finalize(stmt);
}
//7、关闭数据库
sqlite3_close(_database);
}
删除数据
- (IBAction)deleteData:(id)sender
{
//1、打开数据库
[self openDatabase];
//2、sql语句
NSString* deleteSql = @"DELETE FROM ContactTable WHERE name = 'zhangsan'";
//3、缓存区
sqlite3_stmt* stmt = NULL;
//4、准备sql语句
int rc = sqlite3_prepare_v2(_database, [deleteSql UTF8String], strlen([deleteSql UTF8String]), &stmt, NULL);
//5、准备完成,
if (rc == SQLITE_OK) {
//6、执行sql语句
if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@"数据删除完成");
}
//7、释放缓存区
sqlite3_finalize(stmt);
}
//8、关闭数据库
sqlite3_close(_database);
}
修改数据
- (IBAction)upDateData:(id)sender
{
//1.打开数据库
[self openDatabase];
//2.SQL语句
// NSString* updateSql = @"UPDATE ContactTable SET phone = '18909091234' WHERE name = 'zhangsan'";
NSString* updateSql = @"UPDATE ContactTable SET phone = '18909091234' WHERE ROWID = 1";
//3.缓存区
sqlite3_stmt* stmt = NULL;
//4.准备sql
int rc = sqlite3_prepare_v2(_database, [updateSql UTF8String], -1, &stmt, NULL);
//5.准备完成
if (rc == SQLITE_OK) {
//6.执行sql
if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@"数据更新成功");
}else{
NSLog(@"数据更新失败");
}
//7.释放缓存区
sqlite3_finalize(stmt);
}
//8.关闭数据库
sqlite3_close(_database);
}
查询
- (IBAction)queryData:(id)sender
{
//装取出的每一条记录
NSMutableArray* mArray = [NSMutableArray array];
//1.打开数据库
[self openDatabase];
//2.sql语句
NSString* querySql = @"SELECT * FROM ContactTable";
//3.准备一个缓存区
sqlite3_stmt* stmt = NULL;
//4.准备读取数据:
int rc = sqlite3_prepare_v2(_database, [querySql UTF8String], -1, &stmt, NULL);
//5.准备完成
if (rc == SQLITE_OK) {
//6.执行sql:如果有多条数据,或者不知道数据库中有多少行数据,使用while循环执行
//如果执行完毕,返回SQLITE_DONE,不再走while语句;如果还有下一条数据,返回SQLITE_ROW,继续进入while循环
while (sqlite3_step(stmt) == SQLITE_ROW) {
//7.从缓存区取数据:
//1' 缓存区
//2' 字段索引: 从0开始
char* name = (char *)sqlite3_column_text(stmt, 0);
char * phone =(char *)sqlite3_column_text(stmt, 1);
//将C字符串--->OC字符串
NSString* nameStr = [[NSString alloc] initWithUTF8String:name];
// [NSString stringWithUTF8String:name];
NSString* phoneStr = [[NSString alloc] initWithUTF8String:phone];
//每条记录都有电话和姓名:放在数组中,一个数据代表一条记录
[mArray addObject:nameStr];
[mArray addObject:phoneStr];
}
//释放缓存区:写在while循环外
sqlite3_finalize(stmt);
}
for (id object in mArray) {
NSLog(@"取出的数据为____%@",object);
}
//关闭数据库
sqlite3_close(_database);
}
http://blog.youkuaiyun.com/xingxing513234072/article/details/24426307