【问题标题】:How to store, and fetch object by, an array of integers in core data如何通过核心数据中的整数数组存储和获取对象
【发布时间】:2013-09-14 08:11:58
【问题描述】:

我编写了一个生成谜题的应用程序,我希望将其存储在核心数据中 - 或任何最合适的存储中。我还想搜索以前存储的谜题,以确定生成的谜题是否重复。

每个谜题都由 50 到 100 个数字组成的数组表示,我希望能够存储数千个。

似乎最简单的解决方案是将数组转换为字符串,因为我已经知道如何使用字符串进行核心数据获取请求。我知道它也可以在Core Data中存储二进制数据,但似乎不能根据这些数据获取实体?

我缺少哪些更适合此类任务的选项?

感谢您的帮助!

【问题讨论】:

    标签: core-data


    【解决方案1】:

    您说您的拼图以数字形式存储,因此拼图的字符串表示非常合适。

    Core Data 关系是一个不允许重复的 NSSet 对象,因此如果您的核心数据关系为puzzles,您将无法添加重复拼图。但是,Core Data 根据objectId 属性定义了一个副本,而不是实体的属性。因此,在拼图的 NSManagedObject 子类中,您将覆盖 validateForInsertvalidateForUpdate 方法。在下面的示例中,我假设拼图实体有一个名为 stringRepresentation 的属性来保存拼图字符串:

    - (BOOL)validateForUpdate:(NSError **)error
    {
        return [self valueIsUnique:self.stringRepresentaion
                       forKey:@"stringRepresentation"
                    error:error];
    }
    - (BOOL)validateForInsert:(NSError **)error
    {
        return [self valueIsUnique:self.stringRepresentaion
                    forKey:@"stringRepresentation"
                     error:error];
    }
    - (BOOL)valueIsUnique:(NSString *)value
                   forKey:(NSString *)key
                    error:(NSError **)error
    {
        NSString * entityName = [[self entity] name];
        NSManagedObjectContext *moc = self.managedObjectContext;
        NSEntityDescription *entityDescription = [NSEntityDescription
                                                  entityForName:entityName
                                                  inManagedObjectContext:moc];
    
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        [request setEntity:entityDescription];
    
        NSPredicate * filter = [NSPredicate predicateWithFormat:@"%K LIKE[c] %@", key, value];
        [request setPredicate:filter];
    
    
        NSArray *array = [moc executeFetchRequest:request error:error];
        if (array == nil)
        {
            NSLog(@"Error retrieving array of values %@", *error);
            array = [NSArray array];
        }
    
        if (array.count == 1)
        {
            return YES;
        }
    
    
        if (error != NULL)
        {
            NSString * propertyName = NSLocalizedString(key, nil);
            NSString * errorString = NSLocalizedString(@"%@ must be unique", nil);
            errorString = [NSString stringWithFormat:errorString, propertyName];
    
            NSDictionary *userInfoDict = @{ NSLocalizedDescriptionKey : errorString,
                                            NSValidationObjectErrorKey : self,
                                            NSValidationKeyErrorKey : key};
    
            *error = [[NSError alloc] initWithDomain:NSCocoaErrorDomain
                                                code:NSManagedObjectValidationError
                                            userInfo:userInfoDict];
    
        }
        return NO;
    }
    

    【讨论】:

    • 感谢您的帮助!这应该是完美的。
    【解决方案2】:

    如果您在核心数据中使用 Transformable 数据类型,您可以将 NSArray 存储在核心数据中。

    您可以将这些添加到 NSManagedObject 子类中

    + (Class)transformedValueClass
    {
        return [NSArray class];
    }
    
    + (BOOL)allowsReverseTransformation
    {
        return YES;
    }
    
    - (id)transformedValue:(id)value
    {
        return [NSKeyedArchiver archivedDataWithRootObject:value];
    }
    
    - (id)reverseTransformedValue:(id)value
    {
        return [NSKeyedUnarchiver unarchiveObjectWithData:value];
    }
    

    这是一个教程

    http://www.lextech.com/2013/01/core-data-transformable-attributes/

    如果您决定保存每个谜题,Core Data 能够获取不同的对象。

    How to fetch distinct values in Core Data?

    否则你需要在保存之前进行比较。

    祝你好运

    【讨论】:

    • 很高兴为您提供帮助。让使用核心数据更有趣!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多