从核心数据中获取订购的商品

时间:2011-02-21 08:49:28

标签: iphone objective-c core-data

假设我有一个核心数据模型,我的对象有日期和其他一些属性。另一个属性可以包含是或否。

按日期获取最新项目的最佳方法是什么,然后让每个项目更早,直到我将第一个项目设置为no(其中是“是常态”)。

So object 1 has Feb 22, 2011 and yes
object 2 has Feb 21, 2011 and yes
object 3 has Feb 18, 2011 and yes
object 4 has Feb 11, 2011 and yes
object 5 has Feb 10, 2011 and no
object 6 has Feb 9, 2011 and yes
object 7 has Feb 1, 2011 and no

我想要达到1-5,并停止检索项目。

我在didSelectRowAtIndexPath中使用了indexPath.row + 1,但在这种情况下不起作用。

非常感谢向正确的方向发展。

2 个答案:

答案 0 :(得分:1)

我不完全得到你的问题,但是对于排序数组使用NSSortDescriptor就像......

{   
    NSSortDescriptor* descriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
    sortedValues = [[allValues sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]] retain];    
}

...你可以使用升序:YES或NO根据你的要求和这种情况(你描述它应该是NO)。也不要忘记将密钥@“date”重命名为你所拥有的那个。你的数据库。

如果你只想获得那些在第二个字段中有YES的数据表格,请尝试添加这样的NSPredicate .......

{   
    NSFetchRequest* request = [[NSFetchRequest alloc] init];
    CoreDataModel* delegate = [CoreDataModel sharedInstance];

    NSEntityDescription* entity = [NSEntityDescription entityForName:@"YourTableName" inManagedObjectContext:delegate.managedObjectContext];
    [request setEntity:entity];

    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self.secondFieldName == %@",[NSNumber numberWithBool:YES]];
    [request setPredicate:predicate];
    [request setSortDescriptors:[NSArray arrayWithObjects:descriptor,nil]];

    NSArray* arr = [[delegate.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];   
}

答案 1 :(得分:0)

您想要做的事实上相当困难,因为它需要了解整个数据状态的逻辑。这不是一个简单的谓词或排序可以完成的事情。

谓词只查找其自身属性与特定条件测试集匹配的所有对象。传递测试的所有对象都由谓词返回。谓词无法比较两个对象,尤其是它无法比较所有对象以确定它们应该处于什么顺序。

排序将对给定的所有对象进行排序,但不能排除任何对象。

您必须通过除谓词和排序之外的某些方式提供查找第一个NO的逻辑。您可以在与提取相关联的代码中提供逻辑,也可以将其包含在数据模型本身中。

(1)使用获取代码:使用两次提取。首先,获取otherAttribute==NO的所有对象,并按日期降序排序。返回数组中第一个对象,即OP示例中的object-5,将是最新的NO

然后获取第一个对象的日期并使用它来为第二个提取otherAttribute==NO AND date>firstNoDate创建谓词。这将在OP中的示例中返回(1,2,3,4)。

合并两个返回的数组并按日期排序以获取数组(1,2,3,4,5)。

(2)在实体模型本身中创建链接数据结构,以便您实体看起来像:

MyEntity{
    date:date
    otherAttribute:Bool
    previousByDate<-(optional)->MyEntity.next
    nextByDate<-(optional)->MyEntity.previous
}

将对象添加到对象图时,必须使用上一个日期获取对象,然后将新对象插入适当的位置。

要使用此功能,请执行previousByDate==nil的抓取对象然后走nextByDate,直到找到otherAttribute==NO的抓取对象。

如果排序和排序仅适用于UI并且它们与数据模型本身无关,请使用第一种方法。如果需要排序以便首先对数据建模,请使用第二种方法。