博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS 数据存储之 SQLite详解
阅读量:4578 次
发布时间:2019-06-08

本文共 5025 字,大约阅读时间需要 16 分钟。

转自  

作者: 

出处: 

 

 

在IOS开发中经常会需要存储数据,对于比较少量的数据可以采取文件的形式存储,比如使用plist文件、归档等,但是对于大量的数据,就需要使用数据库,在IOS开发中数据库存储可以直接通过SQL访问数据库,也可以通过ORM进行对象关系的映射,当然也可以选择使用第三方框架实现对数据库的操作。在这里,主要来讲解一下第一种方式,SQLite。

SQLite

数据库有很多,分为重量级和轻量级两类,移动设备的内存比较小,因此需要选择轻量级的数据库。在移动设备上应用程序开发中使用数据库,比较主流的是SQLite。SQLite支持跨平台,虽然是轻量级的数据库,但是它的功能很强大,其功能不亚于很多大型的关系数据库。

SQLite基于C语言开发的轻型数据库,因此需要使用C语言语法进行数据库操作、访问,不能直接使用OC语言访问数据库。此外,SQLite中采用的是动态数据类型,即使创建时定义了一种类型,在实际操作时也可以存储其他类型,但是推荐建库时使用合适的类型,特别是应用需要考虑跨平台的情况时。

SQLite可以直接在代码中使用,但是在开发的过程中,最好安装一个可以直接打开数据库的工具,来验证对数据库的操作是否正确,方便程序调试。大家可以去  下载Mac OSX系统下的命令行工具,也可以使用类似于SQLiteManager、MesaSQLite等工具。

数据库的使用,主要包括对数据库的打开关闭、创建表格、对数据库中的数据进行增删改查以及更新等操作,实际上也就是通常所讲的SQL语句,SQLite中的SQL语法并没有太大的差别,因此这里对于SQL语句的内容不过多赘述,大家可以参考其他SQL相关的内容,在这里,我们来详细讲解一下在IOS开发中的SQLite的使用。

SQLite使用步骤:

1. 在项目中导入libsqlite3.0.dylib框架

2. 获取数据库的路径,一般是获得获得沙盒中Document文件夹路径,然后拼接得到数据库路径

3. 创建或者打开数据库,需要注意的是,在打开的时候需要使用C语言,因此需要先将路径转为C的字符串,然后通过sqlite3_open()打开数据库,如果文件存在则直接打开,否则创建并打开。根据sqlite3_open()返回值来判断是否正确成功打开,如果成功打开,就可以使用得到的sqlite3类型的对象,来对数据库进行其他操作。

4. 执行写好的SQL语句,对数据库进行操作,执行SQL语句有两种,一种是无返回值语句,比如创建、增加、删除等,一种是有返回值的语句,比如查询。

(1). 对于无返回值的语句(如增加、删除、修改等)直接通过sqlite3_exec()函数执行,因此可以封装一个方法,用于除查询以外的操作

(2). 对于有返回值的语句则首先通过sqlite3_prepare_v2()进行sql语句评估(语法检测),然后通过sqlite3_step()依次取出查询结果的每一行数据,对于每行数据都可以通过对应的sqlite3_column_类型()方法获得对应列的数据,如此反复循环直到遍历完成。当然,最后需要释放句柄。

5. SQLite操作是持久连接,在整个操作过程中无需管理数据库连接,如果使用完毕,可以选择通过sqlite3_close()手动关闭数据库

SQLite使用代码

导入框架,如图所示

