IOS开发学习笔记之数据存储

++ 数据存储++
ios中常用的持久化数据的方法:
1、属性列表:Xcode的Property List;再序列化到文件中,使用NSString、NSArray或NSDirectory等的writeToFile方法;主要用于解决硬编码问题;
2、对象归档
3、SQLite3:
4、Core Data:是一种ORM技术;本质上是通过sqlite或二进制文件、内存形式来存储;
[另外还包括C语言的I/O调用;Cocoa的底层文件管理工具。]

对象归档
Applications目录:
Documents:应用数据存储在Documents中,但基于NSUserDefaults的首先项除外;
Library:基于NSUserDefaults的首选项设置存储在Library/Preferences文件夹中;
tmp:供应用存储临时文件。

 //返回Documents的路径
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSLog(@"Document path is %@",paths[0]);
    //获取temp的路径
    NSString *temPath = NSTemporaryDirectory();
    NSLog(@"temp path is %@",temPath);

归档(archiving):是指另一种形式的序列化,是任何对象都可以实现的更常规的类型。必须遵循NSCoding协议(类似java中的Serializable);
同NSCopying

//实现NSCoding的方法
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]) {
        _age = [aDecoder decodeIntegerForKey:kAgeKey];
    }
    return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeInteger:_age forKey:kAgeKey];
}

存档归档操作:

 //归档存储
    NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    //存入数据
    [archiver encodeObject:myObj forKey:@"keyString"];
    //进行提交
    [archiver finishEncoding];
    //写入到文件系统
    BOOL success = [data writeToFile:path atomically:YES];
    /*******从存档中读取数据重组对象***********/
    NSData *readData = [[NSData alloc] initWithContentsOfFile:path];
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:readData];
    //读取数据
    obj = [unarchiver decodeObjectForKey:@"keyString"];
    //告知归档程序完成
    [unarchiver finishDecoding];

+SQLite3+
ios已提供了ORM(对象关系映射)的解决方案:Core Data;
导入头文件#import <sqlite3.h>
SQlite3是采用可移植的C(非Object-C)编写的,因此字符串不用加@;对于NSString 使用 [str UTF8String]转换面C下的String;
须先导入sqlite3的相关库:
选中项目—> TARGETS下的项目名—->Build Phases—>Link Binary with Libraries —> 点击+,在弹出的面板中搜索sqlite3,并add
相关操作:

 sqlite3 *database;
    int result = sqlite3_open("/path/to/database", &database);
    if (result == SQLITE_OK) {
        //数据库打开成功
        char *errorMsg;
        const char *createSQL = "create table if not exists Student(ID INTEGER PRIMARY KEY AUTOINCREMENT,msg TEXT)";
        int excResult = sqlite3_exec(database, createSQL, NULL, NULL, &errorMsg);
        if (excResult == SQLITE_OK) {
            //执行sql成功
        }else{
            //执行sql失败
        }
        NSString *query = @"select ID,msg from Student order by ID";
        sqlite3_stmt *statement;
        //查询到statement中
        sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil);
        //遍历结果集
        while (sqlite3_step(statement) == SQLITE_ROW) {
            int rowNum = sqlite3_column_int(statement, 0);
            char *rowData = (char *)sqlite3_column_text(statement, 1);
            //转成OC的数据模型
            NSString *msg = [NSString stringWithUTF8String:rowData];
        }
        //标识查询遍历完成
        sqlite3_finalize(statement);
        //绑定变量操作
        char *insertSql = "insert into Student values(?,?)";
        sqlite3_stmt *insertStmt;
        if (sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, nil)==SQLITE_OK) {
            //预处理成功,对指定的字段绑定值
            //第一个问题对应的值设为235
            sqlite3_bind_int(insertStmt, 1, 235);
            //对第二个?对应的值设为Good Student;-1可直接代替Good Student的长度。最后一个参数一个函数,用于做一些在语句执行完成后做一些清理操作,一般是使用malloc使用一些清理操作
            sqlite3_bind_text(insertStmt, 2, "Good Student", -1, NULL);
        }
        if (sqlite3_step(insertStmt)==SQLITE_DONE) {
            //用表示SQLITE_DONE数据更新成功
        }
    }
    //使用完成后关闭数据库
    sqlite3_close(database);

[注意:在C语言中,若两个内联的字符串之间只有空白(包括换行符)而没有其他字符,那么这两个字符串会被连接到一起,故一般使用NSString 后再转换成C下的字符串]
【在需要频繁使用数据库时,可能有必要始终打开连接】

+Core data +
是苹果的一款稳定、功能全面的持久化工具;是一种包装了sql操作的可视化工具;内部是使用sqlite持久化数据,但不需要写sql语句,只需要操作对象,由内部的Core data完成;
数据存储在Document目录下;
【但除使用sqlite保存外也可指定使用二进制文件或内存形式来存储】
New File -> Data Model,生成一个.xcdatamodel文件;该文件包含我们的数据模型。可用于直观的设计数据模型而无需编写代码,并将数据模型存储在.xcdatamodel文件中;不需要创建类,而是先在数据模型编辑器中直接创建实体,然后在代码中为这些实体创建托管对象;
实体的3个属性:
特性(attribute):与实例变量在OC类中的作用是完全相同的,都用于保存数据;
关系(relationship):实体间的对应关系,如外键关联等;
提取属性(fetched property):是关系的一个备选方法,可创建一个可在提取时被评估的查询,从而确定哪些对象属于这个关系。通常是一对一的关系;也是唯一一种能跨越多个数据存储的关系;
操作:
NSManagedObjectModel:被管理对象模型,是系统中的实体,与数据库中的表等对象相对应;
NSManagedObjectContext:被管理对象上下文,可查找、删除和插入对象,然后再同步到持久化存储中;
NSPersistentStoreCoordinator:持久化存储协调器;在持久化对象上提供了一个接口可认为是与数据库的连接;

博客地址:IOS开发学习笔记之数据存储

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容