Core Data-备用

Core Data是一个功能强大的层,位于SQLite数据库之上,它避免了SQL的复杂性,能让我们以更自然的方式与数据库进行交互。Core Data将数据库行转换为OC对象(托管对象)来实现,这样无需任何SQL知识就能操作他们。

Core Data位于MVC设计模式中的模型层,一般需要在设备上存储结构化数据时,考虑使用SQLite或是序列化等方法,而Core Data是这两种方法的混合体,并增加了一些功能,提供了SQL强大威力,但是用起来又和序列化一样简单。Core Data能将应用程序中的对象直接保存到数据库中,无需进行复杂的查询,也无需确保对象的属性名和数据库字段名对应,这一切都由Core Data完成。

Core Data的核心——托管对象

托管对象是要存储到数据库中的对象的一种表示,可以看成是SQL记录,它通常包含一些字段,这些字段与应用程序中要存储的对象的属性进行匹配,创建托管对象后,必须将气托管到托管对象上下文中,然后才可以存储到数据库中。

托管对象上下文:

托管对象上下文包含所有的托管对象,这些托管对象已经为提交给数据库准备就绪,在托管对象上下文中,可以添加、修改和删除托管对象,这一层相当于应用程序和数据库之间的缓冲区。

托管对象表:

托管对象表描述了数据库的架构(schema),供托管对象上下文与数据库交互时使用。托管对象表包含一些列实体描述,每个实体都描述了一个数据库表,用于将托管对象映射到数据库条目。

下面来创建一个Core Data

首先要保证引入了CoreData.framwork框架到项目中,然后新建模型文件,New File——Core Data中的Data Model,然后命名为CDJournal.Xcdatamodel,这里我们做一个简单的记录流水账的程序。

接下来是定义数据库实体,选中CDJournal.Xcdatamodel文件打开表编辑器,点击添加一个名为Entry的实体,然后可以为实体添加属性并指定属性的数据类型。还可以创建其他实体,如果一个实体包含另一个实体,可通过拖放建立关系,类似于SQL外键,比如建立一个Author实体可以有多个Entry。建立实体及属性如下图:

创建完实体后必须生成表示数据库对象的类,使我们能在代码中表示实体,选择Entry实体,然后选择菜单Editor——Create NSManagedObject Subclass,点击create,就完成了。完成后可以看到工程中多了一个Entry的h和m文件,这就是Core Data模型中的实体对象。基本准备工作就完成了,如下是工程目录:

现在开始编写初始化Core Data模型的代码

首先,在AppDelegate.h中声明Core Data需要的对象,代码如下:

Cpp代码  

  1. #import <UIKit/UIKit.h>
  2. //引入CoreData框架
  3. #import <CoreData/CoreData.h>
  4. @classViewController;
  5. @interface AppDelegate : UIResponder <UIApplicationDelegate]]>
  6. @property (strong, nonatomic) UIWindow *window;
  7. @property (strong, nonatomic) ViewController *viewController;
  8. //数据模型对象
  9. @property(strong,nonatomic) NSManagedObjectModel *managedObjectModel;
  10. //上下文对象
  11. @property(strong,nonatomic) NSManagedObjectContext *managedObjectContext;
  12. //持久性存储区
  13. @property(strong,nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
  14. //初始化Core Data使用的数据库
  15. -(NSPersistentStoreCoordinator *)persistentStoreCoordinator;
  16. //managedObjectModel的初始化赋值函数
  17. -(NSManagedObjectModel *)managedObjectModel;
  18. //managedObjectContext的初始化赋值函数
  19. -(NSManagedObjectContext *)managedObjectContext;
  20. @end

然后在.m文件中实现定义的方法:

Cpp代码  

  1. -(NSManagedObjectModel *)managedObjectModel
  2. {
  3. if (managedObjectModel != nil) {
  4. returnmanagedObjectModel;
  5. }
  6. managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
  7. return managedObjectModel;
  8. }
  9. -(NSPersistentStoreCoordinator *)persistentStoreCoordinator
  10. {
  11. if (persistentStoreCoordinator != nil) {
  12. returnpersistentStoreCoordinator;
  13. }
  14. //得到数据库的路径
  15. NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
  16. //CoreData是建立在SQLite之上的,数据库名称需与Xcdatamodel文件同名
  17. NSURL *storeUrl = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:@"CDJournal.sqlite"]];
  18. NSError *error = nil;
  19. persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:[self managedObjectModel]];
  20. if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
  21. NSLog(@"Error: %@,%@",error,[error userInfo]);
  22. }
  23. returnpersistentStoreCoordinator;
  24. }
  25. -(NSManagedObjectContext *)managedObjectContext
  26. {
  27. if (managedObjectContext != nil) {
  28. return managedObjectContext;
  29. }
  30. NSPersistentStoreCoordinator *coordinator =[self persistentStoreCoordinator];
  31. if (coordinator != nil) {
  32. managedObjectContext = [[NSManagedObjectContext alloc]init];
  33. [managedObjectContext setPersistentStoreCoordinator:coordinator];
  34. }
  35. return managedObjectContext;
  36. }

