• 【CoreData】多个数据库使用


    在实际开发中,往往需要每个模块使用不同数据库,而CoreData也具备这样的功能,使用起来也很方便:

    首先我们创建2个模型文件(School和Educationist)

    // 1.创建模型文件 (相当于一个数据库里的表)

    // New File ———— CoreData ———— Data Model ———— Next【CoreData】1.简单地使用


    // 2.添加实体 (相当于一张表)

    // 找到我们创建的模型文件(xxx.xcdatamodeld,我创建的叫School.xcdatamodeld————Add Entity ———— 添加表内属性(这边我添加2个属性(name,age))

    【CoreData】1.简单地使用

    // 3.创建实体类

    // New File ———— CorData ———— NSManagedobject subclass ————Next(记得选择需要关联的表)这样就会自动生成相应的模型


    // Educationist创建方式和School一样


    创建好模型文件后,我们怎样才能让每个模型文件独立呢?我们可以从上下文入手,因为每个上下文对应一个数据库。


    //我们先将上下文的创建方式独立出来,以便以后使用

    - (NSManagedObjectContext*)setupContextWithModelName:(NSString*)modelName

    {

       // 生成上下文关联模型文件生成数据库(关联的时候,如果本地没有数据库文件,CoreData会自己创建)

       // 上下文,记得引用CoreData框架

       NSManagedObjectContext *context= [[NSManagedObjectContext alloc]init];

       // 上下文关联数据库

       NSURL*sqlURL= [[NSBundlemainBundle]URLForResource:modelNamewithExtension:@"momd"];

       NSManagedObjectModel *model= [[NSManagedObjectModel alloc]initWithContentsOfURL:sqlURL];

       //持久化存储调度器(持久化:把数据保存在一个文件,而不是放在内存中)

       NSPersistentStoreCoordinator *store= [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:model];

       // 告诉CoreData数据库的名字和路径

       NSString*doc= [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];

        

        NSString*sqliteStr = [NSStringstringWithFormat:@"%@.sqlite",modelName];

        NSString*sqlitePath = [doc stringByAppendingPathComponent:sqliteStr];

       [storeaddPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:[NSURLfileURLWithPath:sqlitePath]options:nilerror:nil];

        

       context.persistentStoreCoordinator=store;

        

        returncontext;

     

    }


    // 然后在需要用到上下文的地方调用此方法就可以了

    _schoolContext=[selfsetupContextWithModelName:@"School"];

    _educationistContext= [self setupContextWithModelName:@"Educationist"];


    这样数据库就独立出来了,测试一下:


    #pragma mark - 添加

    - (void)addStudent

    {

       // 创建一个学生对象

       //   Student *stu = [[Student alloc] init];

       Student*stu=[NSEntityDescriptioninsertNewObjectForEntityForName:@"Student"inManagedObjectContext:_schoolContext];

        stu.name= @"李四";

        stu.age= @1.9;

       // 直接保存数据库

       [_schoolContext save:nil];

        

       // 创建一间学校对象

       School*sch= [NSEntityDescriptioninsertNewObjectForEntityForName:@"School"inManagedObjectContext:_educationistContext];

        sch.name= @"张三中学";

        sch.no= @1.0;

        

       // 直接保存数据库

       [_educationistContext save:nil];

        

    }


    #pragma mark - 读取

    - (void)readStudent

    {

       // FectchRequest 抓取请求对象

       NSFetchRequest *request= [NSFetchRequest fetchRequestWithEntityName:@"Student"];

       // 执行请求

        NSArray*stus = [_schoolContextexecuteFetchRequest:requesterror:nil];

        

        for(Student*stu instus)

        {

           NSLog(@"名字:%@身高:%@",stu.name,stu.age);

        }

        

       // FectchRequest 抓取请求对象

       NSFetchRequest *request2= [NSFetchRequest fetchRequestWithEntityName:@"School"];

       // 执行请求

        NSArray*schs = [_educationistContextexecuteFetchRequest:request2error:nil];

        

        for(School*sch inschs) {

           NSLog(@"学校名称:%@编号:%@",sch.name,sch.no);

        }

        

     

    }


    2015-10-30 12:20:20.632 CoreData多个数据库使用[1727:66199]名字:李四 身高:1.9

     

    2015-10-30 12:20:20.632 CoreData多个数据库使用[1727:66199]学校名称:张三中学 编号:1


    就是这么简单,到这里CoreData简单的使用就结束了!


    CoreData的底层就是帮我们把sql语句进行封装,使我们可以避免使用sql语句,更好地进行开发,但肯定是在牺牲运行效率的情况下。

    如果需要查看CoreData运行过程中帮我们写了哪些sql语句,可以使用这个方法:

    1.打开Product ———— EditScheme… ————Arguments ———— 在ArgumentsPassed OnLaunch中添加两项(顺序不可变)

    1>-com.apple.CoreData.SQLDebug

    2> 1

    这样再次运行APP就会在控制台输出CoreData运行过程中使用的sql语句。



  • 相关阅读:
    九九乘法表
    杨辉三角
    显示计算机界面
    完善3.2
    杨辉三角形
    100以内的素数
    九九乘法表
    杨辉三角
    九九乘法表
    杨辉三角形
  • 原文地址:https://www.cnblogs.com/miaomiaoshen/p/5188640.html
Copyright © 2020-2023  润新知