连接上一篇文章http://www.cnblogs.com/FBiOSBlog/p/5819418.html。

上一篇文章介绍了OC内部一些方法进行数据的本地存储,其中包括 NSUser类、Plist文件、解归档、手动沙盒存储。这里将继续介绍其他的存储方式。本文主针对Sqlite的存储做一点介绍。

不管是CoreData还是大部分其他的第三方DB,因为数据的轻量级,都是基于sqlite实现存储的。目前使用的主流是sqlite3,为了帮助更好的理解(我自己也在初学 阶段),我们先从最基本的数据操作接触,然后再详细探究CoreData和其他的第三方库DB库。

1.理解sqlite

这里对于sqlite有一些常识性的解答,了解即可。OC中,对于Sqlite的支持使用的是一套C语言的API,对于OC开发者来说,使用来并不是难事。

http://baike.baidu.com/link?url=neYYKTETK-UuQL5ZyFWyn_DRk3dq8cR28NmqGzqtmiqQIQzuPuwD_yZsoN2FxU61okPRN2g-BH14nlgJby29aK

2.基本的sqlite操作/使用。

对于我们普通的使用人员来说,我们关心的是如何使用数据达到存储数据的要求。接下来,我就使用一个小小的案例展示:

1).搭建sqlite使用环境。

2).创建数据/关闭数据库

3).对数据库中的数据进行增删改查

1).Xcode项目中,搭建sqlite使用环境。

添加sqlite依赖库,target >build phases> link binary with libraries ,搜索sqlite ,发现有两个库类:libsqlite3.tdb,libsqlite3.0.tdb,理论上来说添加哪一个都是一样的,不同的是libsqlite3.0.tdb 指向的是库的当前版本最新的libsqlite3.tdb,也即是当Xcode库更新,程序依赖的库也随之更新。如非必要,建议添加 libsqlite3.0.tdb。

比如我们需要写一个操作sqlite 的工具 SqliteTool,为了保证当前数据库在工程里是唯一的,我们用单例的方式创建SqliteTool。在这之前应该为SqliteTool添加头文件   #import <sqlite3.h>。

SqliteTool.h 文件

#import <Foundation/Foundation.h>
#import <sqlite3.h> @interface SqliteTool : NSObject
+ (SqliteTool *)shareinstance; @end

.m文件

#import "SqliteTool.h"

#import "TestModel.h"

@implementation SqliteTool

{

sqlite3 *_dbPoint;  //用于保存数据库对象的地址

}

+ (SqliteTool *)shareinstance{

static SqliteTool *tool = nil;

static dispatch_once_t oneToken;

dispatch_once(&oneToken, ^{

tool=[[SqliteTool alloc] init];

});

return tool;

}

这样,在SqliteTool中我们配置好了使用环境。下一步是使用。

2).创建数据/关闭数据库

打开数据库。iOS 中,数据库存储在沙盒中,上一篇讲到,如果数据并不是很大并希望跟随应用备份,那么数据应该存Documents文件中。

我们给SqliteTool添加一个方法

   - (BOOL)creatSqliteDB 

  创建数据库:
//如果系统根据这个文件路径查找的时候有对应文件则直接打开数据库,如果没有则会创建一个相应的数据库
- (BOOL)creatSqliteDB{
NSString *sqitePath = [NSHomeDirectory() stringByAppendingPathComponent:@"testModel.sqlite"];

int result = sqlite3_open([sqitePath UTF8String], &_dbPoint); //在指定路径下,创建一个数据,并将数据库的地址赋值给_dbPoint

    if (result == SQLITE_OK) {
        NSLog(@"数据库打开成功");
NSLog(@"%@",sqitePath);
return YES;
}else{
NSLog(@"数据库打开失败");
}
return NO;
}

给SqliteTool添加一个方法

- (BOOL)closeSqliteDB

关闭数据库

- (BOOL)closeSqliteDB{
int result = sqlite3_close(_dbPoint);
if (result==SQLITE_OK) {
NSLog(@"数据库关闭成功");
return YES; }else{
NSLog(@"数据库关闭失败");
}
return NO;
}

3).使用数据库进行数据的增删改查

创建好了Sqlite,接下来我们要使用SqliteTool工具对TestModel类进行存储了。 当然基本数据类型一样可以存储。 假设TestModel类的属性是这样的:

.h

#import <Foundation/Foundation.h>

@interface TestModel : NSObject <NSCoding>

@property (nonatomic,strong) NSString *name;

@property (nonatomic,assign) NSInteger age;

@property (nonatomic,strong) NSString *sex;

@end

我希望SqlilteTool能够存贮这个testModel,往下看。

我们在存储数据的时候,先要在数据库中建立一张表,将数据存入表中。之后对表中的数据进行增删改查。意思就是将数据都写入一张表格里面,我们通过对表格操作来进行数据的增删改查。

SqliteTool.h 中声明以下方法

//创建一个存储列表。 一个数据库可以创建很多列表,用来存储不同的对象。
- (BOOL)createTable; //往表中插入数据
- (void)insertModel:(TestModel *)model; //更新表中的数据
- (void)updateModel:(TestModel *)model; //删除表中的数据
- (void)deletedateModel:(TestModel *)model; //查看表中的数据
- (NSMutableArray *)selectAllModel;

