OC 中数据持久化 sqlite3 的使用

来源:互联网 发布:电线传输数据 编辑:程序博客网 时间:2024/05/16 12:08

       OC 中数据持久化的方案一般为: plist文件,用户偏好设置,归档,sqllite/core data. 对于较大的数据量一般采用 sqlite 或 core data,归档效率太低,而core data 是对 sqlite 的oc 封装,性能上直接使用 sqlite 更优.只需要编写一些简单的 sqlite 语句就可进行 CRUD 操作.

直接上代码:

    (eg: 一个对象有name,filename,icon...等等属性,假如现在要将用户的收藏对象保存数据库进行 CRUD 操作)

   模型:

   

@interface ZMMusicModel : NSObject<NSCoding>

@property (copy,nonatomic) NSString *name;

@property (copy,nonatomic) NSString *icon;

@property (copy,nonatomic) NSString *filename;

@property (copy,nonatomic) NSString *lrcname;

@property (copy,nonatomic) NSString *singer;

@property(nonatomic,copy)NSString* singerIcon;

-(instancetype) initWithDict:(NSDictionary*)dict;

+(instancetype) musicWithDiet:(NSDictionary*)dict;

+(NSArray*)plist;


/*!

 *  添加数据

 */

-(void)insertMusic;


/*!

 *  移除数据

 */

-(void)deleteMusic;


/*!

 *  用户当前选中的歌曲是否已经收藏

 */

-(BOOL)isCollect;

@end

  
 .m 文件
 
  

#import "ZMMusicModel.h"

#import "YCollectManager.h"


@implementation ZMMusicModel


-(instancetype) initWithDict:(NSDictionary*)dict

{

    self=[superinit];

    if (self) {

        [selfsetValuesForKeysWithDictionary:dict];

    }

  

    returnself;

}

+(instancetype) musicWithDiet:(NSDictionary*)dict

{


    return [[selfalloc] initWithDict:dict];


}


+(NSArray*)plist

{

    NSString* paths=[[NSBundlemainBundle] pathForResource:@"Musics.plist"ofType:nil];

    NSArray* array=[NSArrayarrayWithContentsOfFile:paths];

    NSMutableArray* arrayM=[[NSMutableArrayalloc] init];

    for (NSDictionary* tmpin array) {

        [arrayM addObject:[selfmusicWithDiet:tmp]];

    }

    return arrayM;

}


// 添加数据

-(void)insertMusic

{

    NSString* strSQL = [NSStringstringWithFormat:@"INSERT INTO t_student (name, icon,filename,lrcname,singer,singerIcon) VALUES ('%@', '%@', '%@', '%@', '%@', '%@')",self.name,self.icon,self.filename,self.lrcname,self.singer,self.singerIcon];

    if([[YCollectManagershareInstance] execSQL:strSQL]){

        NSLog(@"数据插入成功");

    }

}


// 删除数据


-(void)deleteMusic

{

   NSString* strSQL = [NSStringstringWithFormat:@"DELETE FROM t_student WHERE name = '%@'",_name];

    if([[YCollectManagershareInstance] execSQL:strSQL])

    {

        NSLog(@"数据删除成功");

    }else{

        NSLog(@"数据删除失败");

    }

}


// 2.判断是否已经收藏数据


-(BOOL)isCollect

{

    NSString* strSQL = [NSStringstringWithFormat:@"SELECT name, filename FROM t_student WHERE name = '%@'",self.name];

    

    // 2.执行查询语句

    NSArray *dictArray = [[YCollectManagershareInstance] querySQL:strSQL];

    

    return  dictArray.count >0 ? YES :NO;

}

@end




 封装收藏工具类:

 .h 文件

@interface YCollectManager :NSObject

+(instancetype)shareInstance;


// 打开数据库

-(BOOL)OpenSQL;


-(BOOL)execSQL:(NSString*)strSQL;


/*!

 *  查询数据库中的所有数据

 */

- (NSArray *)querySQL:(NSString *)querySQL;


/*!

 *  获取所有用户收藏的数据

 */

-(NSArray*)collect;


@end


.m文件

    

#import "YCollectManager.h"

#import "ZMMusicModel.h"

#import <sqlite3.h>

@interface YCollectManager()


@property(nonatomic,assign)sqlite3* db;


@end

@implementation YCollectManager

static  YCollectManager* _instance;


+(instancetype)shareInstance

{

    staticdispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        _instance = [[YCollectManageralloc] init];

    });

    return_instance;

}


-(BOOL)OpenSQL

{

    NSString* fileName =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES).firstObject;

    fileName = [fileName stringByAppendingPathComponent:@"music.sqlite"];

    if(sqlite3_open(fileName.UTF8String,&_db) != SQLITE_OK){

        returnNO;

    }

    //能来到这里就是打开成功 创表

    return [selfcreatTable];

}


-(BOOL)creatTable

{

    NSString* strSQL =@"CREATE TABLE IF NOT EXISTS 't_student' ('id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'name' TEXT,'icon' TEXT ,'filename' TEXT ,'lrcname' TEXT ,'singer' TEXT ,'singerIcon' TEXT )";

    return [selfexecSQL:strSQL];

}


-(BOOL)execSQL:(NSString*)strSQL

{

  return sqlite3_exec(self.db, strSQL.UTF8String,nil, nil,nil) == SQLITE_OK;

}


- (NSArray *)querySQL:(NSString *)querySQL

{

    // 定义游标对象

    sqlite3_stmt *stmt =nil;

    if (sqlite3_prepare_v2(self.db, querySQL.UTF8String, -1, &stmt,nil) !=SQLITE_OK) {

        NSLog(@"准备查询失败");

        returnnil;

    };

    // 准备成功,开始查询数据

    NSMutableArray *dictArray = [NSMutableArrayarray];

    while (sqlite3_step(stmt) ==SQLITE_ROW) {

        int count =sqlite3_column_count(stmt);

        NSMutableDictionary *dict = [NSMutableDictionarydictionary];

        for (int i =0; i < count; i++) {

            constchar *cKey =sqlite3_column_name(stmt, i);

            NSString *key = [NSStringstringWithUTF8String:cKey];

            constchar *cValue = (constchar *)sqlite3_column_text(stmt, i);

            NSString *value = [NSStringstringWithUTF8String:cValue];

            [dict setValue:valueforKey:key];

        }

        [dictArray addObject:dict];

    }

    return dictArray;

}


/**ZMMusicModel 为对象模型*/

-(NSArray*)collect

{

    NSString* strSQL =@"SELECT name, icon,filename,lrcname,singer,singerIcon  FROM t_student";

    // 2.执行查询语句

    NSArray *dictArray = [[YCollectManagershareInstance] querySQL:strSQL];

    // 将字典转模型

    NSMutableArray* arrM = [NSMutableArrayarray];

    for (NSDictionary* dictin dictArray) {

        ZMMusicModel* model = [[ZMMusicModelalloc] initWithDict:dict];

        [arrM addObject:model];

    }

    return arrM;

}

@end



使用规则: 1> 对数据库的操作 添加数据/删除数据  是封装在模型中,所以其使用的时候当我们拿到要进行操作模型对象的时候就可对数据库进行 添加/删除 了。
         2> 另外将模型已 字段(属性)的方式直接写进数据库比将模型直接放进数据库有一点好处就是我们可以通过
Navigate 打开数据库文件看到里面的数据,就算使用 fmdb 将模型写进数据库的前提是:要先将模型归档-->在转化成 NSData 存进数据库,NSData 看不到里面的数据是什么.


      


 

0 0
原创粉丝点击