应用程序离不开数据的永久存储,有两种方式实现存储:数据库和文本文件。

作为存储管理器,最基本的功能就是增删改查了。

CoreData

1、插入

AppDelegate *app = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [app managedObjectContext];
NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"entityname" inManagedObjectContext:context];
[newManagedObject setValue:value forKey:@"propertyname"];
NSError *error;
if (![context save:&error]) { // Handle the error…
}

2、查询

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Hero" inManagedObjectContext:managedObjectContext];
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc]initWithKey:@”name” ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc]initWithKey:@”secretIdentity” ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor1, sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:];
NSArray *objecs = [context executeFetchRequest: fetchRequest error:&error];
if(objets==nil || error != nil){
  //做处理
}

3、修改

-(void)applicationWillResignActive:(NSNotification *)notification{
NSLog(@"applicationWillResignActive");
//创建托管对象上下文
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"User" inManagedObjectContext:context];
[request setEntity:entityDescription]; NSManagedObject *user = nil;
NSError *error;
NSArray *objets = [context executeFetchRequest:request error:&error];
if(objets==nil){
NSLog(@"There has a error!");
//做错误处理
}
if([objets count]>){
//非第一次,更新数据
NSLog(@"更新操作");
user = [objets objectAtIndex:];
}else{
NSLog(@"插入操作");
//第一次保存,插入新数据
user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:context];
}
[user setValue:self.serverIp.text forKeyPath:@"serverIp"];
[user setValue:self.userName.text forKeyPath:@"userName"];
[context save:&error];
}

4、删除

NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext;
[context deleteObject:[objecs objectIndex:index];
NSError *error;
if (![context save:&error]) {
NSLog(@”Unresolved error %@, %@”, error, [error userInfo]);
exit(-); // Fail
}

5、数据迁移

当程序变化时,在很多简单的情况下,Coredata提供了轻量级的自动数据迁移,比如以下三个情况可以通过开启CoreData自动迁移实现:
1.简单的增加一个字段
2.把一个必填字段改为可选字段
3.把可选字段改为必填字段(但一定要定义默认值)

文本读写

  文本是存储在外存上的字节序列,进程需要在内存中创建缓冲区(通常称之为“流”或“stream”,NSData和NSOutputStream的实例都对应“流”的概念),然后再进行读写,不过NSData一般配合NSArchiver一起使用来存储对象,对于文本读写、网络传输,一般用NSOutputStream来作为缓冲区,一个缓冲区对象封装一些读写方法告诉线程如何进行读写。

  在下面的例子中,进程调用inputData将学生数据插入对象关系数据库,在调用queryStudents读取学生信息,暂存在输出流NSOutputStream的实例中,然后写入CSV文本文件。

- (void)createFile:(NSString *)fileName;
- (void)exportCSV:(NSString *)fileName;
- (NSArray *)queryStudents; //控件关联方法
- (IBAction)inputData:(id)sender { AppDelegate *app = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = app.managedObjectContext; Student *stu = (Student *)[NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context];
stu.name = self.nameTextField.text;
stu.num = self.numTextField.text; NSError *error = nil;
[context save:&error]; self.nameTextField.text = @"";
self.numTextField.text = @"";
} - (IBAction)makeCSV:(id)sender { NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDirectory, YES);
NSString *docementDir = [documents objectAtIndex:];
NSString *filePath = [docementDir stringByAppendingPathComponent:@"student.csv"];
NSLog(@"filePath = %@", filePath); [self createFile:filePath];
[self exportCSV:filePath];
} //私有方法
- (void)createFile:(NSString *)fileName { NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager removeItemAtPath:fileName error:nil];
if (![fileManager createFileAtPath:fileName contents:nil attributes:nil]) {
NSLog(@"不能创建文件");
} } - (void)exportCSV:(NSString *)fileName { NSOutputStream *output = [[NSOutputStream alloc] initToFileAtPath:fileName append:YES];
[output open]; if (![output hasSpaceAvailable]) {
NSLog(@"没有足够可用空间");
} else {
NSString *header = @"学好,姓名\n";
const uint8_t *headerString = (const uint8_t *)[header cStringUsingEncoding:NSUTF8StringEncoding];
NSInteger headerLength = [header lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
NSInteger result = [output write:headerString maxLength:headerLength];
if (result <= ) {
NSLog(@"写入错误");
} NSArray *students = [self queryStudents];
for (Student *stu in students) {
NSString *row = [NSString stringWithFormat:@"%@,%@\n", stu.num, stu.name];
const uint8_t *rowString = (const uint8_t *)[row cStringUsingEncoding:NSUTF8StringEncoding];
NSInteger rowLength = [row lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
result = [output write:rowString maxLength:rowLength];
if (result <= ) {
NSLog(@"无法写入内容");
}
}
}
[output close];
} - (NSArray *)queryStudents { NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.entity = entity;
NSArray *students = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
return students;
}

Cocoa Touch(二):数据存储CoreData, NSKeyArchiver, NSOutputStream, NSUserDefaults的更多相关文章

  1. Base-Android快速开发框架(二)--数据存储之SharedPreferences

    对于App开发者,抽象来说,其实就是将数据以各种各样的方式展示在用户面前以及采集用户的数据.采集用户的数据包括用户的输入.触摸.传感器等,展示的数据通过网络来源于各业务系统,以及用户的 输入数据.在这 ...

  2. 数据存储之偏好设置NSUserDefaults

    NSUserDefaults做数据存储也是比较常用,适合轻量级的本地数据存储,读取也很方便. 一.支持的数据类型如下图(NSString.NSArray.NSDictionary.NSData.NSI ...

  3. 数据存储简单了解(NSUserDefaults)

    数据存储-使用NSUserDefaults 两个类介绍: NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefault ...

  4. 数据存储-CoreData总结

    CoreData /*英译  Entity:实体 Attributes:属性 binary:二进制 persistent:持续化 coordinator:协调者 meging:合并 configura ...

  5. Swift—Cocoa Touch设计模式-备

    目标(Target)与动作(Action)是iOS和OS X应用开发的中事件处理机制.   问题提出 如图所示是一个ButtonLabelSample案例设计原型图,其中包含一个标签和一个按钮,当点击 ...

  6. ios中常见数据存储方式以及SQLite常用的语句

    在iOS中,根据不同的需求对应的有多种数据存储方式: 1.NSUserdefaults  将数据存储到沙盒中(library),方便易用,但是只能存储系统提供的数据类型(plist),不能存储自定义的 ...

  7. C 标识符, 数据存储形式(原码,反码,补码)

    一.  标识符 第一个字母必须是英文字母或下划线 二. 数据存储形式(补码存储) 最高位是符号位 ---- 0表示整数 ; 1 表示负数 1. 正数:原码 = 反码 = 补码 例子 : (10) 原码 ...

  8. 《从零开始学Swift》学习笔记(Day 63)——Cocoa Touch设计模式及应用之单例模式

    原创文章,欢迎转载.转载请注明:关东升的博客 什么是设计模式.设计模式是在特定场景下对特定问题的解决方案,这些解决方案是经过反复论证和测试总结出来的.实际上,除了软件设计,设计模式也被广泛应用于其他领 ...

  9. 《从零開始学Swift》学习笔记(Day 63)——Cocoa Touch设计模式及应用之单例模式

    原创文章,欢迎转载.转载请注明:关东升的博客 什么是设计模式.设计模式是在特定场景下对特定问题的解决方式.这些解决方式是经过重复论证和測试总结出来的. 实际上.除了软件设计,设计模式也被广泛应用于其它 ...

随机推荐

  1. 由于BOM头导致的Json解析出错

    上周五改完一些BUG后,测试通过就安心在家过了个周末.结果周一回来一看,整个安卓APP所有的接口都挂掉了1.查找bug 首先想到的是客户端代码有问题,然后想起来上周五还能运行得好好的手机也是同样的错误 ...

  2. 实现react中的自动保存--定时任务

    1. 定义和用法 setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或 ...

  3. azure 最佳实践 -- 保持冗余

    保持冗余确保你的应用的部署体系是有冗余的,以避免单一节点失败的情况.一个弹性良好的系统可以灵活的绕过系统故障.找出应用中(请求执行)的关键路径.路径中的每个节点是否都有冗余?子系统失败时,系统能否有效 ...

  4. MDI窗体及涉及到的相关问题

    MDI窗体是个什么东东尼?多文档窗体唠,相对的还有个SDI,就是单文档窗体.一般情况下我们会将软件的主窗体设置为MDI窗体.那么在主窗体的菜单部分调出来的其他窗体就是主窗体的子窗体了. (1)在主窗体 ...

  5. 51Nod 1081:子段求和(前缀和)

    1081 子段求和  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出一个长度为N的数组,进行Q次查询,查询从第i个元素开始长度为l的子段所有元素之和 ...

  6. sql中的一些通用函数

    1. SQL中使用case,when,then SELECT CASE TYPE THEN '正常' THEN '密码错误' ELSE '不正常' END '状态' FROM tbl_user 或者 ...

  7. java实现MsOffice文档向pdf转化之OpenOffice软件

    本篇文档实现功能,将word和excel,ppt文档的文件转化成pdf格式的文档 第一步:下载第三方软件OpenOffice软件(不同的操作系统下载不同的版本) 下载地址:http://www.ope ...

  8. 用Navicat复制数据库到本地(导入.sql文件运行)

    今天装数据库的机子没开,项目运行不了,于是还是决定在自己电脑上装数据库,由于新学数据库操作,记录一下 一.转储sql文件 右键点击数据库,转储sql文件,点击结构和数据 存放在本地,开始转储 转储完成 ...

  9. eclipse adt logcat过滤用法

    点击Save Filters的加号,by Log Tag如下就可以只看2dx程序出来的debug信息了

  10. 在 Linux redis 验证交互连接过程中遇到 redis Could not connect to Redis at 127.0.0.1:6379: Connection refused 的解决方法

    Could not connect to Redis at 127.0.0.1:6379: Connection refused 1.找到redis.conf 并修改 daemonize no 为 d ...