11月2-3日 CoreData 在Iphone上的使用学习
新建一个CoreData项目, 会在程序开始时初始化CoreData栈对象:被管理的上下文对象MOC,协调者MOD.程序目录, POS呢?
建模.模型只有三个属性,真是体贴啊.关闭了Optional选项,还有正则表达式对属性的约束(这是需要深入的话题) 不过到注册账号关联的话,要用到关系了.所以设了账号Account和联系人Person,是一对多的关系
关于模型一对多关系的实现,在引用的情况下实现点选 to-many relationship,在类别会生成一些方法,也就是这个类要生成维护多个对象的方法了.
NSFetchedResultsController Class
FRC使用NSFetchRequest和被管理的对象上下文来取得数据.NSFetchRequest包含一个排序描述符或者一个断言.断言可以决定获取的对象的个数.对本项目来讲NSFecthRequest的按name来排序是有用的.
FRC使用委托机制来使表格视图和数据改变进行同步.
新建一个CoreData class是这么建的,orm会自动将其持久化.
detailItem =[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:managedObjectContext];
managedObjectContext每个vc都要有,所以
//使用AppDelegate
AppDelegate * appDelegate = [[UIApplication sharedApplication] delegate];
self.managedObjectContext=appDelegate.managedObjectContext;
cathe问题.注意模型改动后用命名不同的缓存就好.
storyboard的学习
故事板是主要是为了把控制器之间的切换也能可视化编辑而存在的. scene和segue,分别代表原来的控制器和切换控制.
添加segue请看tools guide的adding a segue to a Storyboard;
果然,故事版真是个神奇的东西,得按照它的规则来.使用规则:
为了让IB初始化vc,请不要自己去初始化,除了一开始的rootViewContriller,
有触发源的- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 很多时候是无法直接设置触发源的.以标识强制执行的performSegueWithIdentifier:sender:
[controller performSegueWithIdentifier:@"EditDetail" sender:nil];这个可以让我提前把AddController放到栈顶. 这个东西让我好找.主要是不太熟悉故事版,它不可以用nib初始化controller,用故事板时nib消失了!!!
11月3日通讯录账号及其功能的实现
功能一:storybroad登陆界面中的scene和segue实现
segue类型push和modal的区别:push是导航器的入栈出栈操作,
[super.navigationController setNavigationBarHidden:YES animated:TRUE];这个在ViewDidLoad和WillDisappear中起到隐藏导航栏的作用.
功能二:在CoreData中利用关系抽出关联登陆账号的列表,保存联系人时存进账号的一对多关系数组中
detailItem =[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:managedObjectContext];
NSError *error = nil;
if (![context save:&error]) {
// Replace this implementation with code to handle theerror appropriately.
// abort() causes the application to generate a crash logand terminate. You should not use this function in a shipping application,although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
抓取数据: NSFetchRequest
普通抓取
AppDelegate * appDelegate =[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context =appDelegate.managedObjectContext ;
NSFetchRequest*fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Account"
inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error = nil;
acountData= [context executeFetchRequest:fetchRequest error:&error];
if (acountData == nil) {
// Handle the error
}
account = "0x6d468b0 <x-coredata://689B1AE9-785D-4CBB-881E-F343C929EA11/Account/p4>";
断言抓取以及排序..参考了API的代码.
所有切换用故事板
功能三:登陆账号的保存密码功能.用NSUserDefaults来做
NSString *text1 = [[NSUserDefaults standardUserDefaults] stringForKey:@"userName"];
NSString *text2 = [[NSUserDefaults standardUserDefaults] stringForKey:@"passw"];
if (text1 ) {
username.text = text1;
}
if (text2 ) {
passw.text = text2;
}
}