您的位置:首页 > 数据库

【CoreData】多个数据库使用

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

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

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

// New File ———— CoreData ———— Data Model ———— Next





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

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







// 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语句。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: