粗糙的iOS笔记之数据存储

在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

以下是单个实体类的增删改查基础操作


// 获取  上下文  
	  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++ 等等;

   存值  对应方法:

- (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枚举扩展泛型

类初始化属性方法

元组闭包

变量字符串集合循环


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值