您的位置:首页 > 移动开发 > IOS开发

IOS CoreData 使用(二)

2013-10-12 14:55 399 查看
实例背景描述:

     在MKMapView视图上绘制多边形和圆形两种区域。首先从服务器上下载多个区域的JSon数据坐标,解析后存储到Core Data中。

一  创建模型视图

    如下图所示,Zone是抽象类保存了圆形和多边形区域的共同属性,圆形和多边形区域继承自Zone Entity.多边形区域和Location一对多的关系。Location用来存储多边形的边界点。

   

  编辑完视图后生成.h和.m文件。

   



二  解析存储数据

     直接上代码

    CircleZone *circleZone
  = nil;
    PolygonZone *polygonZone
= nil;

    Location    *myLocation    = nil;

   

    for (count=0;count!=length;++count)

    {

        NSInteger shape  = [[[allObjects objectAtIndex:count] objectForKey:@"Shape"] integerValue];

       

        if (shape == 0)  //多边形

        {
           polygonZone =(PolygonZone*)[NSEntityDescription insertNewObjectForEntityForName:@"PolygonZone" inManagedObjectContext:self.myManageObjectContext];
             

            NSDictionary* boundary = [[allObjects objectAtIndex:count] objectForKey:@"Boundary"];

            NSArray* points  = [boundary objectForKey:@"points"];

            NSInteger pointsNum = points.count,i;

            for (i=0;
i!=pointsNum; i++)

            {

                CLLocationDegrees latitude = [[[points objectAtIndex:i] objectForKey:@"latitude"] doubleValue];

                CLLocationDegrees longitude = [[[points objectAtIndex:i] objectForKey:@"longitude"] doubleValue];

                CLLocationCoordinate2D location = CLLocationCoordinate2DMake(latitude,
longitude);

                MKMapPoint point = MKMapPointForCoordinate(location); 

               

                myLocation = (Location*)
[NSEntityDescription insertNewObjectForEntityForName:@"Location" inManagedObjectContext:self.myManageObjectContext];

                myLocation.longitude = [NSNumber numberWithDouble:longitude];

                myLocation.latitude  = [NSNumber  numberWithDouble:latitude];

                [polygonZone addPointsObject:myLocation];

            }

        }

        else            //圆形

        {

            //取半径

            NSDictionary* boundary = [[allObjects objectAtIndex:count] objectForKey:@"Boundary"];

            CLLocationDegrees radius = [[boundary objectForKey:@"radius"] doubleValue];

            //取圆心坐标

            NSDictionary* center  = [boundary objectForKey:@"center"];

            CLLocationDegrees latitude =  [[center objectForKey:@"latitude"] doubleValue];

            CLLocationDegrees longitude = [[center objectForKey:@"longitude"] doubleValue];

            CLLocationCoordinate2D location = CLLocationCoordinate2DMake(latitude,
longitude);

              

            circleZone =(CircleZone*)[NSEntityDescription insertNewObjectForEntityForName:@"CircleZone" inManagedObjectContext:self.myManageObjectContext];

            circleZone.longitude = [NSNumber numberWithDouble:longitude];

            circleZone.latitude  = [NSNumber numberWithDouble:latitude];

            circleZone.radius    = [NSNumber numberWithDouble:radius];

        }

       

        NSInteger Id     = [[[allObjects objectAtIndex:count] objectForKey:@"Id"] integerValue];

        NSString *name   = [[allObjects objectAtIndex:count] objectForKey:@"Name"];

        NSInteger belong = [[[allObjects objectAtIndex:count] objectForKey:@"Belong"] integerValue];

        NSInteger type   = [[[allObjects objectAtIndex:count] objectForKey:@"Type"] integerValue];

        if (circleZone != nil)
{

            circleZone.zoneid = [NSNumber numberWithInt:Id];

            circleZone.name  =  [NSString stringWithString:name];

            circleZone.belong =  [NSNumber numberWithInt:belong];

            circleZone.shape  = [NSNumber numberWithInt:shape];

        else{

            polygonZone.zoneid = [NSNumber numberWithInt:Id];

            polygonZone.name  = [NSString stringWithString:name];

            polygonZone.belong = [NSNumber numberWithInt:belong];

            polygonZone.shape  = [NSNumber numberWithInt:shape];

        }
        

        NSError *error;

       

        if ([self.myManageObjectContext save:&error]
== NO )

        {

            NSLog(@"This was an error!");

        }

        else

        {

            NSLog(@"Save succeed!");

        }

       

        circleZone  = nil;

        polygonZone = nil;

        

    }//for

    注意加粗部分的代码,被插入到上下文中的托管对象在执行上下文的sava操作的时候才会将要保存的数据传到持久化调度器,然后持久化调度器才会将其保存到数据库中。为了提高程序的性能,我们在创建完左右对象后调用一次sava操作,如果每创建一个对象就调用一次save操作会比较耗时,降低程序执行效率。

    保存后我们可以查看一下Sqlite数据库中存储的数据情况:
   


  观察发现圆形和多边形区域的类的基本属性多存储到了一个表中。

   

三  数据的处理

   

   //***************查询圆形区域
结果按照zoneid升序顺序 ***********

       

    NSEntityDescription *discription
= [NSEntityDescription entityForName:@"Zone" inManagedObjectContext:self.objectContext];
    NSFetchRequest 
 *request = [[NSFetchRequest alloc] init];

    NSSortDescriptor *sortDis
= [[NSSortDescriptor alloc] initWithKey:@"zoneid" ascending:YES];

    NSPredicate      *predicate  = [NSPredicate predicateWithFormat:@"shape
= %@",[NSNumber numberWithInt:1]];

    

    [request setSortDescriptors:@[sortDis]];

    [request setPredicate:predicate];

    [request setEntity:discription];

   

    NSError *error = nil;

    NSArray *array = [self.objectContext executeFetchRequest:request error:&error];

    //***************修改对象 *******************

    if ([array count]]
> 0) {

        Zone *zone = (Zone*)[array objectAtIndex:0];

        zone.name = @"被修改了";

    }

    if (![self.objectContext save:&error])

    {

        NSLog(@"There was
an error!");

    }
   
  }

  


  //*************** 删除对象 *******************
  

    Zone *zone = nil;

    if ([array count]]
> 0) {

        zone = (Zone*)[array objectAtIndex:0];

    }

   

    if (zone)

    {

        [self.objectContext deleteObject:zone];

    }

   

    if ([self.objectContext hasChanges])

    {

        if (![self.objectContext save:&error])

        {

            NSLog(@"There
was an error!");

        }

    }

   


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息