另外,为了保证需要存储的数据不丢失,添加如下代码:

Cpp代码  

  1. //这个方法定义的是当应用程序退到后台时将执行的方法,按下home键执行(通知中心来调度)
  2. //实现此方法的目的是将托管对象上下文存储到数据存储区,防止程序退出时有未保存的数据
  3. - (void)applicationWillTerminate:(UIApplication *)application
  4. {
  5. NSError *error;
  6. if (managedObjectContext != nil) {
  7. //hasChanges方法是检查是否有未保存的上下文更改,如果有,则执行save方法保存上下文
  8. if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
  9. NSLog(@"Error: %@,%@",error,[error userInfo]);
  10. abort();
  11. }
  12. }
  13. }

然后对xib文件进行布局并连接IBOutlet和IBAction

ViewController.h代码如下:

Cpp代码  

  1. #import <UIKit/UIKit.h>
  2. #import "AppDelegate.h"
  3. @interface ViewController : UIViewController
  4. @property (retain, nonatomic) IBOutletUITextField *titleTextField;
  5. @property (retain, nonatomic) IBOutletUITextField *contentTextField;
  6. @property (strong,nonatomic) AppDelegate *myDelegate;
  7. @property (strong,nonatomic) NSMutableArray *entries;
  8. //单击按钮后执行数据保存操作
  9. - (IBAction)addToDB:(id)sender;
  10. //单击按钮后执行查询操作
  11. - (IBAction)queryFromDB:(id)sender;
  12. //当通过键盘在UITextField中输入完毕后,点击屏幕空白区域关闭键盘的操作
  13. -(IBAction)backgroundTapped:(id)sender;
  14. @end

ViewController.m代码如下:

