</br>
iOS中的数据存储方式主要有:
Plist (NSArray/NSDictionary)
Preference(偏好设置/NSUserDefaults)
NSCoding (NSKeyedArchiver/NSkeyedUnarchiver)
SQLite3
Core Data
共5种方式, 其中前三种可归纳为文件存储, 适用于简单少量数据存储, 不适用于大批量数据存储; 后两种为数据库存储, 可存储大量数据. 今天主要是对SQLite进行一个简单的封装.首先对SQLite进行简单的一个介绍:
SQLite是目前主流的轻量型嵌入式关系数据库. 它占用资源非常的低, 在嵌入式设备中, 可能只需要几百K的内存就够了, 它的处理速度比Mysql、PostgreSQL还快. 常见的适用于PC端的关系型数据库有Oracle、MySQL、SQL Server、DB2、Sybase, 而在嵌入式\移动客户端中, 我们主要使用的是SQLite. 下面直接上代码:
</br>
DataBaseHandler.h
#import <Foundation/Foundation.h>
#import <sqlite3.h>
@interface DataBaseHandler : NSObject
{
sqlite3 *dbPoint;
}
// 单例的创建方法
+ (DataBaseHandler *)shareInstance;
/**
* 打开数据库
*
* @param dbname 数据库名称
*
* @text 哪个方法
*/
- (void)openDb:(NSString *)dbname text:(NSString *)text;
/**
* 执行无返回值的sql
*
* @param sql sql语句
*
* @text 哪个方法
*/
- (void)executeNonReturnValue:(NSString *)sql text:(NSString *)text;
/**
* 执行有返回值的sql
*
* @param sql sql语句
*
* @return 查询结果
*/
- (NSArray *)executeHaveReturnValue:(NSString *)sql;
/**
* 判断数据库方法执行结果
*
* @param result 调用数据库方法返回的结果
*
* @text 哪个方法
*/
- (void)judgeResult:(int)result text:(NSString *)text;
@end
</br>
DataBaseHandler.m
#import "DataBaseHandler.h"
@implementation DataBaseHandler
+ (DataBaseHandler *)shareInstance
{
// 当第一次执行的时候会产生一个空指针
static DataBaseHandler *dbHandler = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 对指针进行判断, 当第一次执行的时候创建一个对象
if (dbHandler == nil) {
dbHandler = [[DataBaseHandler alloc] init];
}
});
// 无论是创建的和已经存在的, 都在这里直接return除去
return dbHandler;
}
- (void)openDb:(NSString *)dbname text:(NSString *)text
{
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *dbPath = [docPath stringByAppendingString:dbname];
// 参数1: 数据库文件存储的路径
// 参数2: 数据库dbPoint指针地址
// 返回值: 执行sqlite函数的结果(int类型)
int result = sqlite3_open([dbPath UTF8String], &dbPoint);
// 利用封装的方法判断结果
[self judgeResult:result text:text];
}
- (void)executeNonReturnValue:(NSString *)sql text:(NSString *)text
{
int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL);
[self judgeResult:result text:text];
}
- (NSArray *)executeHaveReturnValue:(NSString *)sql
{
// 创建一个可变数组, 用于存储数据
NSMutableArray *rows=[NSMutableArray array];
// 创建一个数据库的替身, 存储对数据库的所有操作
sqlite3_stmt *stmt = nil;
/**
* 让数据库执行sql语句, 并把结果保存到stmt中
*
* @param dbPoint 数据库指针
* @param UTF8String] sql语句
* @param -1 限制sql语句的长度(如果是-1, 就是不限制)
* @param stmt 替身指针的地址
* @param NULL 空
*
*/
int result = sqlite3_prepare_v2(dbPoint, [sql UTF8String], -1, &stmt, NULL);
// 判断是否正确
if (SQLITE_OK == result) {
// 当sql执行成功, 遍历数据
// 循环遍历所有的结果, 每次遍历到一条数据, 都会返回sqlite_row, 如果没有数据了, 就不会返回SQLITE_ROW, 跳出循环
while (SQLITE_ROW == sqlite3_step(stmt)) {
// 取int类型的数据
int columnCount = sqlite3_column_count(stmt);
// 创建一个可变字典, 用来存储数据
NSMutableDictionary *dic=[NSMutableDictionary dictionary];
for (int i = 0; i < columnCount; i++) {
// 在循环体中去按列取数据
// 取得列名
const char *name = sqlite3_column_name(stmt, i);
// 取得某列的值
const unsigned char *value = sqlite3_column_text(stmt, i);
// 将char *字符串转为NSString字符串
dic [[NSString stringWithUTF8String:name]] = [NSString stringWithUTF8String:(const char *) value];
}
[rows addObject:dic];
}
}
// 销毁stmt替身, 把里面的操作和结果写入本地sqlite文件
sqlite3_finalize(stmt);
return rows;
}
- (void)judgeResult:(int)result text:(NSString *)text
{
if (result == SQLITE_OK) {
NSLog(@"%@成功", text);
} else {
NSLog(@"错误代码: %d", result);
NSLog(@"%@失败",text);
}
}
@end
</br>
以上就是我们对SQLite的一个简单封装. 在实际开发当中, 我们还会经常用到iOS平台的SQLite数据库框架FMDB, FMDB以OC的方式封装了SQLite的C语言API, 大家可以googol一下, 或者参考一下git地址, 或者参考此文章FMDB的用法.