oc 实现本地存储的几种方式-倾城孤月

1.理解sqlite 

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

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

 

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

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

    1).搭建sqlite使用环境。工具

    2).建立数据/关闭数据库测试

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

 

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

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

      好比咱们须要写一个操做sqlite 的工具 SqliteTool,为了保证当前数据库在工程里是惟一的,咱们用单例的方式建立SqliteTool。在这以前应该为SqliteTool添加头文件   #import <sqlite3.h>。 spa

SqliteTool.h 文件3d

 

#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], -1, &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, 1);
            int age = sqlite3_column_int(stmt, 2);
            const unsigned char *sex = sqlite3_column_text(stmt,3);
            //把列里的数据再进行类型的转换
            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 = 25;
    model.sex = @"man";
    
    TestModel *model1 = [[TestModel alloc]init];
    model1.name = @"小花";
    model1.age = 23;
    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 = 28;
            //注意 这里由于是以名字做为索引对象,所以名字是不能修改的, 若是要修更名字,应该另外增长一个不变属性做为索引
            if([[SqliteTool shareinstance] updateModel:model]){
                NSLog(@"修改model");
                NSLog(@"%@",[[SqliteTool shareinstance] selectAllModel]);
            }
            
            //查
            NSLog(@"%@",[[SqliteTool shareinstance] selectAllModel]);
                
        }
    }
相关文章
相关标签/搜索