粗糙的iOS笔记之数据存储
2014-02-19 13:20
411 查看
在ARC项目中导入MRC的类的时候需要在此类上面添加 -fno-objc-arc
Core Data是苹果自己的数据框架
优点:能管理中大型的数据结构
缺点:不能跨平台 只能在iOS和MacOS平台上使用
Core Data使用步骤
1)创建Core Data模板
2)在Core Data文件内增加实体
实体就是用于存储业务数据的类
3)根据实体生产实体类
1)生成的类都是继承NSManagedObject
继承这个类是为了协助Core Data管理你这个对象
2)生成的类的.m文件内有@dynamic
将来的getter setter不由OC语法本身决定
而由Core Data自己实现
3)生成的类如果不勾选
基本数据类型会被NSNumber包装
注意:如果项目中用到了Core Data,在生成过实体对象之后运行过游戏,之后修改了实体对象,切记再次运行项目时删除模拟器中的应用数据
实体对象 Team(球队) Player(队员) 两者关系 Team——>Player(一对多) Team<——Player(一对一)
Team 实体类中有一个NSSet 集合类型的 myPlayers
Player实体类中有一个Team 类型的 team
以下是单个实体类的增删改查基础操作
两个实体类之间的关系 用TableView表示两者的层级关系
1.User Default
用于存储应用程序的配置信息
1) 是不是第一次打开?
如果是第一次打开 就展示教学图片
2)当前的应用程序版本信息
如果发现本地存储的版本信息 和 服务器上有差距 就 提示用户更新程序
3)当前应用程序被打开的次数
4)数据结构版本信息
做数据迁移(1.0 ->2.0)
User Default 使用 三步走
取值 常用方法有:
返回类型 NSInteger - (NSInteger)integerForKey:(NSString
*)defaultName;
返回类型 BOOL - (BOOL)boolForKey:(NSString
*)defaultName;
改值 int++ 等等;
4000
存值 对应方法:
- (void)setInteger:(NSInteger)value forKey:(NSString
*)defaultName;
- (void)setBool:(BOOL)value forKey:(NSString
*)defaultName;
- (BOOL)synchronize; // 同步
2.单例模式
1)设计模式之一
2)使用频率特别高
3)让数据或对象 在程序的各个地方都能访问 并且保持唯一
4)真正限制数量的是对象的个数
-- 使用该类的人不要调用alloc消息 以及任何涉及初始化的类工厂方法
5)保证在程序各处均能访问
+ 静态消息 有类就能调用
创建一个类 LXYSingleton
.h文件
+(LXYSingleton *)sharedSingleton;
.m文件
static LXYSingleton * _sharedInstace;// 声明静态类型,保证内存中一直存在一个该类型对象
+ (LXYSingleton *)sharedSingleton
{
if(_sharedInstace == nil) {
_sharedInstance = [[LXYSingleton alloc] init];
}
return _sharedInstance;
}
在别的类使用 import 导入头文件
LXYSingleton * singleton = [LXYSingleton sharedInstance];
绝对不可以用alloc方法实例化
严禁 release 该对象,否则程序肯定出事
单例模式的优点
属性
在该类声明的属性都可以跨区域访问
单例模式下共享数据
在不同的界面用该属性进行传值 第三种传值方式 类似全局变量(第一种 注入/第二种
delegate)
目的:降低VC之间的耦合程度
还能在不同的任何对象之间传送数据
单例模式的缺点
都有可能修改这个类的属性
给大家推荐一个swift视频教程,后续会不断更新,下载文件需要验证多次,有点耐心哦!
从OC转移到swift:环境与变量
swift进阶可能值
swift枚举扩展泛型
类初始化属性方法
元组闭包
变量字符串集合循环
Core Data是苹果自己的数据框架
优点:能管理中大型的数据结构
缺点:不能跨平台 只能在iOS和MacOS平台上使用
Core Data使用步骤
1)创建Core Data模板
2)在Core Data文件内增加实体
实体就是用于存储业务数据的类
3)根据实体生产实体类
1)生成的类都是继承NSManagedObject
继承这个类是为了协助Core Data管理你这个对象
2)生成的类的.m文件内有@dynamic
将来的getter setter不由OC语法本身决定
而由Core Data自己实现
3)生成的类如果不勾选
基本数据类型会被NSNumber包装
注意:如果项目中用到了Core Data,在生成过实体对象之后运行过游戏,之后修改了实体对象,切记再次运行项目时删除模拟器中的应用数据
实体对象 Team(球队) Player(队员) 两者关系 Team——>Player(一对多) Team<——Player(一对一)
Team 实体类中有一个NSSet 集合类型的 myPlayers
Player实体类中有一个Team 类型的 team
以下是单个实体类的增删改查基础操作
// 获取 上下文 AppDelegate * app = [UIApplication sharedApplication].delegate; // 创建一个查询请求 NSFetchRequest * request = [[NSFetchRequest alloc]initWithEntityName:@"Team"];// Person 是实体对象名 // 执行查询请求 并得到返回结果 NSArray * persons = [app.managedObjectContext executeFetchRequest:requesterror:nil]; // 增 Person * person = [NSEntityDescription insertNewObjectForEntityForName:@"Team"inManagedObjectContext:app.managedObjectContext]; // 删除 NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"Team"]; NSArray * teams = [app.managedObjectContext executeFetchRequest:requesterror:Nil]; for (Team * team in persons) { if ([team.name isEqualToString:@"湖人"]) { [app.managedObjectContext deleteObject:team]; [app saveContext]; } } // 保存 // 更改之后 [app saveContext]; // 保存
两个实体类之间的关系 用TableView表示两者的层级关系
// 添加 NSArray * players = self.team.myPlayers.allObjects; Player * player = [NSEntityDescriptioninsertNewObjectForEntityForName:@"Player"inManagedObjectContext:self.app.managedObjectContext]; player.name = [alertView textFieldAtIndex:0].text; player.myTeam = self.team;建立对应关系 [self.appsaveContext]; //删除 NSArray * players = self.team.myPlayers.allObjects;// 获取NSSet集合中的Player类型对象 Player * player = players[indexPath.row]; [self.app.managedObjectContextdeleteObject:player]; [self.appsaveContext]; // 1.设置查询条件 [request setPredicate:[NSPredicatepredicateWithFormat:@"name='李四'"]]; [request setPredicate:[NSPredicatepredicateWithFormat:@"age<=30"]]; // 2.对查询结果排序 [request setSortDescriptors:@[[NSSortDescriptorsortDescriptorWithKey:@"age"ascending:NO]]]; // 数组排序 NSArray * sortTeam = [team sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { Team * t1 = obj1; Team * t2 = obj2; if (t1.age > t2.age) { return NSOrderedAscending; }else return NSOrderedDescending; }];
// 获取plist文件中的内容 NSString * path = [[NSBundle mainBundle] pathForResource:@"Area" ofType:@"plist"]; NSDictionary * rootArea = [NSDictionary dictionaryWithContentsOfFile:path]; // 如果plist文件外围被数组包含,则先打开数组 NSArray * areas = [NSArray arrayWithContentsOfFile:path]; NSDictionary * rootArea = areas[0];
1.User Default
用于存储应用程序的配置信息
1) 是不是第一次打开?
如果是第一次打开 就展示教学图片
2)当前的应用程序版本信息
如果发现本地存储的版本信息 和 服务器上有差距 就 提示用户更新程序
3)当前应用程序被打开的次数
4)数据结构版本信息
做数据迁移(1.0 ->2.0)
User Default 使用 三步走
取值 常用方法有:
返回类型 NSInteger - (NSInteger)integerForKey:(NSString
*)defaultName;
返回类型 BOOL - (BOOL)boolForKey:(NSString
*)defaultName;
改值 int++ 等等;
4000
存值 对应方法:
- (void)setInteger:(NSInteger)value forKey:(NSString
*)defaultName;
- (void)setBool:(BOOL)value forKey:(NSString
*)defaultName;
- (BOOL)synchronize; // 同步
2.单例模式
1)设计模式之一
2)使用频率特别高
3)让数据或对象 在程序的各个地方都能访问 并且保持唯一
4)真正限制数量的是对象的个数
-- 使用该类的人不要调用alloc消息 以及任何涉及初始化的类工厂方法
5)保证在程序各处均能访问
+ 静态消息 有类就能调用
创建一个类 LXYSingleton
.h文件
+(LXYSingleton *)sharedSingleton;
.m文件
static LXYSingleton * _sharedInstace;// 声明静态类型,保证内存中一直存在一个该类型对象
+ (LXYSingleton *)sharedSingleton
{
if(_sharedInstace == nil) {
_sharedInstance = [[LXYSingleton alloc] init];
}
return _sharedInstance;
}
在别的类使用 import 导入头文件
LXYSingleton * singleton = [LXYSingleton sharedInstance];
绝对不可以用alloc方法实例化
严禁 release 该对象,否则程序肯定出事
单例模式的优点
属性
在该类声明的属性都可以跨区域访问
单例模式下共享数据
在不同的界面用该属性进行传值 第三种传值方式 类似全局变量(第一种 注入/第二种
delegate)
目的:降低VC之间的耦合程度
还能在不同的任何对象之间传送数据
单例模式的缺点
都有可能修改这个类的属性
给大家推荐一个swift视频教程,后续会不断更新,下载文件需要验证多次,有点耐心哦!
从OC转移到swift:环境与变量
swift进阶可能值
swift枚举扩展泛型
类初始化属性方法
元组闭包
变量字符串集合循环
相关文章推荐
- 我是运营,我没有假期
- DB2数据库的安装
- “传奇”图象数据存储方式
- 插件管理框架 for Delphi(一)
- 修复mysql数据库
- SQLServer 数据导入导出的几种方法小结
- MySQL数据备份之mysqldump的使用详解
- 使用CSS框架布局的缺点和优点小结
- SQL Server误区30日谈 第18天 有关FileStream的存储,垃圾回收以及其它
- 给你的数据库文件减肥
- 把excel表格里的数据导入sql数据库的两种方法
- 用文本作数据处理
- 桌面中心(一)创建数据库
- 桌面中心(四)数据显示
- SQL Server Management Studio Express管理器 没有导入导出数据的向导的解决方法
- ASP.NET页面间数据传递的几种方法介绍
- ASP 循环导入导出数据处理 不使用缓存
- JS刷新框架外页面七种实现代码
- 丢失的数据忘记备份的处理方法[图文]第1/2页