iOS 开发指南 第11章 数据持久化之属性列表 学习

1 概述

沙箱目录:一种安全策略,原理是只能允许自己的应用访问目录,而不许其他应用访问。

子目录:Documents 用于储存非常大的文件或需要非常频繁更新的数据

NSArray *documentDirectory=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

documentDirectory是只有一个元素的数组,还需要取出路径

NSString *myDocPath=[documentDirectory objectAtIndex:0];

Library Preferences用于存放应用程序的设置数据 Caches用于存放缓存文件

tmp 临时文件目录 NSString *temDirectory=NSTemporaryDirectory();

2 持久化方式 数据储存方式

属性列表:是XML文件,数组和字典可以与属性列表文件相互转换。

NSArray和NSDictionary提供了读写属性列表文件的方法:+array/dictionaryWithContentsOfFile:

-initWithContentOfFile:

writeToFile:atomically:是否使用辅助文件

获取文件代码:

- (NSString *)applicationDocumentsDirectoryFile {获取沙箱Documents目录文件的完整路径
    NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [documentDirectory stringByAppendingPathComponent:@"NotesList.plist"];

    return path;
}
- (void)createEditableCopyOfDatabaseIfNeeded {

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *writableDBPath = [self applicationDocumentsDirectoryFile];获取文件目录
    判断文件是否存在:fileExistsAtPath:
    BOOL dbexits = [fileManager fileExistsAtPath:writableDBPath];
    if (!dbexits) {若不存在则复制一个
        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"NotesList.plist"];

        NSError *error;
        BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
        NSAssert(success, @"错误写入文件");断言函数,第一个参数为假时抛出异常
    }
}

读取与写入文件代码:程序的插入/删除/查询等无非是文件的操作

//插入Note方法
-(int) create:(Note*)model
{
    NSString *path = [self applicationDocumentsDirectoryFile];
    NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:path];

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat: @"yyyy-MM-dd HH:mm:ss"];
    将传入的数据封装成文件所需格式
    NSDictionary* dict = [NSDictionary
                          dictionaryWithObjects:@[[dateFormat stringFromDate: model.date],model.content]
                          forKeys:@[@"date",@"content"]];
    *setValue:forKey:    *
    [array addObject:dict];

    [array writeToFile:path atomically:YES];

    return 0;
}

//删除Note方法
-(int) remove:(Note*)model
{
    NSString *path = [self applicationDocumentsDirectoryFile];
    NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:path];

    for (NSDictionary* dict in array) {

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        是把value取出来而不是key比较
        //Note* note = [[Note alloc] init];
        NSDate *date = [dateFormatter dateFromString:[dict objectForKey:@"date"]];
        //note.content = [dict objectForKey:@"content"];

        //比较日期主键是否相等
        if ([date isEqualToDate:model.date]){
            [array removeObject: dict];
            [array writeToFile:path atomically:YES];
            break;
        }
    }

    return 0;
}

//修改Note方法
-(int) modify:(Note*)model
{

    NSString *path = [self applicationDocumentsDirectoryFile];
    NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:path];

    for (NSDictionary* dict in array) {

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

        NSDate *date = [dateFormatter dateFromString:[dict objectForKey:@"date"]];
        NSString* content = [dict objectForKey:@"content"];

        //比较日期主键是否相等
        if ([date isEqualToDate:model.date]){
            [dict setValue:content forKey:@"content"];
            [array writeToFile:path atomically:YES];
            break;
        }
    }
    return 0;
}

//查询所有数据方法
-(NSMutableArray*) findAll
{
    NSString *path = [self applicationDocumentsDirectoryFile];

    //[self.listData removeAllObjects];
    NSMutableArray *listData = [[NSMutableArray alloc] init];

    NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:path];

    for (NSDictionary* dict in array) {

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

        Note* note = [[Note alloc] init];
        note.date = [dateFormatter dateFromString:[dict objectForKey:@"date"]];
        note.content = [dict objectForKey:@"content"];

        [listData addObject:note];

    }
    return listData;
}

//按照主键查询数据方法
-(Note*) findById:(Note*)model
{
    NSString *path = [self applicationDocumentsDirectoryFile];
    NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:path];

    for (NSDictionary* dict in array) {

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

        Note* note = [[Note alloc] init];
        note.date = [dateFormatter dateFromString:[dict objectForKey:@"date"]];
        note.content = [dict objectForKey:@"content"];

        //比较日期主键是否相等 日期字段是主键
        if ([note.date isEqualToDate:model.date]){
            return note;
        }
    }
    return nil;
}
时间: 2024-08-02 07:00:08

iOS 开发指南 第11章 数据持久化之属性列表 学习的相关文章