.m实现

创建table

/*
创建一个存储列表。 一个数据库可以创建很多列表,用来存储不同的对象。 primary key 是主键的意思,主健在当前表里数据是唯一的,不能重复,可以唯一标识一条数据,一般是整数 autoincrement自增,为了让主键不重复,会让主键采用自增的方式 if not exists 如果没有表才会创建,防止重复创建覆盖之前数据 */
- (BOOL)createTable{
//语句中包涵的信息应该仔细, nsstring类型对应的是text 数组对应arr 整型对应integer 等等
NSString *sqlStr = @"create table if not exists test(number integer primary key autoincrement,name text,age integer,sex text)";
//执行这条sql语句
int result = sqlite3_exec(_dbPoint, [sqlStr UTF8String], nil, nil, nil); if (result == SQLITE_OK) {
NSLog(@"表创建成功");
return YES;
}else{
NSLog(@"表创建失败");
}
return NO;
}

增

//往表中插入数据
- (BOOL)insertModel:(TestModel *)model{
NSString *sqlStr=[NSString stringWithFormat:@"insert into test (name,age,sex) values ('%@','%ld','%@')",model.name,model.age,model.sex];
//执行sql语句
int result = sqlite3_exec(_dbPoint, [sqlStr UTF8String], nil, nil, nil);
if (result == SQLITE_OK) {
NSLog(@"添加%@成功",model.name);
return YES;
}else {
NSLog(@"添加model失败");
}
return NO;
}

删

//删除表中的内容
- (BOOL)deletedateModel:(TestModel *)model{ NSString *sqlStr=[NSString stringWithFormat:@"delete from test where name='%@'",model.name]; // NSString *sqlStr=[NSString stringWithFormat:@"delete from test"]; //不添加添加条件则删除所有数据 //执行sql语句
int result = sqlite3_exec(_dbPoint, [sqlStr UTF8String], nil, nil, nil);
if (result == SQLITE_OK) {
NSLog(@"删除%@成功",model.name);
return YES;
}else {
NSLog(@"删除失败");
}
return NO;
}

改

//更新表中的数据
- (BOOL)updateModel:(TestModel *)model{
NSString *sqlStr= [NSString stringWithFormat:@"update test set sex='%@',age=%ld where name='%@'",model.sex,model.age,model.name];
//执行sql语句
int result = sqlite3_exec(_dbPoint, [sqlStr UTF8String], nil, nil, nil);
if (result == SQLITE_OK) {
NSLog(@"修改成功");
return YES;
}else {
NSLog(@"修改失败");
}
return NO;
}

查

/*
查询逻辑
1.先从本地的数据库中读取某张表里的所有数据
2.然后逐条进行读取,对model进行赋值
3.把已经赋值好得model放到数组中,并且返回
4.在语句里*是通配符的意思,通过一个*相当于代替了表里的所有的字段名
5.接下来需要定义一个跟随指针,它用来遍历数据库表中的每行数据
6.第三个参数:查询语句字数限制,-1是没有限制
*/ //查看表中的数据
- (NSMutableArray *)selectAllModel{
NSString *sqlStr=@"select * from test";
sqlite3_stmt *stmt=nil;
int result=sqlite3_prepare_v2(_dbPoint, [sqlStr UTF8String], -, &stmt, nil);//这个方法相当于把数据库和跟随指针关联,一同完成查询功能 NSMutableArray *modelArr = [NSMutableArray array];
//初始化学生类数组 获取遍历得到的数据
if (result == SQLITE_OK) {
NSLog(@"查询成功");
//开始遍历查询数据库的每一行数据
while (sqlite3_step(stmt) == SQLITE_ROW) {
//让跟随指针进行遍历查询,如果没有行,才会停止循环
//满足条件,则逐列的读取内容
//第二个参数表示当前这列数据在表的第几列
const unsigned char *name = sqlite3_column_text(stmt, );
int age = sqlite3_column_int(stmt, );
const unsigned char *sex = sqlite3_column_text(stmt,);
//把列里的数据再进行类型的转换
NSInteger modelAge = age;
NSString *modelName = [NSString stringWithUTF8String:(const char *)name];
NSString *modelSex = [NSString stringWithUTF8String:(const char *)sex];
//给对象赋值,然后把对象放到数组里
TestModel *model = [[TestModel alloc] init];
model.name = modelName;
model.sex = modelSex;
model.age = modelAge;
[modelArr addObject:model];
}
}else{
NSLog(@"查询失败");
}
return modelArr;
}

方法写完,现在调用测试。

 //创建对象 并赋值
