第一步:创建一个 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的使用相关推荐

  1. iOS开发-xcdatamodeld文件 CoreData的介绍和使用,sqlite的使用

    CoreData的介绍和使用  源引:http://www.jianshu.com/p/d027090af00e CoreData是数据存储的一种方式,CoreData实质也是对SQLite的封装. ...

  2. ios技术篇-CoreData

    ios技术篇-CoreData 上一篇: iOS技术篇-CocoaPods       目录        下一篇:

  3. 数据持久化(六)之Using CoreData with MagicalRecord

    第五节里面,我介绍了CoreData的配置和主要的增删改查,可能非常多人会认为用它真繁琐.这里,我再介绍网上大神对它进行了人性化封装的第三方MagicalRecord,正如FMDB对sqlite进行了 ...

  4. coredata Lightweight Migration 心得

    关于coredata 网上的相关资料比较少,大部分是基本用法.于是便找到苹果官方文档进行深入学习. 分享一下心得,如果用了coredata 必须懂得 coredata Migration,否则app版 ...

  5. CoreData的简单使用

    一.CoreData的简单使用 准备工作 创建数据库 新建文件,选择CoreData -> DataModel 添加实体(表),Add Entity 给表中添加属性,点击Attributes下方 ...

  6. Coredata — 入门使用

    CoreData的底层实现尽管是使用的sqlite数据库.但是CoreData在使用起来但是和sqlite大相径庭.可能你会发现你连一句sql语句都不要写.CoreData存在于应用程序和持久化存储区 ...

  7. 数据库结构Sqlite与CoreData

    改章节是一篇关于数据库结构的帖子 这两个就不是同一个层面的东西,core data是ORM框架+objects graph,它可以选择sqlite,xml,plist或是其他方式作为持久化方案.所以如 ...

  8. iphone开发之数据库CoreData

    CoreData 介绍 在Cocoa环境下,如果你想使用数据库(如sqlite),你可以使用sql语句的方式通过相关的工具类进行数据库的直接操作.当然你也可以通过别人封装之后的一些简单框架,使得你的操 ...

  9. 使用CoreData的轻量级自动数据迁移

    使用IOS的CoreData进行存储很方便,CoreData已经帮我们做了很多基础的工作,一般情况下没必要自己操作数据库了. 在开发中修改了实体模型,可能会遇到schema incompatibili ...

  10. 让CoreData更简单些

    从简书迁移到掘金 前言 本文并不是CoreData从入门到精通之类的教程, 并不会涉及到过多的原理概念描述, 而是介绍如何让CoreData的使用变得更加简单明了, 方便亲民. 全文约六千字, 预计花 ...

最新文章

  1. 检测DTMF信号中的时间间隔
  2. Java魔法堂:注解用法详解——@SuppressWarnings
  3. thinkphp图片加载_标题栏ico展示
  4. stm32驱动_STM32直流电机启动(一)驱动电路的介绍
  5. flv 开源 修复_如何修复开源软件中的错误
  6. 以物载道,探享生活艺术,LEXUS雷克萨斯开启中国新匠精神巡展
  7. Flutter: 显示/关闭系统叠加层ui
  8. Ubuntu硬盘的挂载(临时、永久挂载)
  9. dbforge连接mysql_DbForge Schema Compare for MySQL入门教程:如何连接到数据库
  10. 菜鸟入门【ASP.NET Core】5:命令行配置、Json文件配置、Bind读取配置到C#实例、在Core Mvc中使用Options...
  11. 教学管理系统数据库设计Mysql_教务管理系统数据库设计方案.docx
  12. python刷b站视频浏览量_python刷B站播放量
  13. 计算机显卡驱动全部卸载,如何卸载显卡驱动重新安装?Win10卸载显卡驱动+重装显卡驱动的方法...
  14. 保姆教程 | YOLOv5在建筑工地中安全帽佩戴检测的应用
  15. mastercam西门子840d后处理_西门子802D数控铣后处理程序
  16. Java Web 代码审计
  17. 转置矩阵,逆矩阵和倒转置矩阵
  18. 一个研发管理使命、愿景、价值观的案例
  19. 正则表达式匹配任意字符串
  20. Google天气和股票API

热门文章

  1. SAP JCo 3.0 下载
  2. Few-Shot Classification of Aerial Scene Images via Meta-Learning(基于元学习的航拍场景图像小样本分类)
  3. html打印图片不显示不全,Word里图片显示全打印不全是怎么回事
  4. fprintf 函数详解
  5. 学习笔记(97):R语言入门基础-pairs绘图
  6. Java动态数组的用法详解
  7. JDBC与JAVA程序笔记
  8. SAR成像系列:【5】合成孔径雷达(SAR)成像算法-距离多普勒(RD)算法(附Matlab代码)
  9. java 使用 Amazon SES 发送电子邮件
  10. LruCache缓存方法