美文网首页
iOS coredate 数据库 第三方MagicalReco

iOS coredate 数据库 第三方MagicalReco

作者: NicoalsNC | 来源:发表于2019-10-29 15:04 被阅读0次
数据存储

Core Data初始

Core Data 是 iOS系统提供的数据存储方式,和传统的SQL相比:

  • 它无需写SQL语句
  • 允许开发者用面向对象的方式操作存储数据,它的实体类可以和table中的表结构对应
  • 可以通过谓词指定查询条件
  • 由于是苹果的亲儿子,在iOS系统上的性能很好,苹果也对它进行了多次优化
  • 苹果官方应用的数据存储几乎都使用 Core Data

Core Data 原理

CoreData的核心是Core Data stack(技术栈堆)。CoreData就是依靠Core Data stack中的几个对象进行数据操作的。

NSManagedObjectContext ,管理对象的上下文: 负责管理模型对象的一个集合,
NSManagedObjectModel 被管理的对象模型
NSPersistentStoreCoordinator 存储调度器: 负责将数据保存到磁盘,
NSPersistentStore用于保存模型数据,受NSPersistentStoreCoordinator 存储调度器的操控。

关系图

Core Data 使用

1.创建数据库文件

可以创建工程时勾选“use core data”,如果工程已经创建,也可以新创建一个数据库文件


新建数据库文件

2.创建数据模型

创建数据模型

3.生成代码文件

生成代码文件

这就生成后的类


生成的类.png

4.创建一个管理类

#import "NCModel.h"
#import <CoreData/CoreData.h>

#define kNCHandleCoreDataModelInstance [NCHandleCoreDataModel shareInstance]

NS_ASSUME_NONNULL_BEGIN

@interface NCHandleCoreDataModel : NCModel
+(NCHandleCoreDataModel *)shareInstance;
@property(strong,nonatomic)NSManagedObjectContext *managerContenxt;
@property(strong,nonatomic)NSManagedObjectModel *managerModel;//模型对象
@property(strong,nonatomic)NSPersistentStoreCoordinator *maagerDinator; //存储调度器
-(void)save;
@end

#import "NCHandleCoreDataModel.h"

@implementation NCHandleCoreDataModel
+ (NCHandleCoreDataModel *)shareInstance
{
  static NCHandleCoreDataModel *instance = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    instance = [[NCHandleCoreDataModel alloc]init];
  });

  return instance;
}
- (NSURL*)getDocumentUrlPath
{
 return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]
  ;
}

-(NSManagedObjectContext *)managerContenxt
{
  if (_managerContenxt != nil) {

    return _managerContenxt;
  }

  _managerContenxt = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
  [_managerContenxt setPersistentStoreCoordinator:self.maagerDinator];

  return _managerContenxt;
}
-(NSManagedObjectModel *)managerModel
{

  if (_managerModel != nil) {

    return _managerModel;
  }

  _managerModel = [NSManagedObjectModel mergedModelFromBundles:nil];

  return _managerModel;
}
-(NSPersistentStoreCoordinator *)maagerDinator
{
  if (_maagerDinator != nil) {

    return _maagerDinator;
  }

  _maagerDinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:self.managerModel];

  NSURL *url = [[self getDocumentUrlPath]URLByAppendingPathComponent:@"nicolsDatabase.db" isDirectory:YES];

  [_maagerDinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:nil];

  return _maagerDinator;
}

-(void)save
{  
  [self.managerContenxt save:nil];
}
@end

封装的是一个单例类,创建一个单例,然后懒加载一个NSManagedObjectContext,并给NSManagedObjectContext添加存储调度器NSPersistentStoreCoordinator。懒加载存储调度器的时候给存储调度器添加存储器PersistentStore。在最后提供一个保存数据的方法,每次我们修改数据库中文件数据的时候,都需要用Core Data stack调用save方法保存数据。

core 的增删改查

//增
    Student *s = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:kNCHandleCoreDataModelInstance.managerContenxt];
    s.s_id = 12;
    s.s_name = @"尼古";
    s.s_age = 26;
    s.s_sex = 1;
    [kNCHandleCoreDataModelInstance save];
    
      //查
     NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Student"];
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"s_name == %@",@"尼古"];
     request.predicate = predicate;
     NSArray<Student*> *arr = [kNCHandleCoreDataModelInstance.managerContenxt executeFetchRequest:request error:nil];
    
      //改
      arr.firstObject.s_name = @"尼古新";
      arr.firstObject.s_age = 25;
      [kNCHandleCoreDataModelInstance save];
    
     //删
     [kNCHandleCoreDataModelInstance.managerContenxt deleteObject:arr.firstObject];
     [kNCHandleCoreDataModelInstance save];