TestModel *model = [[TestModel alloc]init];
model.name = @"小明";
model.age = ;
model.sex = @"man"; TestModel *model1 = [[TestModel alloc]init];
model1.name = @"小花";
model1.age = ;
model1.sex = @"woman"; if([[SqliteTool shareinstance] creatSqliteDB]){
if([[SqliteTool shareinstance] createTable]){ //增
if([[SqliteTool shareinstance] insertModel:model] && [[SqliteTool shareinstance] insertModel:model1]){
NSLog(@"增加model、model1");
NSLog(@"%@",[[SqliteTool shareinstance] selectAllModel]);
} //删
if([[SqliteTool shareinstance] deletedateModel:model1]){
NSLog(@"删除model1");
NSLog(@"%@",[[SqliteTool shareinstance] selectAllModel]);
} //改 model.age = ;
//注意 这里因为是以名字作为索引对象,因此名字是不能修改的, 如果要修改名字,应该另外增加一个不变属性作为索引
if([[SqliteTool shareinstance] updateModel:model]){
NSLog(@"修改model");
NSLog(@"%@",[[SqliteTool shareinstance] selectAllModel]);
} //查
NSLog(@"%@",[[SqliteTool shareinstance] selectAllModel]); }
}

打印结果

iOS开发 - OC - 实现本地数据存储的几种方式二(直接使用sqlite)的更多相关文章

  1. iOS开发 - OC - 实现本地数据存储的几种方式一

    iOS常用的存储方式介绍 在iOS App开发过程中经常需要操作一些需要持续性保留的数据,比如用户对于App的相关设置.需要在本地缓存的数据等等.本文针对OC中经常使用的一下存储方式做了个整理. 常用 ...

  2. 数据存储的两种方式:Cookie 和Web Storage

    数据存储的两种方式:Cookie 和Web Storage 1.Cookie Cookie的作用就像你去超市购物时,第一次给你办张购物卡,这个购物卡里存放了一些你的个人信息,下次你再来这个连锁超市时, ...

  3. 数据存储的两种方式:Cookie 和Web Storage(转)

    数据存储的两种方式:Cookie 和Web Storage   数据存储的两种方式:Cookie 和Web Storage 1.Cookie Cookie的作用就像你去超市购物时,第一次给你办张购物卡 ...

  4. iOS 开发之 - 关闭键盘 退出键盘 的5种方式

    iOS 开发之 - 关闭键盘 退出键盘 的5种方式   1.点击编辑区以外的地方(UIView) 2.点击编辑区域以外的地方(UIControl) 3.使用制作收起键盘的按钮 4.使用判断输入字元 5 ...

  5. iOS开发简单高效的数据存储

    在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题,你是用什么方法来持久保存数据的?这是在几乎每一次关于iOS技术的交流或讨论都会被提到的问题,而且大家对这个问题的热情持续高涨.本文主要从概 ...

  6. 数据存储常用5种方式plist、Preference、NSCoding、SQLite3、Core Data

    数据存储 iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data ...

  7. Android数据存储的三种方式:SharePreferences , file , SQLite

    (1)SharePreferences: 存入: SharedPreferences setter = this.getSharedPreferences("spfile", 0) ...

  8. android 数据存储的四种方式.

    Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放 ...

  9. android 数据存储的几种方式

    总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式:数据库用起稍烦锁一些,但它有它的优点,比如在海量数 ...

随机推荐

  1. 《The Evolution of Lua》读书笔记 1

    lua的优点: 可移植性 容易嵌入 体积小 高效率 这些优点都来自于lua的设计目标:简洁.从Scheme获得了很多灵感,包括匿名函数,合理的语义域概念   lua前身: 巴西被禁运,引入计算机软件和 ...

  2. javascript onblur事件阻塞选中input框

    先上问题实例: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...

  3. MySQL 重装

    由于之前第一次装MySQL,默认的datadir在启动盘中,我想要将datadir移动到更大的存储盘中.无奈网上的各种文章的方法在我这里总是不work.我决定重新用homebrew来装一遍MySQL. ...

  4. button标签和input button

    一.定义和用法 <button> 标签定义的是一个按钮. 在 button 元素内部,可以放置文本或图像.这是<button>与使用 input 元素创建的按钮的不同之处. 二 ...

  5. UML(一) 类图及类间关系

    原创文章,同步发自作者个人博客,http://www.jasongj.com/uml/class_diagram/ UML类图 UML类图介绍 在UML 2.*的13种图形中,类图是使用频率最高的UM ...

  6. Hbuilder与svn快速连接并在手机上测试页面

    大家好,今天讲一下Hbuilder怎样与svn连接在一起,并且在移动端上面做真是的页面测试. 1,打开Hbuilder软件,在工具中,安装插件,找到svn插件安装. 2.点击文件,导入,从svn中检测 ...

  7. DOm4解析xml

    1.创建XML文档对象的的方式有两种 1)Document document=DocumentHelper.createDocument(); 2)DocumentFactory documentFa ...

  8. Kali Linux additional tools setup

    The steps are pretty straight forward. The only tool that might cause some confusion is SMBexec. Thi ...

  9. 策略模式(Strategy Pattern)

    策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 环境类(Context):用一个ConcreteStrategy对象来配置. ...

  10. linux根文件系统制作

    在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误. 那么根文件系统在系统启动中到底是什么时候挂载的呢?先将/dev/ram0挂载,而后执行/l ...