IOS之自定义归档 SQLite

Day05

1.自定义类类型的归档

step1:创建自定义类型  遵守《NSCoding》协议

@interface File: NSObject<NSCoding>

@property(nonatomic,strong)NSString *fileName;

@property(nonatomic)floatfileSize;

@property(nonatomic)BOOL isDir;

step2:实现协议中的两个方法(coder:编译器  encode:编译码 译码  decode:解码  Decoder:解码器)

- (void)encodeWithCoder:(NSCoder*)aCoder{

    [aCoder encodeObject:self.fileName forKey:@"name"];

    [aCoder encodeFloat:self.fileSize forKey:@"size"];

   [aCoder encodeBool:self.isDir forKey:@"isDir"];  

}

- (id)initWithCoder:(NSCoder*)aDecoder{

    self=[super init];

    if (self) {

        self.fileName=[aDecoder decodeObjectForKey:@"name"];

        self.fileSize=[aDecoder decodeFloatForKey:@"size"];

        self.isDir=[aDecoder decodeBoolForKey:@"isDir"];

    }

    return self;

}

step3:创建一个数据来接受某一位置下的所有文件

      创建FileManger通过manger获取某一路径的所有文件存放到数组中

      NSArray *fileName=[mangercontensOfDirectoryPath error:nil];

      遍历数组  创建一个自定义的file类对象来接受遍历得到的文件。

      得到文件大小 可以通过两种方法:

         方法一:会直接放到内存中:

         NSData *data=[NSDatadataWithContemsFile:path];拿到文件通过路径

         int size=data.length得到长度

         方法二:通过fileHandle不会直接加到内存中,

          拿到路径NSFileHandle *fh=[NSFileHandlefileHandleForReadingAtPath:path];

            int size=(int)[fh seekToEndOfFile];

         创建NSData对象类接受这个类型的数组

         通过[dataWithToFile:xxx atomically:yes]将数据归档到指定位置

step4:反归档

   拿到归档文件的位置

   创建NSData对象

   通过NSKeyedUnarchiverunarchiveObjectWithData:data将反归档的文件存放到数组中   遍历数组得到每个创建的对象

 

2. CodeData:关于SQLite的操作

创建方法:

   step1:在创建项目的时候选择创建一个空的项目,创建的时候勾选CodeData 然后在空项目下创建一个storyBoard修改启动项 最后storyboard中拉入一个VC

   step2:在创建的项目中会有一个.xcdatamModeld文件打开点击Add Entity创建一个Person类 在Attributes属相对象添加属性对象和类型;

   step3:在点新创建的.xcdatamodeld点击右键创建新文件在选择Core Data选择最后一个NSManagedObjectSubClass会自动创建这个数据库所对应的类

*******************step4

先创建上下文对象  shared:共享

appDalegate*app=[UIApplication sharedApplication].Delegate

   添加:

创建person对象 EntityDescription :实体类型Context上下文 来龙去脉

Person*p=[NSEntityDescription insertNewObjectForEntityForName:@"Person"inManagedObjectContext:app.managedObjectContext];

p.name=@“张三”;

p.age=@(20)

p.moble=@"1383838438";

[appsavaContext]//保存到上下文中  会自动进行更新数据

删除:

先查询到要删除的对象: fatch:拿到取得 enecute:实行 执行

NSFetchRequest*requset=[[NSFetchRequest alloc]initWithEntityName:@"Person"]; NSArray*persons=[app.managedObjectContext executeFetchRequest:requset error:nil];

            for(Person *p inpersons) {

                if([p.name isEqualToString:@"张三"]) {

                    [app.managedObjectContext deleteObject:p];

                    [app saveContext];

                }

            }

修改

先查询到在进行修改  fetch 拿到取得  execute:执行  运行

NSFetchRequest*request=[[NSFetchRequest alloc]initWithEntityName:@"Person"]; NSArray*array=[app.managedObjectContext executeFetchRequest:request error:nil];

            for(Person *p inarray) {

                if ([p.name isEqualToString:@"张三"]) {

                    p.name=@"李四";

                    p.age=@(99);

                }

            }

            [app saveContext];

查询  fetch 取得取到  execute:运行执行  不用更数据

NSFetchRequest*request=[[NSFetchRequest alloc]initWithEntityName:@"Person"];

NSArray*persons=[app.managedObjectContext executeFetchRequest:request error:nil];

            for(Person *p inpersons) {

               NSLog(@"%@ %@ %@",p.name,p.age,p.mobleCod);

            }

 

3 SQLite中的关联关系RelationShip

按照2中的方法创建两个数据对象分别为Team和

player有下角选择style进行连线 然后生成两个数据对象类

补充知识点:

a.当点击cell的时候有响应执行的方法时:(select选中)

-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{}

b.获得UIAlertView的弹窗输入的内容调用[alertViewtextFileAtIndex:0].text

      获得UIAlertView中选中的是哪个按钮执行的方法时

-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{}

 其中可以通过buttonIndex==?可以得到具体点击的是哪个按钮

 

c. TableView的更新[self.tableView reloadData];

d.关于使用segue实现跳转

step2:在合适的时候调用[self performSegueWithIdentifier:@"playersvc"sender:team];

step3:实现跳转倒新的页面时传递参数

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

{

    PlayersTableViewController *vc =segue.destinationViewController;

    vc.team = sender;

}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。