第三方框架MagicalRecord的使用

使用MagicalRecord可以避免了写很多配置,只需要几行代码就能够完成项目的需求。

下载MagicalRecord,将MagicalRecord文件夹导入到工程中。

1.初始化数据库

在- (BOOL)application:(UIApplication)application didFinishLaunchingWithOptions:(NSDictionary)launchOptions 添加如下代码,你也可以封装一个专门的类

- (void)initMagicalrecord{
    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    path = [path stringByAppendingPathComponent:@"nicolas.sqlite"];
    NSURL *url = [NSURL fileURLWithPath:path];
    [MagicalRecord setLoggingLevel:MagicalRecordLoggingLevelWarn];
    [MagicalRecord setupCoreDataStackWithStoreAtURL:url];
}

2.增删改查

//增
    for (NSInteger i = 0; i < 10; i ++) {
        Student *student = [Student MR_createEntity];
        student.s_id = i;
        student.s_name = [@"小名" stringByAppendingString:@(i).stringValue];
        student.s_age = arc4random() % 6 +10;
        student.s_sex = arc4random() % 2;
    }
    
    for (NSInteger i = 0; i < 10; i ++) {
        Teacher *teacher = [Teacher MR_createEntity];
        teacher.t_id = i;
        teacher.t_name = [@"张老师" stringByAppendingString:@(i).stringValue];
        teacher.t_sex = arc4random() % 2;
        
    }
    
    //查
    NSArray *allStudent = [Student MR_findAll];
    for (Student *s in allStudent) {
   NSLog(@"===1=Student=s_id:%ld=s_name:%@=s_age:%ld=s_sex:%ld",s.s_id,s.s_name,s.s_age,s.s_sex);
    }
    
    NSArray *teacherArr = [Teacher MR_findByAttribute:@"t_sex" withValue:@(0)];
    NSLog(@"===2==%@",teacherArr);
    
    //删
    for (Teacher *t in teacherArr) {
        [t MR_deleteEntity];
    }
    [[NSManagedObjectContext MR_defaultContext] MR_saveOnlySelfAndWait];
    
    //改
    NSArray *student = [Student MR_findByAttribute:@"s_age" withValue:@(12)];
    for (Student *s in student) {
        s.s_name = @"小屁孩";
     }
    [[NSManagedObjectContext MR_defaultContext] MR_saveOnlySelfAndWait];
    
    NSArray *allStu = [Student MR_findAll];
     for (Student *s in allStu) {
   NSLog(@"===2=Student=s_id:%ld=s_name:%@=s_age:%ld=s_sex:%ld",s.s_id,s.s_name,s.s_age,s.s_sex);
     }

数据库查看工具:http://sqlitebrowser.org/

最后留下 Demo地址 .

写的有些仓促,文章和代码若有不对地方,欢迎批评指正。

相关文章

  • iOS coredate 数据库 第三方MagicalReco

    Core Data初始 Core Data 是 iOS系统提供的数据存储方式,和传统的SQL相比: 它无需写SQL...

  • iOS CoreDate 入门

    折腾了一下午,跑通了 CoreData增加数据和查询 学习一门语言没那么简单~~~~好在iOS比较稳定 注意如果在...

  • iOS-数据库-SQL

    ios数据库:CoreData、 自带的框架SQLite、FMDB :第三方类库 SQL(structured ...

  • [iOS]数据库第三方框架FMDB详细讲解

    [iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,...

  • iOS-数据库-FMDB

    ios数据库:CoreData : 自带的框架SQLite :FMDB :第三方类库,封装SQLite的框架 F...

  • iOS开发之FMDB的使用

    开发中,使用到数据库一般会使用FMDB这个第三方库,来简化使用。FMDB是iOS平台的SQLite数据库框架,它以...

  • iOS第三方库汇总

    iOS第三方库汇总 iOS第三方库汇总

  • iOS常用第三方库《一》

    IOS常用第三方库《转》 UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照...

  • iOS开发--SQLite重要框架FMDB的使用

    什么是FMDB: FMDB是一个和iOS的SQLite数据库操作相关的第三方框架。主要把C语言操作数据库的代码用O...

  • CoreDate的使用

    勾选 xcode的 CoreDate会帮我们自动创建 CoreData 但是我们通常不那样使用,通常把 CoreD...

网友评论

      本文标题:iOS coredate 数据库 第三方MagicalReco

      本文链接:https://www.haomeiwen.com/subject/ywowvctx.html