iOS开发 - OC - 实现本地数据存储的几种方式二(直接使用sqlite)
连接上一篇文章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开发者来说,使用来并不是难事。
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)的更多相关文章
- iOS开发 - OC - 实现本地数据存储的几种方式一
iOS常用的存储方式介绍 在iOS App开发过程中经常需要操作一些需要持续性保留的数据,比如用户对于App的相关设置.需要在本地缓存的数据等等.本文针对OC中经常使用的一下存储方式做了个整理. 常用 ...
- 数据存储的两种方式:Cookie 和Web Storage
数据存储的两种方式:Cookie 和Web Storage 1.Cookie Cookie的作用就像你去超市购物时,第一次给你办张购物卡,这个购物卡里存放了一些你的个人信息,下次你再来这个连锁超市时, ...
- 数据存储的两种方式:Cookie 和Web Storage(转)
数据存储的两种方式:Cookie 和Web Storage 数据存储的两种方式:Cookie 和Web Storage 1.Cookie Cookie的作用就像你去超市购物时,第一次给你办张购物卡 ...
- iOS 开发之 - 关闭键盘 退出键盘 的5种方式
iOS 开发之 - 关闭键盘 退出键盘 的5种方式 1.点击编辑区以外的地方(UIView) 2.点击编辑区域以外的地方(UIControl) 3.使用制作收起键盘的按钮 4.使用判断输入字元 5 ...
- iOS开发简单高效的数据存储
在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题,你是用什么方法来持久保存数据的?这是在几乎每一次关于iOS技术的交流或讨论都会被提到的问题,而且大家对这个问题的热情持续高涨.本文主要从概 ...
- 数据存储常用5种方式plist、Preference、NSCoding、SQLite3、Core Data
数据存储 iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data ...
- Android数据存储的三种方式:SharePreferences , file , SQLite
(1)SharePreferences: 存入: SharedPreferences setter = this.getSharedPreferences("spfile", 0) ...
- android 数据存储的四种方式.
Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放 ...
- android 数据存储的几种方式
总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式:数据库用起稍烦锁一些,但它有它的优点,比如在海量数 ...
随机推荐
- OpenGL阴影,Shadow Mapping(附源程序)
实验平台:Win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): 本文描述图形学的两个最常用的阴影技术之一,Shadow Mapping方法(另一种是Sh ...
- 使用第三方框架vapor和swift 搭建本地服务器
在网上看到一篇教程,使用vapor搭建服务端,自己记录下来备忘本文主要记录以下几点 1.配置好Vapor 2.用Swift写GET,POST方法,返回JSON数据 3.配置本地服务器,编译运行在浏览器 ...
- SQL_函数
五毛叶 — SQL_函数: 如下: 1 SQL_Aggregate函数 AVG() - 返回平均值 COUNT() - 返回行数 FIRST() - 返回第一个记录的值 LAST() - 返回最后一个 ...
- Github注册账户过程
首先打开网站https://github.com/ 第一个是输入用户名第二个是邮箱第三个是自己的密码然后点 sign up for github 此时会有个邮箱注册的验证进入注册的邮箱点击认证. ...
- Laravel框架数据库CURD操作、连贯操作使用方法
Laravel框架数据库CURD操作.连贯如何来操作了这个操作性是非常的方便简单了我们在这里来为各位介绍一篇相关的教程,具体的细节步骤如下文介绍. Laravel是一套简洁.优雅的PHP Web开 ...
- S3C2416 看门狗
原理:看门狗自己有个硬件计数器,看门狗开启后,计数器就开始计数,当计数为0时触发,触发事件有两个:系统复位和中断,可设置屏蔽. 在计数器计数到0之前,程序可以重新设置计数器中的数值,称之喟狗.计数器的 ...
- 1月12日,HTML学习笔记2
妈蛋,这两天看HTML看上瘾了,感觉这玩意有点简单,反馈期太短了,我的python都荒废了/(ㄒoㄒ)/~~. 不多说了,把记录贴上来,到时过几天再拿出来整理一下,写上注释,顺便当做复习 去研究css ...
- oracle单机改变归档路径
oracle 归档日志文件路径设置 1. 查看LOG_ARCHIVE_DEST 与 ( LOG_ARCHIVE_DEST_n 或 DB_RECOVERY_FILE_DEST )参数情况注意( LO ...
- flask在windows上用mod_wsgi部署
flask在windows上用mod_wsgi部署也是折腾了不少时间,下面就总结下. 首先下载Apache httpd,我认为Apache Hans比较好: 一般这种情况下,你的python环境已经安 ...
- [zz]利用碎片时间健身
利用碎片时间健身(上) http://v.163.com/zixun/V96957QH6/VBSQ4D861.html#from=zixunplay_recommended 利用碎片时间健身(下) h ...