CoreData的使用
第一步:创建一个 DataDemo.xcdatamodel 文件,在其中建一个实体名字为 Entity1 ,实体中建两个字段 id 和 name。
第二步:为项目添加 CoreData.framework 框架,然后在 .pch 中加入 #import <coredata/coredata.h>
第三步:在 app delegate 中定义 core data 的相关对象(同时完成它们的初始化工作)
.h 文件:
#import <coredata/coredata.h>
@private
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (NSString*) applicationDocumentsDirectory;
- (void) saveContext;
.m 文件:
@synthesize managedObjectModel;
@synthesize managedObjectContext;
@synthesize persistentStoreCoordinator;
- (void)dealloc {
[managedObjectModel release];
[managedObjectContext release];
[persistentStoreCoordinator release];
[super dealloc];
}
- (NSString*)applicationDocumentsDirectory
{
//return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
return basePath;
//return [NSURL URLWithString:basePath];
}
- (void)saveContext{
NSError *error = nil;
NSManagedObjectContext *objectContext = self.managedObjectContext;
if (objectContext != nil)
{
if ([objectContext hasChanges] && ![objectContext save:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
- (NSManagedObjectContext *)managedObjectContext
{
if (managedObjectContext != nil) {
return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel
{
if (managedObjectModel != nil) {
return managedObjectModel;
}
//从本地所有 xcdatamodel 文件中获得这个 CoreData 的数据模板
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
//数据库名为TestDB.sqlite
NSURL *storeUrl = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"TestDB.sqlite"]];
NSError *error;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
NSAssert(0, @"persistentStoreCoordinator init failed!");
}
return persistentStoreCoordinator;
}
- (void)applicationWillTerminate:(UIApplication *)application
{
NSError *error;
if (managedObjectContext != nil) {
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
NSAssert(0, @"save changes failed when terminage application!");
}
}
}
第四步:在相关的 viewcontroller 中操作数据,基本的 core data 操作代码如下:
NSError *error;
testSQLiteAppDelegate *app = (testSQLiteAppDelegate*)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = app.managedObjectContext;
//1、插入
NSManagedObject *newManagedObject = nil;
newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"Entity1" inManagedObjectContext:context];
[newManagedObject setValue:[NSNumber numberWithInt:1] forKey:@"id"];
[newManagedObject setValue:@"i love you" forKey:@"name"];
if (![context save:&error]){
NSLog (@"The error is: %@", [error userInfo]);
}
else
{
NSLog (@"The newManagedObject's id is: %@", [newManagedObject valueForKey:@"id"]);
}
//2、查询
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity1" inManagedObjectContext:context];
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
NSArray *objects = [context executeFetchRequest: fetchRequest error:&error];
if (objects == nil)
{
NSLog(@"There was an error!");
}
else {
for (NSManagedObject *oneObject in objects)
{
NSLog(@"%@",[oneObject valueForKey:@"name"]);
}
}
//3、删除
[context deleteObject:[objects objectAtIndex:0]];
if (![context save:&error]) {
exit(-1);
}
这里更详细的补充一点关于 core data 的操作代码:
1、条件过滤:选择 cid=1 的数据
- (NSFetchedResultsController*) fetchedResultsController
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"cid=1"];
[fetchRequest setPredicate:predicate];
}
2、通用代码,在 viewcontroller 里面会用到:
TestViewController.h 的代码:
@interface TestViewController : UITableViewController <NSFetchedResultsControllerDelegate>
{
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
}
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
- (void)configureCell:(UITableViewCell *)cell withCategory:(Category *)category;
@end
TestViewController.m 的代码:
-(NSFetchedResultsController *)fetchedResultsController
{
if (fetchedResultsController != nil)
{
return fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *arraySortDescriptor = [[NSArray alloc] initWithObjects:nameDescriptor, nil];
[fetchRequest setSortDescriptors:arraySortDescriptor];
NSPredicate *predicate = [NSPredicate predicateWithFormat:cidString];
[fetchRequest setPredicate:predicate];
NSFetchedResultsController *frController = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"name" cacheName:@"Root"];
frController.delegate = self;
self.fetchedResultsController = frController;
[frController release];
[fetchRequest release];
[nameDescriptor release];
return fetchedResultsController;
}
- (void)controllerWillChangeContent:(NSFetchedResultsController *)
{
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType: (NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
UITableView *tableView = self.tableView;
switch (type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] withCategory:anObject];
break;
default:
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void) controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView endUpdates];
}
CoreData的使用相关推荐
- iOS开发-xcdatamodeld文件 CoreData的介绍和使用,sqlite的使用
CoreData的介绍和使用 源引:http://www.jianshu.com/p/d027090af00e CoreData是数据存储的一种方式,CoreData实质也是对SQLite的封装. ...
- ios技术篇-CoreData
ios技术篇-CoreData 上一篇: iOS技术篇-CocoaPods 目录 下一篇:
- 数据持久化(六)之Using CoreData with MagicalRecord
第五节里面,我介绍了CoreData的配置和主要的增删改查,可能非常多人会认为用它真繁琐.这里,我再介绍网上大神对它进行了人性化封装的第三方MagicalRecord,正如FMDB对sqlite进行了 ...
- coredata Lightweight Migration 心得
关于coredata 网上的相关资料比较少,大部分是基本用法.于是便找到苹果官方文档进行深入学习. 分享一下心得,如果用了coredata 必须懂得 coredata Migration,否则app版 ...
- CoreData的简单使用
一.CoreData的简单使用 准备工作 创建数据库 新建文件,选择CoreData -> DataModel 添加实体(表),Add Entity 给表中添加属性,点击Attributes下方 ...
- Coredata — 入门使用
CoreData的底层实现尽管是使用的sqlite数据库.但是CoreData在使用起来但是和sqlite大相径庭.可能你会发现你连一句sql语句都不要写.CoreData存在于应用程序和持久化存储区 ...
- 数据库结构Sqlite与CoreData
改章节是一篇关于数据库结构的帖子 这两个就不是同一个层面的东西,core data是ORM框架+objects graph,它可以选择sqlite,xml,plist或是其他方式作为持久化方案.所以如 ...
- iphone开发之数据库CoreData
CoreData 介绍 在Cocoa环境下,如果你想使用数据库(如sqlite),你可以使用sql语句的方式通过相关的工具类进行数据库的直接操作.当然你也可以通过别人封装之后的一些简单框架,使得你的操 ...
- 使用CoreData的轻量级自动数据迁移
使用IOS的CoreData进行存储很方便,CoreData已经帮我们做了很多基础的工作,一般情况下没必要自己操作数据库了. 在开发中修改了实体模型,可能会遇到schema incompatibili ...
- 让CoreData更简单些
从简书迁移到掘金 前言 本文并不是CoreData从入门到精通之类的教程, 并不会涉及到过多的原理概念描述, 而是介绍如何让CoreData的使用变得更加简单明了, 方便亲民. 全文约六千字, 预计花 ...
最新文章
- 检测DTMF信号中的时间间隔
- Java魔法堂:注解用法详解——@SuppressWarnings
- thinkphp图片加载_标题栏ico展示
- stm32驱动_STM32直流电机启动(一)驱动电路的介绍
- flv 开源 修复_如何修复开源软件中的错误
- 以物载道,探享生活艺术,LEXUS雷克萨斯开启中国新匠精神巡展
- Flutter: 显示/关闭系统叠加层ui
- Ubuntu硬盘的挂载(临时、永久挂载)
- dbforge连接mysql_DbForge Schema Compare for MySQL入门教程:如何连接到数据库
- 菜鸟入门【ASP.NET Core】5:命令行配置、Json文件配置、Bind读取配置到C#实例、在Core Mvc中使用Options...
- 教学管理系统数据库设计Mysql_教务管理系统数据库设计方案.docx
- python刷b站视频浏览量_python刷B站播放量
- 计算机显卡驱动全部卸载,如何卸载显卡驱动重新安装?Win10卸载显卡驱动+重装显卡驱动的方法...
- 保姆教程 | YOLOv5在建筑工地中安全帽佩戴检测的应用
- mastercam西门子840d后处理_西门子802D数控铣后处理程序
- Java Web 代码审计
- 转置矩阵,逆矩阵和倒转置矩阵
- 一个研发管理使命、愿景、价值观的案例
- 正则表达式匹配任意字符串
- Google天气和股票API
热门文章
- SAP JCo 3.0 下载
- Few-Shot Classification of Aerial Scene Images via Meta-Learning(基于元学习的航拍场景图像小样本分类)
- html打印图片不显示不全,Word里图片显示全打印不全是怎么回事
- fprintf 函数详解
- 学习笔记(97):R语言入门基础-pairs绘图
- Java动态数组的用法详解
- JDBC与JAVA程序笔记
- SAR成像系列:【5】合成孔径雷达(SAR)成像算法-距离多普勒(RD)算法(附Matlab代码)
- java 使用 Amazon SES 发送电子邮件
- LruCache缓存方法