iOS 初识Core Data 数据库

CoreData数据库简介

CoreData是一个功能强大的数据持久化技术,位于SQLite数据库之上,不需要使用SQL语句就能对它进行操作。不过在性能方面弱于直接使用SQLite数据库。

CoreData与SQLite进行对比

SQLite

1.基于C接口,需要SQL语句,代码繁琐。
2.处理大量数据时,表关系更直观。
3.在OC中不是可视化,不易理解。

CoreData

1.可视化,且具有undo/redo能力
2.可以实现多种文件格式:
      * NSSQLiteStoreType
      * NSBinaryStoreType
      * NSInMemoryStoreType
      * NSXMLStoreType
3.苹果官方API支持,与iOS结合更紧密

使用CoreData数据库

下面我们就动手来创建一个带有CoreData数据库的工程

1.创建工程
我们创建工程的时候勾选上Use Core Data,工程会自动创建一个和项目同名的.xcdatamodeld文件就是模型文件。


iOS 初识Core Data 数据库_第1张图片
A70F66A8-500B-4A2F-9DAE-5888468308CD.png

2.创建实体
点开模型文件,点击下方的Add Entity按钮,可以添加一个实体,我们起名为Person。然后在Person中的Attributes面板(属性)中添加两个属性,name和age。这样我们就创建一个实体。


iOS 初识Core Data 数据库_第2张图片
0FC3742C-E1E8-4102-A1CC-2832E433361B.jpeg

3.创建模型
点击Xcode菜单栏中的Editor再点击Create NSManagedObject SubClass
系统就会自动帮你创建出4个文件


iOS 初识Core Data 数据库_第3张图片
image.png

iOS 初识Core Data 数据库_第4张图片
image.png

这样我们就可以在项目中使用CoreData数据库了。

CoreData的结构

  • NSManagedObjectContext 对象管理上下文,处理数据与应用的交互
  • NSManagedObjectModel 被管理的数据模型,在程序中使用的模型
  • NSPersistentStoreCoordinator 持久化存储协调器,添加数据库,设置数据存储的名字,位置,存储方式
  • NSManagedObject 被管理的数据记录
  • NSFetchRequest 数据操作请求
  • NSEntityDescription 表格实体结构

下图能很好的表示出CoreData中的结构


iOS 初识Core Data 数据库_第5张图片
Core Data 结构图.png

CoreData的增删改查

写入数据

AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = delegate.persistentContainer.viewContext;

Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
p.name = @"wang";
p.age = 12;
        
NSError *error = nil;
if ([self.context save:&error]) {
      NSLog(@"%@",error.userInfo);
} else {
      NSLog(@"添加成功");
}

删除数据

    NSError *error = nil;
    NSAsynchronousFetchRequest *request = [[NSAsynchronousFetchRequest alloc]initWithFetchRequest:[Person fetchRequest] completionBlock:^(NSAsynchronousFetchResult * _Nonnull result) {
        if (result && result.finalResult.count > 0) {
            //删除第一条数据
            Person *p = (Person *)result.finalResult[0];
            
            NSError *delError = nil;
            
            [self.context deleteObject:p];
            if ([self.context save:&delError]) {
                NSLog(@"删除一条数据失败");
            } else {
                NSLog(@"成功删除第一条数据");
            }
        }
    }];
    
    [context executeRequest:request error:&error];

查询数据

    //使用type是NSPrivateQueueConcurrencyType的context,使context具有开启新线程的能力,这样执行大量查询操作的时候就不会阻塞主线程了。
    NSManagedObjectContext *backContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    [backContext setPersistentStoreCoordinator:self.context.persistentStoreCoordinator];
    

    //异步查询
    NSAsynchronousFetchRequest *request = [[NSAsynchronousFetchRequest alloc]initWithFetchRequest:[Person fetchRequest] completionBlock:^(NSAsynchronousFetchResult * _Nonnull result) {
        if (result) {
            NSLog(@"存在%zd条数据,线程:%@",result.finalResult.count,[NSThread currentThread]);
            for (Person *p in result.finalResult) {
                NSLog(@"name:%@,age:%d",p.name,p.age);
            }
        }
    }];
    
    
    NSError *error = nil;
    [backContext executeRequest:request error:&error];
    

修改数据和查询类似这里就不写了。

Demo下载:CoreData Demo

你可能感兴趣的:(iOS 初识Core Data 数据库)