sqlite3的使用(iOS嵌入式关系数据库)
1>添加sqlite3动态库:libsqlite3.dylib,CoreGraphics.framework,UIKit.framework,Foundation.framework
2>导入头文件:#import<sqlite3.h>
3>利用C函数创建/打开数据库,编写SQL语句
自定义一个类DataBaseHandle继承NSObject
#import <Foundation/Foundation.h>
#import "Strategy.h"
@interface DataBaseHandle : NSObject
+(DataBaseHandle *)sharedInstance;
//打开数据库
-(void)openDB;
//关闭数据库
-(void)closeDB;
//插入新的数据
-(void)insertNewModel:(NSString *)name Data:(NSData *)data;
//删除某个保存的数据
-(void)deleteModelWithName:(NSString *)name;
//获取某个保存的数据
-(NSData *)selectModelWithName:(NSString *)name;
//获取所有的数据
-(NSArray *)selectAllModel;
//判断数据是否被保存
-(BOOL)isLoadModelWithName:(NSString *)name;
@end
下面是m文件的实现:
DataBaseHandle.m
#import "DataBaseHandle.h"
#import <sqlite3.h>
@implementation DataBaseHandle
static DataBaseHandle * handle = nil;
+(DataBaseHandle *)sharedInstance
{
if (handle == nil) {
handle = [[DataBaseHandle alloc] init];
}
return handle;
}
static sqlite3 *db=nil;
//打开数据库
-(void)openDB
{
if (db!=nil) {
return;
}
//存放数据库的路径和文件
NSString *path=NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
NSString *filePath=[path stringByAppendingPathComponent:@"Strategy.sqlite"];
// NSLog(@"db filePath=%@",filePath);
//打开数据库
int result=sqlite3_open([filePath UTF8String], &db);
if (result==SQLITE_OK) {
// NSLog(@"打开数据库成功");
NSString * createActivitySql = @"CREATE TABLE StrategyList (NAME TEXT PRIMARY KEY , data BLOB)";
//执行sql语句
sqlite3_exec(db, [createActivitySql UTF8String], NULL, NULL, NULL);
}
}
//关闭数据库
-(void)closeDB
{
int result=sqlite3_close(db);
if (result==SQLITE_OK) {
// NSLog(@"关闭数据库成功");
db=nil;
}
}
//插入新的数据
-(void)insertNewModel:(NSString *)name Data:(NSData *)data
{
[self openDB];
sqlite3_stmt *stmt=nil;
NSString *sql= @"insert into StrategyList (NAME,data) values (?,?)";
//验证sql语句
int result=sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
if (result==SQLITE_OK) {
//绑定数据
sqlite3_bind_text(stmt, 1, [name UTF8String], -1, nil);
sqlite3_bind_blob(stmt, 2, [data bytes], (int)[data length], nil);
sqlite3_step(stmt);
}
sqlite3_finalize(stmt);
}
//删除某个保存的数据
-(void)deleteModelWithName:(NSString *)name
{
[self openDB];
sqlite3_stmt *stmt=nil;
NSString *sql= @"delete from StrategyList where NAME = ?";
//验证sql语句
int result=sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
if (result==SQLITE_OK) {
//绑定数据
sqlite3_bind_text(stmt, 1, [name UTF8String], -1, nil);
sqlite3_step(stmt);
}
sqlite3_finalize(stmt);
}
//获取某个保存的数据
-(NSData *)selectModelWithName:(NSString *)name
{
[self openDB];
sqlite3_stmt * stmt = nil;
NSString * sql = @"select data from StrategyList where NAME = ?";
int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);
NSData * data = nil;
if (result == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, [name UTF8String], -1, NULL);
if (sqlite3_step(stmt) == SQLITE_ROW) {
//bytes length
data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 0) length:sqlite3_column_bytes(stmt, 0)];
}
}
sqlite3_finalize(stmt);
return data;
}
//获取所有的数据
-(NSArray *)selectAllModel
{
[self openDB];
sqlite3_stmt * stmt = nil;
NSString * sql = @"select NAME from StrategyList";
int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);
NSMutableArray * travelArray = [NSMutableArray array];
if (result == SQLITE_OK) {
while (sqlite3_step(stmt) == SQLITE_ROW) {
NSString * name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 0)];
[travelArray addObject:name];
}
}
sqlite3_finalize(stmt);
return travelArray;
}
//判断数据是否被保存
-(BOOL)isLoadModelWithName:(NSString *)name
{
NSData * data = [self selectModelWithName:name];
if (data == nil) {
return NO;
}
return YES;
}
@end
SQLite3在存储和检索大量的数据非常有效,结构化查询语言能够对数据进行复杂的聚合,与使用对象执行这些操作相比,获得的结果的速度更快。
假设app需要计算其中所有对象的特色字段的总和或者需要只符合特定条件的对象的总和,SQLite3可以不需要将所有对象加载到内存中就获取到这些信息。
SQLite3获取聚合比所有对象加载到内存,然后计算它们值的总和要快。
#import "ViewController.h"
#import <sqlite3.h>
@interface ViewController ()
@property(strong,nonatomic)IBOutletCollection(UITextField)NSArray *lineFields;
@end
@implementation ViewController
-(NSString *)dataFilePath{
//查找Document目录并在其后附加数据文件的文件名,这样就得到了数据文件的完整的路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
return [documentDirectory stringByAppendingPathComponent:@"data.sqlite"];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//打开数据库,如果在打开时遇到问题则关闭它并抛出一个断言错误
sqlite3 *database;
if (sqlite3_open([[self dataFilePath] UTF8String],&database)!= SQLITE_OK ){
sqlite3_close(database);
NSAssert(0, @"Failed to open database");
}
//创建一个CREATE 表来保存我们的数据,通过IF NOT EXISTS 可以防止数据库覆盖现有数据,如果有相同名称 的表此命令会直接退出不执行任何操作
NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FIELDS" "(ROW INTEGER PRIMARY KEY,FIELD_DATA TEXT);";
char *errorMsg;
if (sqlite3_exec (database,[createSQL UTF8String],NULL,NULL,&errorMsg)!= SQLITE_OK) {
sqlite3_close(database);
NSAssert(0, @"Error creating table:%s",errorMsg);
}
//使用SELECT语句加载数据,请求所有行,告诉sqlite3按行号排序各行,以便我们以相同顺序获取它们
NSString *query = @"SELECT ROW,FIELD_DATA FROW FIELDS ORDER BY ROW";
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database,[query UTF8String],-1,&statement,nil) == SQLITE_OK) {
//遍历返回的每一行
while (sqlite3_step(statement)== SQLITE_ROW) {
//抓取行号并将它存储在一个int变量中,然后抓取字段数据保存到C语言字符串中
int row = sqlite3_column_int(statement,0);
char *rowData = (char *)sqlite3_column_int(statement,1);
//利用数据库获取的值设置相应的字段
NSString *fileValue = [[NSString alloc]initWithUTF8String:rowData];
UITextField *theField = self.lineFields[row];
theField.text = fileValue;
}
//关闭数据库连接,操作到此结束
sqlite3_finalize(statement);
}
sqlite3_close(database);
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app];
}
//应用在终止运行或者进去后台之前保存数据
-(void)applicationWillResignActive:(NSNotification *)notification{
//再次打开数据库
sqlite3 *database;
if (sqlite3_open([[self dataFilePath] UTF8String],&database)!= SQLITE_OK ){
sqlite3_close(database);
NSAssert(0, @"Failed to open database");
}
for (int i =0; i< 4; i++) {
UITextField *theField = self.lineFields[i];
//生成4条独立命令来更新数据库中的每一行
char *update = "INSERT OR REPLACE INTO FIELDS (ROW,FIELD_DATA)""VALUED(?,?);";
char *errorMsg = NULL;
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(database,update,-1,&stmt,nil) == SQLITE_OK) {
sqlite3_bind_int(stmt,1,i);
sqlite3_bind_text(stmt,2,[theField.text UTF8String],-1,NULL);
}
//step语句执行更新。
if (sqlite3_step(stmt)!= SQLITE_DONE){
NSAssert(0, @"Error update table:%s",errorMsg);
sqlite3_finalize(stmt);
}
}
sqlite3_close(database);
}
@end
sqlite3的使用(iOS嵌入式关系数据库)的更多相关文章
- iOS——sqlite3的使用(iOS嵌入式关系数据库)
1>添加sqlite3动态库:libsqlite3.dylib,CoreGraphics.framework,UIKit.framework,Foundation.framework 2> ...
- 轻量级开源嵌入式关系数据库sqlite基本使用及接口初识
preface,先闲来扯下蛋: 嵌入式数据库,NoSQL的是BerkeleyDB和InnoDB,leveDb.TC(个人较不熟悉),关系型嵌入式是SQLite; 服务器性质的NoSQL服务器,如Red ...
- 数据库sqlite3的使用-ios中引用方法
一.简单说明 在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入主头文件. 导入头文件,可以使用库中的函数(是纯C语言的) 二.具体说明 新建一个项目,在项目的主界面 ...
- ios swift版 sqlite3详解
iOS中的SQLite3的封装与详细应用 SQLite是一个开源的嵌入式关系数据库,特点是易使用.高效.安全可靠.可移植性强. iOS中的本地持久化存储 NSUserDefault:一般用于存储小规模 ...
- IOS数据持久化存储之SQLite3第三方库FMDB的使用
SQLite是一种小型的轻量级的关系型数据库,在移动设备上使用是非常好的选择,无论是Android还是IOS,都内置了SQLite数据库,现在的版本都是SQLite3.在IOS中使用SQLite如果使 ...
- IOS学习笔记28—SQLite3第三方库之FMDB
本文转载至 http://blog.csdn.net/happyrabbit456/article/details/11609451 SQLite是一种小型的轻量级的关系型数据库,在移动设备上使用是非 ...
- iOS中的数据持久化方式
iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...
- IOS开发-本地持久化存储sqlite应用
前言 需求描述 开发测试环境 FMDB介绍 创建工程 一.前言 上一章介绍了如何开发一个IOS应用的入门案例教程: 我的第一个IOS开发应用 本章主要将介 ...
- iOS开发-数据持久化
iOS中四种最常用的将数据持久存储在iOS文件系统的机制 前三种机制的相同点都是需要找到沙盒里面的Documents的目录路径,附加自己相应的文件名字符串来生成需要的完整路径,再往里面创建.读取.写入 ...
随机推荐
- URL、表单数据、IP等处理类
<?php class ev { public $cookie; public $post; public $get; public $file; public $url; public $G; ...
- 安全初始化MySql服务器
我们在安装完MySql服务器,设置好MySql的root用户密码后,就直接开始使用了,其实这样的MySql服务器还存在着一些不安全因素, 本篇演示一下用命令mysql_secure_installat ...
- 学习HTML5必读之《HTML5设计原理》
引子:很久前看过的一遍受益匪浅的文章,今天再次转过来,希望对学习HTML5的朋友有所帮助. 今天我想跟大家谈一谈HTML5的设计.主要分两个方面:一方面,当然了,就是HTML5.我可以站在这儿只讲HT ...
- PS网页设计教程XXIV——从头设计一个漂亮的网站
作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,“熟读唐诗三百首,不会作诗也会吟”. 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试 ...
- char,vchar,nchar,nvchar的区别
char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据.所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在 ...
- [转]Responsive Tables Demo
本文转自:http://elvery.net/demo/responsive-tables/ A quick and dirty look at some techniques for designi ...
- 【ASP.NET 基础】Page类和回调技术
Page 类有一个 IsPostBack 属性,这个属性用来指示当前页面是第一次加载还是响应了页面上某个控件的服务器事件导致回发而加载. 1.asp.net页面的声明周期 asp.net页面运行的时候 ...
- 边工作边刷题:70天一遍leetcode: day 89-1
Smallest Rectangle Enclosing Black Pixels 要点:记题:这题有两个限制条件:所有black pixel是连通的(所以可以用binary search)以及给了一 ...
- UESTC 1080 空心矩阵
这题理解题意最重要,千万不要理解错.题意是取矩阵的左上角,所以能切掉的都要切掉,是能形成三角形的形成三角形,不能的尽量割掉最大.代码借鉴了一位大牛的,如下: #include<iostream& ...
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...