iOS 开发指南 第11章 数据持久化之对象归档 学习

1 是一种序列化方式,先将归档对象序列化为一个文件,然后再通过反归档将数据恢复到对象中. 条件:该对象的类必须实现NSCoding协议,而且每个成员变量应该是基本数据类型或都是实现NSCoding协议的某个类的实例. 归档类NSKeyedArchiver 反归档类NSKeyedUnarchiver  NSData类提供了读取数据文件的方法 方法:+dataWithContentsOfFile: +dataWithContentsOfFile:options:指定读取数据选项error: -ini

iOS 开发指南 第11章 数据持久化之SQLite 学习

1 SQLite是无数据类型的数据库,就是字段不用指定类型.但从编程规范上说,应该在Create Table语句中指定数据类型:INTERGER 有符号的整数类型 REAL 浮点类型 TEXT 字符串类型 BLOB二进制类型 2 创建数据库: 准备:添加SQLite3库到工程中 TARGETS-Link Binary With Libraries-添加libsqlite3.dylib 使用sqlite3_open打开数据库-使用sqlite3_exec执行Creat Table语句,创建数据库-

iOS开发指南 第7章 视图控制器与导航模式 学习

1 概述 分类:平铺导航模式 标签导航模式 树形导航模式 2 模态视图 必须要一个单独的模态视图控制器 呈现 代码方法:presentViewController:animated:completion: 故事板segue方式 关闭 dismissViewControllerAnimated:completion: 获取navigationBar:拖拽一个 Editor-Embed in-Navigation Controller 创建一个navigation controller interf

ios开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

               在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运用: 在本节,将通过对4个文本框内容的创建.修改,退出后台,再重新回到后台,来认识这两种持久化数据的方式.效果图如下[图1]: [图1 GUI界面效果图] [本次开发环境: Xcode:7.2     iOS Simulator:iphone6S plus   By:啊左]     一.数据库SQL

iOS数据持久化之---属性列表

属性列表(plist) iOS提供了一种plist格式的文件(属性列表)用于存储轻量级的数据,并且只能保存NSDictionary.NSArray.NSString.NSNumber.Boolean.NSData.NSDate 类型的数据.将这些类型的数据保存为plist格式文件,该格式保存的数据可以直接使用NSDictionary和NSArray读取 (一).使用NSUserDefault 实现持久化   下面来看下 NSUserDefault 本地保存的位置,数据持久化之沙盒目录有提及.Li

IOS 开发指南 第5章 委托协议 数据源协议 高级视图学习

1 委托对象负责控制控件的外观和对控件的事件和状态作出反应 数据源对象是控件与应用数据(model)的桥梁,一般是必须实现的. 2 选择器 UIPickerView 为用户提供选择 1)日期选择器 UIDatePicker 设置属性检查器中的各个属性-代码 -setDateFormat:设置日期格式 -stringFromDate:获取时间 - (IBAction)onclick:(id)sender { NSDate * theDate = self.datePicker.date;获取选中日

IOS开发指南 第6章 表视图 学习

1 概述 结构:表头视图(table header view),表脚视图(table footer view),节(section),单元格(cell) 相关类:UITableViewCell UITableViewController UITableViewHeaderFooterView 委托协议和数据源协议 分类:普通表视图:用于动态表 分组表视图:用于静态表,进行界面布局 单元格的组成:图标 标题 拓展视图 样式:拓展视图由枚举类型UITableViewCellAccessoryType

iOS 开发指南 第15章 访问Web Service之数据交换格式

“自描述的”结构化文档 1 XML文档结构 声明:定义了XML文件的版本和使用的字符集 <> 根元素:开始标签  结束标签 子元素:开始标签 结束标签 属性:  定义在开始标签中 属性名 属性值(放置在双引号或单引号之间) 一个元素不能有多个名字相同的属性. 命名空间:为XML文档提供名字唯一的元素和属性 ************ XML 命名空间提供避免元素命名冲突的方法. XML Namespace (xmlns) 属性 XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:

iOS开发指南 第8章 iOS常用设计模式 学习

设计模式是在特定场景下对特定问题的解决方案 1 单例模式 作用:解决“应用中只有一个实例”的问题,这个实例的作用是全局的,比如说是可以实现一些共享资源 方法的访问和状态的保持 实现原理:一般会封装一个静态属性,并提供静态实例的创建方法. *********** James Rumbaugh对类的定义是:类是具有相似结构.行为和关系的一组对象的描述符.类是面向对象系统中最重要的构造块.类图显示了一组类.接口.协作以及他们之间的关系. 建立类图的步骤: (1)研究分析问题领域确定系统需求. (2)确