>程序介绍:
右侧是改程序的截图,基本上来说就是通过使用Core Location来得到当时的位置,然后在点击“+”的时候记录下当时的经纬度。通过UITableViewController的功能来添加,编辑,删除等功能。整体程序使用Core Data来储存数据,实体(Entity)为一个位置,包括以下参数:1,时间(收集数据的时间)2,纬度,3,经度
首先我们看看该程序的AppDelegate.h
[pre]view plain
-
@interfaceLocationsAppDelegate:NSObject{
- UIWindow*window;UINavigationController*navigationController;//导航栏
- //以下定义了CoreData的三个决定性组建,等后面m文件里面再多介绍
- NSPersistentStoreCoordinator*persistentStoreCoordinator;NSManagedObjectModel*managedObjectModel;
- NSManagedObjectContext*managedObjectContext;}
- @property(nonatomic,retain)IBOutletUIWindow*window;
- @property(nonatomic,retain)UINavigationController*navigationController;
- -(IBAction)saveAction:sender;//这个没找到作用...根本就没用到IB
- //还记得吧,nonatomic是因为这个程序是单线程@property(nonatomic,retain,readonly)NSManagedObjectModel*managedObjectModel;
- @property(nonatomic,readonly)NSManagedObjectContext*managedObjectContext;@property(nonatomic,readonly)NSPersistentStoreCoordinator
- *persistentStoreCoordinator;@property(nonatomic,readonly)NSString*applicationDocumentsDirectory;
- //程序文档目录是主要为了给NSPersistentStoreCoordinator找个存sqlite文件的地方@end
[/pre]
从上面的我们能看出来,该程序是通过一个根Core Data数据管理来管理整个程序的 CoreData 数据的,接下来看m文件也会对此作更多的理解。
[pre] view plain
-
#import"LocationsAppDelegate.h"
- #import"RootViewController.h"//该程序使用了一个根视图控制器,所以导入了这个类@implementationLocationsAppDelegate
- @synthesizewindow;@synthesizenavigationController;
- -(void)applicationDidFinishLaunching:(UIApplication*)application{
- //初始化根视图控制器,它是一个列表视图控制器RootViewController*rootViewController=[[RootViewControlleralloc]
- initWithStyle:UITableViewStylePlain];
- //通过下面的自定义getter得到CoreData的“被管理对象内容器”NSManagedObjectContext*context=[selfmanagedObjectContext];
- if(!context){//如果getter出错,在这里来排错
- }rootViewController.managedObjectContext=context;
- //rootViewController有一个本地“被管理对象内容器”,在这里赋值过去
- UINavigationController*aNavigationController=[[UINavigationControlleralloc]initWithRootViewController:rootViewController];
- self.navigationController=aNavigationController;//初始化导航栏,根视图为rootViewController,并指定该导航栏为程序导航栏
- [windowaddSubview:[navigationControllerview]];[windowmakeKeyAndVisible];
- //由于导航栏retain了根视图,所以在这里可以release掉它了
- [rootViewControllerrelease];//由于self已经retain了导航栏,所以导航栏可以release
- [aNavigationControllerrelease];}
- //applicationWillTerminate:在程序结束前,CoreData会保存任何对其的更改
- -(void)applicationWillTerminate:(UIApplication*)application{
- NSError*error;if(managedObjectContext!=nil){
- if([managedObjectContexthasChanges]&&![managedObjectContextsave:&error]){//Handletheerror.
- }}
- }
- //在得到点击事件后,保存更改-(IBAction)saveAction:(id)sender{
- NSError*error;
- if(![[selfmanagedObjectContext]save:&error]){//Handleerror
- }}
- //自定义的managedObjectContext的getter,它其实是真正在使用的时候的被操作对象
- -(NSManagedObjectContext*)managedObjectContext{
- //如果已经有这个对象,就直接返回,否则继续if(managedObjectContext!=nil){
- returnmanagedObjectContext;}
- NSPersistentStoreCoordinator*coordinator=[selfpersistentStoreCoordinator];
- if(coordinator!=nil){managedObjectContext=[[NSManagedObjectContextalloc]init];
- [managedObjectContextsetPersistentStoreCoordinator:coordinator];//这里可以看到,“内容管理器”和“数据一致性存储器”的关系,
- //managedObjectContext需要得到这个“数据一致性存储器”}
- returnmanagedObjectContext;}
- //自定义的CoreData数据模板的getter,数据模板其实就是一个描述实体与实体的关系
- //,类似于关系型数据库的关系描述文件-(NSManagedObjectModel*)managedObjectModel{
- if(managedObjectModel!=nil){
- returnmanagedObjectModel;}
- managedObjectModel=[[NSManagedObjectModelmergedModelFromBundles:nil]retain];//从本地所有xcda*****odel文件得到这个CoreData数据模板
- returnmanagedObjectModel;}
- //自定义“数据一致性存储器”persistentStoreCoordinator的getter
- -(NSPersistentStoreCoordinator*)persistentStoreCoordinator{
- if(persistentStoreCoordinator!=nil){returnpersistentStoreCoordinator;
- }
- //定义一个本地地址到NSURL,用来存储那个sqlite文件NSURL*storeUrl=[NSURLfileURLWithPath:
- [[selfapplicationDocumentsDirectory]stringByAppendingPathComponent:@"Locations.sqlite"]];
- NSError*error;
- persistentStoreCoordinator=[[NSPersistentStoreCoordinatoralloc]initWithManagedObjectModel:[selfmanagedObjectModel]];
- //从这里可以看出,其实persistentStoreCoordinator需要的不过是一个//存储数据的位置,它是负责管理CoreData如何储存数据的
- if(![persistentStoreCoordinatoraddPersistentStoreWithType:NSsqliteStoreType
- configuration:nilURL:storeUrl
- options:nilerror:&error]){
- //Handletheerror.}
- returnpersistentStoreCoordinator;
- }
- //返回该程序的档案目录,用来简单使用-(NSString*)applicationDocumentsDirectory{
- NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
- NSUserDomainMask,YES);NSString*basePath=([pathscount]>0)?[pathsobjectAtIndex:0]:nil;
- returnbasePath;//我原来的帖子中介绍过,方法其实是一模一样的
- }
- -(void)dealloc{
- //释放内存[managedObjectContextrelease];
- [managedObjectModelrelease];[persistentStoreCoordinatorrelease];
- [navigationControllerrelease];
- [windowrelease];[superdealloc];
- }@end
从上面的程序主代理文件可以看出, 的简单使用不过是通过三个组建。
NSManagedObjectModel来描述实体与实体的关系,也就是类似于表和表的关系。
NSManagedObjectContext来得到被储存内容的文件管理器,对数据作直接操作
NSPersistentStoreCoordinator来管理数据的储存位置,储存方法(sqlite) 原文链接:https://www.f2er.com/sqlite/201712.html