Cpp代码  

  1. #import "ViewController.h"
  2. #import "Entry.h"
  3. @interfaceViewController ()
  4. @end
  5. @implementation ViewController
  6. @synthesize titleTextField;
  7. @synthesize contentTextField;
  8. @synthesize myDelegate = _myDelegate;
  9. @synthesize entries = _entries;
  10. - (void)viewDidLoad
  11. {
  12. [superviewDidLoad];
  13. //获取当前应用程序的委托(UIApplication sharedApplication为整个应用程序上下文)
  14. self.myDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
  15. }
  16. - (void)viewDidUnload
  17. {
  18. [selfsetTitleTextField:nil];
  19. [selfsetContentTextField:nil];
  20. [superviewDidUnload];
  21. // Release any retained subviews of the main view.
  22. }
  23. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  24. {
  25. return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
  26. }
  27. - (void)dealloc {
  28. [titleTextFieldrelease];
  29. [contentTextFieldrelease];
  30. [superdealloc];
  31. }
  32. //单击按钮后执行数据保存操作
  33. - (IBAction)addToDB:(id)sender {
  34. //让CoreData在上下文中创建一个新对象(托管对象)
  35. Entry *entry = (Entry *)[NSEntityDescription insertNewObjectForEntityForName:@"Entry" inManagedObjectContext:self.myDelegate.managedObjectContext];
  36. [entry setTitle:self.titleTextField.text];
  37. [entry setBody:self.contentTextField.text];
  38. [entry setCreationDate:[NSDatedate]];
  39. NSError *error;
  40. //托管对象准备好后,调用托管对象上下文的save方法将数据写入数据库
  41. BOOL isSaveSuccess = [self.myDelegate.managedObjectContextsave:&error];
  42. if (!isSaveSuccess) {
  43. NSLog(@"Error: %@,%@",error,[error userInfo]);
  44. }else {
  45. NSLog(@"Save successful!");
  46. }
  47. }
  48. //单击按钮后执行查询操作
  49. - (IBAction)queryFromDB:(id)sender {
  50. //创建取回数据请求
  51. NSFetchRequest *request = [[NSFetchRequest alloc] init];
  52. //设置要检索哪种类型的实体对象
  53. NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entry"inManagedObjectContext:self.myDelegate.managedObjectContext];
  54. //设置请求实体
  55. [request setEntity:entity];
  56. //指定对结果的排序方式
  57. NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate"ascending:NO];
  58. NSArray *sortDescriptions = [[NSArray alloc]initWithObjects:sortDescriptor, nil];
  59. [request setSortDescriptors:sortDescriptions];
  60. [sortDescriptions release];
  61. [sortDescriptor release];
  62. NSError *error = nil;
  63. //执行获取数据请求,返回数组
  64. NSMutableArray *mutableFetchResult = [[self.myDelegate.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
  65. if (mutableFetchResult == nil) {
  66. NSLog(@"Error: %@,%@",error,[error userInfo]);
  67. }
  68. self.entries = mutableFetchResult;
  69. NSLog(@"The count of entry:%i",[self.entriescount]);
  70. for (Entry *entry inself.entries) {
  71. NSLog(@"Title:%@---Content:%@---Date:%@",entry.title,entry.body,entry.creationDate);
  72. }
  73. [mutableFetchResult release];
  74. [request release];
  75. }
  76. //更新操作
  77. -(void)updateEntry:(Entry *)entry
  78. {
  79. [entry setTitle:self.titleTextField.text];
  80. [entry setBody:self.contentTextField.text];
  81. [entry setCreationDate:[NSDatedate]];
  82. NSError *error;
  83. BOOL isUpdateSuccess = [self.myDelegate.managedObjectContextsave:&error ];
  84. if (!isUpdateSuccess) {
  85. NSLog(@"Error:%@,%@",error,[error userInfo]);
  86. }
  87. }
  88. //删除操作
  89. -(void)deleteEntry:(Entry *)entry
  90. {
  91. [self.myDelegate.managedObjectContext deleteObject:entry];
  92. [self.entriesremoveObject:entry];
  93. NSError *error;
  94. if (![self.myDelegate.managedObjectContext save:&error]) {
  95. NSLog(@"Error:%@,%@",error,[error userInfo]);
  96. }
  97. }
  98. //当通过键盘在UITextField中输入完毕后,点击屏幕空白区域关闭键盘的操作
  99. -(IBAction)backgroundTapped:(id)sender
  100. {
  101. [titleTextField resignFirstResponder];
  102. [contentTextField resignFirstResponder];
  103. }
  104. @end

最后运行并填入数据,点击Add后添加成功

多添加几条数据后点击Query便可以查看输出的查询结果,在命令行的输出结果如下:

以上就是对Core Data的一个简单的使用,Core Data还有很多功能,这里就不一一列举,具体的在Apple的官方文档中有详细解释。

Core Data入门

一、简介

Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架,不过功能肯定是没有Hibernate强大的。简单地用下图描述下它的作用:

左边是关系模型,即数据库,数据库里面有张person表,person表里面有id、name、age三个字段,而且有2条记录;

右边是对象模型,可以看到,有2个OC对象;

利用Core Data框架,我们就可以轻松地将数据库里面的2条记录转换成2个OC对象,也可以轻松地将2个OC对象保存到数据库中,变成2条表记录,而且不用写一条SQL语句。

二、模型文件

在Core Data,需要进行映射的对象称为实体(entity),而且需要使用Core Data的模型文件来描述app中的所有实体和实体属性。这里以Person(人)和Card(身份证)2个实体为例子,先看看实体属性和实体之间的关联关系:

Person实体中有:name(姓名)、age(年龄)、card(身份证)三个属性
Card实体中有:no(号码)、person(人)两个属性

接下来看看创建模型文件的过程:
1.选择模板
  

2.添加实体

3.添加Person的2个基本属性

4.添加Card的1个基本属性

5.建立Card和Person的关联关系

        

右图中的表示Card中有个Person类型的person属性,目的就是建立Card跟Person之间的一对一关联关系(建议补上这一项),在Person中加上Inverse属性后,你会发现Card中Inverse属性也自动补上了

三、了解NSManagedObject对象

1.通过Core Data从数据库取出的对象,默认情况下都是NSManagedObject对象
  

2.NSManagedObject的工作模式有点类似于NSDictionary对象,通过键-值对来存取所有的实体属性

1> setValue:forKey:存储属性值(属性名为key)

2> valueForKey:获取属性值(属性名为key)

四、CoreData中的核心对象


注:黑色表示类名,红色表示类里面的一个属性
开发步骤总结:
1.初始化NSManagedObjectModel对象,加载模型文件,读取app中的所有实体信息
2.初始化NSPersistentStoreCoordinator对象,添加持久化库(这里采取SQLite数据库)
3.初始化NSManagedObjectContext对象,拿到这个上下文对象操作实体,进行CRUD操作

五、代码实现

先添加CoreData.framework和导入主头文件<CoreData/CoreData.h>

1.搭建上下文环境

[java] view plaincopy

  1. // 从应用程序包中加载模型文件
  2. NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
  3. // 传入模型对象,初始化NSPersistentStoreCoordinator
  4. NSPersistentStoreCoordinator *psc = [[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model] autorelease];
  5. // 构建SQLite数据库文件的路径
  6. NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
  7. NSURL *url = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:@"person.data"]];
  8. // 添加持久化存储库,这里使用SQLite作为存储库
  9. NSError *error = nil;
  10. NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];
  11. if (store == nil) { // 直接抛异常
  12. [NSException raise:@"添加数据库错误" format:@"%@", [error localizedDescription]];
  13. }
  14. // 初始化上下文,设置persistentStoreCoordinator属性
  15. NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
  16. context.persistentStoreCoordinator = psc;
  17. // 用完之后,记得要[context release];

