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嵌入式关系数据库)的更多相关文章

  1. iOS——sqlite3的使用(iOS嵌入式关系数据库)

    1>添加sqlite3动态库:libsqlite3.dylib,CoreGraphics.framework,UIKit.framework,Foundation.framework 2> ...

  2. 轻量级开源嵌入式关系数据库sqlite基本使用及接口初识

    preface,先闲来扯下蛋: 嵌入式数据库,NoSQL的是BerkeleyDB和InnoDB,leveDb.TC(个人较不熟悉),关系型嵌入式是SQLite; 服务器性质的NoSQL服务器,如Red ...

  3. 数据库sqlite3的使用-ios中引用方法

    一.简单说明 在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入主头文件. 导入头文件,可以使用库中的函数(是纯C语言的) 二.具体说明 新建一个项目,在项目的主界面 ...

  4. ios swift版 sqlite3详解

    iOS中的SQLite3的封装与详细应用 SQLite是一个开源的嵌入式关系数据库,特点是易使用.高效.安全可靠.可移植性强. iOS中的本地持久化存储 NSUserDefault:一般用于存储小规模 ...

  5. IOS数据持久化存储之SQLite3第三方库FMDB的使用

    SQLite是一种小型的轻量级的关系型数据库,在移动设备上使用是非常好的选择,无论是Android还是IOS,都内置了SQLite数据库,现在的版本都是SQLite3.在IOS中使用SQLite如果使 ...

  6. IOS学习笔记28—SQLite3第三方库之FMDB

    本文转载至 http://blog.csdn.net/happyrabbit456/article/details/11609451 SQLite是一种小型的轻量级的关系型数据库,在移动设备上使用是非 ...

  7. iOS中的数据持久化方式

    iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...

  8. IOS开发-本地持久化存储sqlite应用

    前言 需求描述 开发测试环境 FMDB介绍 创建工程 一.前言 上一章介绍了如何开发一个IOS应用的入门案例教程:                     我的第一个IOS开发应用    本章主要将介 ...

  9. iOS开发-数据持久化

    iOS中四种最常用的将数据持久存储在iOS文件系统的机制 前三种机制的相同点都是需要找到沙盒里面的Documents的目录路径,附加自己相应的文件名字符串来生成需要的完整路径,再往里面创建.读取.写入 ...

随机推荐

  1. 用python自定义实现db2的连接池

    想要模仿zabbix的oracle插件orabix来实现对db2的监控,但是Java能力有限,就用python来实现了.但是python常用的连接池PooledDB似乎并不支持db2,一直报这样的错误 ...

  2. mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案

    本人开发项目时,在从一个服务器导出数据库到另一服务器时,存储过程中,报Incorrect DECIMAL value: '0' for column '' at row -1错误. 原因: 存储过程中 ...

  3. ASP.NET调用Web Service

    1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...

  4. Linux下FTP服务(一)—— Ubuntu安装

    参考:http://www.cnblogs.com/likwo/p/3154868.html 实验环境:Ubuntu 14.04 VMware虚拟机1. 安装 apt-get install vsft ...

  5. Start cluster zookeeper in shell script

    cat start-zookeeper.sh #!bin/sh for node in namenode01 datanode01 datanode02 do         echo "s ...

  6. common-pool2对象池(连接池)的介绍及使用

    我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等.在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响.一种 ...

  7. hdu 5802 Windows 10 贪贪贪

    传送门:hdu 5802 Windows 10 题意:把p变成q:升的时候每次只能升1,降的时候如果前一次是升或者停,那么下一次降从1开始,否则为前一次的两倍 官方题解: 您可能是正版Windows ...

  8. HDU 4409 Family Name List --乱搞、LCA

    题意: 给出一些名字,名字间有父子关系,有三种操作: 1.按祖先到后代,兄弟间按字典序由小到大排序,然后输出 2.求某个节点的兄弟节点有多少个,包括自己(注意,根节点的兄弟节点是1) 3.求节点a和b ...

  9. UESTC 923 稳住GCD DP + GCD

    定义:dp[i][j] 表示 在前i个数中,使整个gcd值为j时最少取的数个数. 则有方程: gg = gcd(a[i],j) gg == j : 添加这个数gcd不变,不添加,  dp[i][j] ...

  10. Tarjian算法求强联通分量

    如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.强连通图有向图的极大强连通子图,称为强连通分量(strong ...