數據庫操作iOS庫MagicalRecord使用說明(2)

CoreData的使用(IOS學習)

——雜言:最近開始學習IOS7的開發,下文是在已經建好的項目里加入CoreData的結構,並實現一個基於coredata的簡單save,query。

 

1. 引入Core Data Framework。選中項目-->Genaral-->Linked Frameworks and Libraries中添加“CoreData.Framework”。然後在prefix.pch中加入“#import<CoreData/CoreData.h>”

2. 加入數據模型,創建Model.xcdatamodeld文件。File-->New-->File-->IOS-->Core Data-->Data Model

3. 在Delegate中建立CoreData與Delegate的關聯。點擊XYZAppDelegate.h,在@interface與@end之中加入以下代碼

複製代碼
1 @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
2 @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
3 @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
4 
5 - (void) saveContext;
6 - (NSURL *) applicationDocumentsDirectory;
複製代碼

4. 之後在XYZAppDelegate.m的@implementation下面寫入以下代碼(注:標紅的2處名字請與.xcdatamodeld文件名保持一致)

1 @synthesize managedObjectContext = _managedObjectContext;
2 @synthesize managedObjectModel = _managedObjectModel;
3 @synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
複製代碼
 1 - (void) saveContext
 2 {
 3     NSError *error = nil;
 4     
 5     NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
 6     if(managedObjectContext != nil){
 7         if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
 8             NSLog(@"Unresolved error%@, %@", error, [error userInfo]);
 9         }
10     }
11 }
12 - (NSManagedObjectContext *) managedObjectContext
13 {
14     if (_managedObjectContext != nil) {
15         return _managedObjectContext;
16     }
17     NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
18     if(coordinator != nil){
19         NSLog(@"coordinator is not null-----");
20         _managedObjectContext = [[NSManagedObjectContext alloc]init];
21         [_managedObjectContext setPersistentStoreCoordinator:coordinator];
22     }else{
23         NSLog(@"coordinator is null-----");
24     }
25     return _managedObjectContext;
26 }
27 - (NSManagedObjectModel *) managedObjectModel
28 {
29     if(_managedObjectModel != nil){
30         return _managedObjectModel;
31     }
32     NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Ratings" withExtension:@"momd"];
33     _managedObjectModel = [[NSManagedObjectModel alloc]initWithContentsOfURL:modelURL];
34     return _managedObjectModel;
35 }
36 - (NSPersistentStoreCoordinator *) persistentStoreCoordinator
37 {
38     if(_persistentStoreCoordinator != nil){
39         return _persistentStoreCoordinator;
40     }
41     NSURL *storeUrl = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Ratings.sqlite"];
42     NSError *error = nil;
43     NSLog(@"storeUrl: %@",[self applicationDocumentsDirectory]);
44     _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:[self managedObjectModel]];
45     if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]){
46         NSLog(@"Unresolved error %@%@", error, [error userInfo]);
47         abort();
48     }
49     return _persistentStoreCoordinator;
50 }
51 - (NSURL *) applicationDocumentsDirectory
52 {
53     return [[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]lastObject];
54 }
複製代碼

 

5. 至此,Core Data的準備工作已經完畢。

6. 現在可以創建Entity並結合使用,打開Ratings.xcdatamodeld文件,面板如下(2種模式),可以點擊並添加Entity(可以結合右側屬性面板使用)

7. 爲entity添加.m和.h文件,File-->New->File->IOS->Core Data->NSManagedObject subclass

8. entity已經創建完成,可以開始在Controller中使用相關context操作。我的是XYZPlayersViewController。

9. XYZPlayersViewController.h中添加以下代碼

1 @property (nonatomic, strong) NSManagedObjectContext *context;

10. XYZPlayersViewController.m中需要使用的地方添加以下代碼

1 @synthesize context;
複製代碼
 1 XYZAppDelegate *delegate = (XYZAppDelegate *)[[UIApplication sharedApplication]delegate];
 2 self.context = delegate.managedObjectContext;
 3 
 4 Player *player = [NSEntityDescription insertNewObjectForEntityForName:@"Player"
 5                                                inManagedObjectContext:context];
 6 player.name = @"timelyxyz";
 7 player.game = @"Chess";
 8 player.rating = [NSNumber numberWithInt:100];
 9 
10 NSError *error = nil;
11 if(![context save:&error]){
12     NSLog(@"%@", [error localizedDescription]);
13 }
14 
15 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
16 NSEntityDescription *entity = [NSEntityDescription entityForName:@"Player"
17                                           inManagedObjectContext:context];
18 [fetchRequest setEntity:entity];
19 
20 NSArray *fetchObjects = [context executeFetchRequest:fetchRequest error:&error];
21 for(NSManagedObject *info in fetchObjects){
22     NSLog(@"name: %@",[info valueForKey:@"name"]);
23     NSLog(@"game: %@", [info valueForKey:@"game"]);
24     NSLog(@"rating: %@", [info valueForKey:@"rating"]);
25 }
複製代碼

11. log輸出如下

 

demo下載:Ratings

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章