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]);
                
        }
    }
相關文章
相關標籤/搜索