zoukankan      html  css  js  c++  java
  • 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;

    }

     

  • 相关阅读:
    BZOJ 3156 防御准备
    codevs 1033 蚯蚓的游戏问题
    BZOJ 3669 【NOI2014】 魔法森林
    分享知识-快乐自己:全面解析 java注解实战指南
    分享知识-快乐自己:MySQL中的约束,添加约束,删除约束,以及一些其他修饰
    分享知识-快乐自己:Oracle基本语法(创建:表空间、用户、授权、约束等)使用指南
    分享知识-快乐自己: Oracle数据库实例、用户、表、表空间之间关系
    分享知识-快乐自己:oracle12c创建用户提示ORA-65096:公用用户名或角色无效
    分享知识-快乐自己:论 Mybatis中的关联关系(一对多,多对一,多对多)
    分享知识-快乐自己:JAVA中的 Iterator 和 Iterable 区别
  • 原文地址:https://www.cnblogs.com/katydid/p/4349100.html
Copyright © 2011-2022 走看看