谓词搜索不起作用(核心数据)

时间:2014-03-13 06:41:14

标签: objective-c core-data

在“FilterProperty”实体中插入时,我在类别“FilterProperty + Manage.h”中使用以下代码

+(FilterProperty *)insertFilterPropertyWithName:(NSString *)filterPropertyName forManagedObjectContext:(NSManagedObjectContext *)managedObjectContext forFriendlyName:(NSString *)friendlyName
                                forDefaultValue:(NSNumber *)defaultValue forMinValue:(NSNumber *)minValue forMaxValue:(NSNumber *)maxValue forType:(NSNumber *)type forBelongsToFilter:(Filter *)filter
{
    FilterProperty *fp = nil;

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"FilterProperty" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@ AND belongsToFilter.name = %@", filterPropertyName, filter.name];
    [fetchRequest setPredicate:predicate];

    NSError *error = nil;
    NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if (fetchedObjects == nil)
    {
        return nil;
    }

    if (fetchedObjects != nil && fetchedObjects.count > 0)
    {
        fp = fetchedObjects.firstObject;
    }
    else if(fetchedObjects != nil && fetchedObjects.count == 0)
    {
        fp = [NSEntityDescription insertNewObjectForEntityForName:@"FilterProperty" inManagedObjectContext:managedObjectContext];
        fp.name = filterPropertyName;
        fp.friendlyName = friendlyName;
        fp.defaultValue = defaultValue;
        fp.minValue = minValue;
        fp.maxValue = maxValue;
        fp.belongsToFilter = filter;
        fp.type = type;
    }

    return fp;
}

搜索时没有,我会执行以下操作:

+(NSArray *)getAllFilterPropertiesForFilter:(Filter *)filter forManagedObjectContext (NSManagedObjectContext *)managedObjectContext
{
    NSArray *set = nil;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"FilterProperty" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"belongsToFilter.name = %@", filter.name];
    [fetchRequest setPredicate:predicate];

    NSError *error = nil;
    NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if (fetchedObjects == nil) {
        return nil;
    }

    if(fetchedObjects != nil)
    {
        set = fetchedObjects;
    }

    return set;
}

调用任何给定过滤器时的上述函数返回一个零对象的数组。我无法理解为什么。任何帮助,将不胜感激!感谢。

3 个答案:

答案 0 :(得分:0)

您可以尝试使用此代码进行搜索: -

+(NSArray *)getAllFilterPropertiesForFilter:(Filter *)filter forManagedObjectContext (NSManagedObjectContext *)managedObjectContext
{
    NSArray *set = nil;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"FilterProperty" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"belongsToFilter.name == %@", filter.name];
    [fetchRequest setPredicate:predicate];

    NSError *error = nil;
    NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if (fetchedObjects == nil) {
        return nil;
    }

    if(fetchedObjects != nil)
    {
        set = fetchedObjects;
    }

    return set;
}

答案 1 :(得分:0)

我认为在您的insertFilterPropertyWithName方法中,您没有保存新数据。如果我是正确的,请在if-else块之后尝试此代码:

NSError *error;
if (![managedObjectContext save:&error])
{
    //could not save
}

希望这可以解决您的问题。

答案 2 :(得分:0)

在下面的情况下,如果条件需要保存在managedobjectcontext中。

else if(fetchedObjects != nil && fetchedObjects.count == 0)
{
    fp = [NSEntityDescription insertNewObjectForEntityForName:@"FilterProperty" inManagedObjectContext:managedObjectContext];
    fp.name = filterPropertyName;
    fp.friendlyName = friendlyName;
    fp.defaultValue = defaultValue;
    fp.minValue = minValue;
    fp.maxValue = maxValue;
    fp.belongsToFilter = filter;
    fp.type = type;

    NSError *err = nil;
    [managedObjectContext save:&err];
    if (errorInWrite != nil) {
        //Problem while saving         
    }
}

使用like代替“=”希望它会有用。

 +(NSArray *)getAllFilterPropertiesForFilter:(Filter *)filter forManagedObjectContext (NSManagedObjectContext *)managedObjectContext
{
NSArray *set = nil;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"FilterProperty" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"belongsToFilter.name like %@", filter.name];
[fetchRequest setPredicate:predicate];

NSError *error = nil;
NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    return nil;
}

if(fetchedObjects != nil)
{
    set = fetchedObjects;
}

return set;

}

相关问题