2.添加数据到数据库

[java] view plaincopy

  1. // 传入上下文,创建一个Person实体对象
  2. NSManagedObject *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
  3. // 设置Person的简单属性
  4. [person setValue:@"MJ" forKey:@"name"];
  5. [person setValue:[NSNumber numberWithInt:27] forKey:@"age"];
  6. // 传入上下文,创建一个Card实体对象
  7. NSManagedObject *card = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:context];
  8. [card setValue:@"4414241933432" forKey:@"no"];
  9. // 设置Person和Card之间的关联关系
  10. [person setValue:card forKey:@"card"];
  11. // 利用上下文对象,将数据同步到持久化存储库
  12. NSError *error = nil;
  13. BOOL success = [context save:&error];
  14. if (!success) {
  15. [NSException raise:@"访问数据库错误" format:@"%@", [error localizedDescription]];
  16. }
  17. // 如果是想做更新操作:只要在更改了实体对象的属性后调用[context save:&error],就能将更改的数据同步到数据库

3.从数据库中查询数据

[java] view plaincopy

  1. // 初始化一个查询请求
  2. NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
  3. // 设置要查询的实体
  4. request.entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
  5. // 设置排序(按照age降序)
  6. NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];
  7. request.sortDescriptors = [NSArray arrayWithObject:sort];
  8. // 设置条件过滤(搜索name中包含字符串"Itcast-1"的记录,注意:设置条件过滤时,数据库SQL语句中的%要用*来代替,所以%Itcast-1%应该写成*Itcast-1*)
  9. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@", @"*Itcast-1*"];
  10. request.predicate = predicate;
  11. // 执行请求
  12. NSError *error = nil;
  13. NSArray *objs = [context executeFetchRequest:request error:&error];
  14. if (error) {
  15. [NSException raise:@"查询错误" format:@"%@", [error localizedDescription]];
  16. }
  17. // 遍历数据
  18. for (NSManagedObject *obj in objs) {
  19. NSLog(@"name=%@", [obj valueForKey:@"name"]
  20. }

注:Core Data不会根据实体中的关联关系立即获取相应的关联对象,比如通过Core Data取出Person实体时,并不会立即查询相关联的Card实体;当应用真的需要使用Card时,才会再次查询数据库,加载Card实体的信息。这 个就是Core Data的延迟加载机制

4.删除数据库中的数据

[java] view plaincopy

  1. // 传入需要删除的实体对象
  2. [context deleteObject:managedObject];
  3. // 将结果同步到数据库
  4. NSError *error = nil;
  5. [context save:&error];
  6. if (error) {
  7. [NSException raise:@"删除错误" format:@"%@", [error localizedDescription]];
  8. }

六、打开CoreData的SQL语句输出开关

1.打开Product,点击EditScheme...
2.点击Arguments,在ArgumentsPassed On Launch中添加2项
1> -com.apple.CoreData.SQLDebug
2> 1
  

七、创建NSManagedObject的子类

默认情况下,利用Core Data取出的实体都是NSManagedObject类型的,能够利用键-值对来存取数据。但是一般情况下,实体在存取数据的基础上,有时还需要添加一些业务方法来完成一些其他任务,那么就必须创建NSManagedObject的子类

选择模型文件 

选择需要创建子类的实体 

创建完毕后,多了2个子类 

文件内容展示:
Person.h

[java] view plaincopy

  1. #import <Foundation/Foundation.h>
  2. #import <CoreData/CoreData.h>
  3. @class Card;
  4. @interface Person : NSManagedObject
  5. @property (nonatomic, retain) NSString * name;
  6. @property (nonatomic, retain) NSNumber * age;
  7. @property (nonatomic, retain) Card *card;
  8. @end

Person.m

[java] view plaincopy

  1. #import "Person.h"
  2. @implementation Person
  3. @dynamic name;
  4. @dynamic age;
  5. @dynamic card;
  6. @end

Card.h

[java] view plaincopy

  1. #import <Foundation/Foundation.h>
  2. #import <CoreData/CoreData.h>
  3. @class Person;
  4. @interface Card : NSManagedObject
  5. @property (nonatomic, retain) NSString * no;
  6. @property (nonatomic, retain) Person *person;
  7. @end

Card.m

[java] view plaincopy

  1. #import "Card.h"
  2. #import "Person.h"
  3. @implementation Card
  4. @dynamic no;
  5. @dynamic person;
  6. @end

那么往数据库中添加数据的时候就应该写了:

[java] view plaincopy

  1. Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
  2. person.name = @"MJ";
  3. person.age = [NSNumber numberWithInt:27];
  4. Card *card = [NSEntityDescription insertNewObjectForEntityForName:@”Card" inManagedObjectContext:context];
  5. card.no = @”4414245465656";
  6. person.card = card;
  7. // 最后调用[context save&error];保存数据

说到这里,整个Core Data框架的入门就结束了,其实Core Data还远不止这些功能,它还支持自动撤销机制,一对多关联等,这里就不一一介绍了

时间: 2024-08-03 23:33:38

Core Data-备用的相关文章

Core Data

简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架,不过功能肯定是没有Hibernate强大的.简单地用下图描述下它的作用: 左边是关系模型,即数据库,数据库里面有张person表,person表里面有id.name.age三个字段,而且有2条记录: 右

我为什么用 SQLite 和 FMDB 而不用 Core Data

转:http://segmentfault.com/a/1190000000363392 编者注:文章的"我"是指原作者. 凭良心讲,我不能告诉你不去使用Core Data.它不错,而且也在变好,并且它被很多其他Cocoa开发者所理解,当有新人加入你的组或者需要别人接手你的项目的时候,这点很重要.更重要的是,不值得花时间和精力去写自己的系统去代替它.真的,使用Core Data吧. 为什么我不使用Core Data Mike Ash写到: 就我自己而言,我不是个狂热粉丝.我发现API是

Core Data存储自定义类型数据

目录: 一.使用CoreData存储基本数据 二.使用CoreData存储自定义类型数据 简单介绍CoreData CoreData是iOS编程中使用持久化数据存储的一种方式,我们知道CoreData并不是数据库本身,而是Apple提供的对象持久化技术--Object Persistent technology.CoreData框架为我们的数据变更.管理.对象存储.读取和恢复提供了支持.下面我们来尝试创建一个简单的CoreData Project. 操作 1. 打开x-code,为你的proje

Core Data使用之一(Swift): 保存

Core Data 用于永久化数据,它是基于SQLite数据库的保存一门技术. 那么,在Swift中,它是如何实现的呢? 首先,需要新建一个模板,打开工程中的xcdatamodeld文件,点击“Add Entity” ,这时候,就创建的一个模板.之后,可以修改模板的名称为自己想要的名称.然后,在Attributes里面,点击“+”,添加字段并修改类型. 然后,在代码里面 “import CoreData”.接着,用NSManagedObject来保存对象,它可以转换成任何对象.它的类型是字典.

Chapter 23 Core Data

1.  Core Data is only able to store certain data types in its store, and UIImage is not one of these types. Instead, you declared the UIImage as transformable. With a transformable attribute, Core Data will convert the object into NSData when saving,

Core Data浅谈系列之十 : 关于数据模型中实体的属性

之前写了<Core Data浅谈系列汇总>,今天稍微回顾了下,做些补充. 在这个系列的第一篇<基础结构>中(2013年1月份的文章,时间过得好快啊!),有简单带过Entity的Attribute: 数据类型.布尔值统一用NSNumber来表示: 字符串类型用NSString表示: 时间类型用NSDate表示: 二进制数据类型用NSData表示: 非标准类型用Transformable来表示: 而Attribute还有其自身的Properties,比如Transient表示不用持久化

iOS Core data多线程并发访问的问题

大家都知道Core data本身并不是一个并发安全的架构:不过针对多线程访问带来的问题,Apple给出了很多指导:同时很多第三方的开发者也贡献了很多解决方法.不过最近碰到的一个问题很奇怪,觉得有一定的特殊性,与大家分享一下. 这个问题似乎在7.0.1以前的版本上并不存在:不过后来我升级版本到了7.0.4.app的模型很简单,主线程在前台对数据库进行读写,而后台线程不断地做扫描(只读).为此每个线程中各创建了一个NSManagedObjectContext. 这个模型其实有点奇怪,因为普遍的模型是

iOS开发学习之Core Data

1.添加DataModel文件 2.添加实体和属性 3.创建NSManagedObject的子类,这里命名为Location(若没有实体属性类型是Transformable或没有额外的方法,只需要存储基本类型的话,可略过) 注意:这里可以做一个额外的工作,在Location+CoreDataProperties.h文件中,将实体属性类型是Transformable对应的@property属性的类型从id改为需要的类型 4.在AppDelegate.m文件添加以下代码: @interface Ap

UIKit,Core Data , Core Graphics, Core Animation,和OpenGLES框架

iOS的主要框架介绍 框架是一个目录,这个目录包含了共享库,访问共享库里代码的头文件,和其它的图片和声音的资源文件.一个共享库定义的方法或函数可以被应用程序调用. IOS提供了很多你可以在应用程序里调用的框架.要使用一个框架,需要将它添加到你的项目中,你的项目才可以使用它.许多应用程序都使用了如Foundation.UIKit.和Core Graphics这些框架.根据你为应用程序选择的模版,相关的框架就已经被自动引入了.如果默认加入的框架不能满足你的应用程序的需求,你也可以加入需要的框架. 看