//  ViewController.m//  JRSQLite查询3//// Created by jerehedu on 15/6/16. // Copyright (c) 2015年 jerehedu. All rights reserved. // #import "ViewController.h" #import 
@interface ViewController () { sqlite3 *db; //声明数据库对象 } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 获得数据库路径 // 获得沙盒中Document文件夹路径 NSString *dbPath = [self getUserDocumentPath]; // 拼接得到数据库路径 NSString *sqlitePath = [dbPath stringByAppendingPathComponent:@"test.sqlite"]; // 创建或打开数据库 const char *p = [sqlitePath UTF8String]; int res = sqlite3_open(p, &db); if (res==SQLITE_OK) { NSLog(@"db open"); //
<一>
创建表格 NSString *sql = @"create table if not exists temps (t_id integer primary key autoincrement,t_name varchar(20) )"; if ([self execNoQueryWithSQL:sql]) { NSLog(@"table temps is created"); } //
<二>
插入数据 NSString *insert_Sql = @"insert into temps (t_name) values ('pear')"; if ([self execNoQueryWithSQL:insert_Sql]) { NSLog(@"table insert "); } //
<三>
删除数据 NSString *delete_sql = @"delete from temps where t_id=2"; if ([self execNoQueryWithSQL:delete_sql]) { NSLog(@"table delete "); } //
<四>
修改数据 NSString *update_sql = @"update temps set t_name='ios' where t_id=1"; if ([self execNoQueryWithSQL:update_sql]) { NSLog(@"table update "); } //
<五>
查询简单的数据1 NSString *select_sql1 = @"select * from temps where t_id=1"; sqlite3_stmt *stmt1 = [self execQueryWithSQL:select_sql1]; while (sqlite3_step(stmt1) == SQLITE_ROW) { //按照当前列的类型选数据,列数从0开始 int t_id = sqlite3_column_int(stmt1, 0); const unsigned char *t_name = sqlite3_column_text(stmt1, 1); NSString *name = [NSString stringWithUTF8String:(char*)t_name]; NSLog(@"%i %@",t_id,name); } //释放stmt statement sqlite3_finalize(stmt1); //
<五>
查询数据2 参数化的sql语句 查找id>2 并且名字以p开头的 //用?占位 int seachId2 = 2; NSString *seach_name = @"p%"; NSString *seach_sql = @"select * from temps where t_id>? and t_name like ?"; sqlite3_stmt *stmt6 = [self execQueryWithSQL:seach_sql andWithParams:@[[NSNumber numberWithInt:seachId2],seach_name]]; //准备执行(相当于点击run query),执行的时候是一行一行的执行 while (sqlite3_step(stmt6) == SQLITE_ROW) { //按照当前列的类型选数据,列数从0开始 int t_id = sqlite3_column_int(stmt6, 0); const unsigned char *t_name = sqlite3_column_text(stmt6, 1); NSString *name = [NSString stringWithUTF8String:(char*)t_name]; NSLog(@"..>>>>>>...%i %@",t_id,name); } sqlite3_finalize(stmt6); } // 关闭数据库 sqlite3_close(db); } #pragma mark - 获得沙盒sandbox里面document文件夹路径 - (NSString *)getUserDocumentPath { NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentPath = [path firstObject]; return documentPath; } #pragma mark - 执行除查找以外的数据库操作方法 -(BOOL)execNoQueryWithSQL:(NSString*)sql { /* 执行 参数1:sqlite3 对象 参数2:c形式的 sql语句 参数3:回调函数 参数4:回调函数的参数 参数5:错误信息(可以char类型指针接受错误信息,用来查错使用) */ if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, NULL) == SQLITE_OK) { return YES; } return NO; } #pragma mark 返回查询结果集(简单无参) -(sqlite3_stmt *)execQueryWithSQL:(NSString*)sql { //执行sql语句之后,返回的结果语句 sqlite3_stmt *stmt; /* 准备执行查询的sql语句 (相当于把查询语句写好) 参数3:sql语句长度,通常用-1表示(系统会自动计算),也可以用strlength函数计算 参数4:sql_stmt对象 (执行的对象) 参数5:未执行的sql语句 */ int pre_res = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL); //如果准备成功 if (pre_res == SQLITE_OK) { return stmt; } return NULL; } #pragma mark - 返回查询结果集(有参数的) -(sqlite3_stmt *)execQueryWithSQL:(NSString *)sql andWithParams:(NSArray *)params { sqlite3_stmt *stmt; int pre_res = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL); if (pre_res == SQLITE_OK) { //有参数,循环绑定参数 if (params!=nil) { for (int i=0; i

转载于:https://www.cnblogs.com/fromus/p/6768919.html

你可能感兴趣的文章
poj1001--Exponentiation
查看>>
Python基础(迭代)
查看>>
webpack -p无效解决方式
查看>>
使用 PHP 获得网页内容 GET方式
查看>>
TJU Problem 2857 Digit Sorting
查看>>
C# 修饰符
查看>>
Centos以rpm方式进行安装MySql
查看>>
supervisor
查看>>
洛谷P1081 开车旅行70分
查看>>
Linux中用户及用户组
查看>>
python常用sql语句
查看>>
退休惠普九大感言——根源(虽然不是孙振耀写的,但正如孙振耀本人所说:写这篇文章的人对大家的影响、启发,内容比谁来写更有意义)...
查看>>
IE 下a标签在 position:absolute 后无法点击的问题
查看>>
jquery 正则表达式
查看>>
mysql查询更新时的锁表机制分析(只介绍了MYISAM)
查看>>
JDBC如何调用存储过程
查看>>
扫盲记-第五篇--图像全景分割
查看>>
Haproxy安装与配置
查看>>
Linux之Ganglia源码安装
查看>>
Android中的Handler,Looper,Message机制
查看>>