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