我编写了一个生成谜题的应用程序,我想将其存储在核心数据中 - 或任何最合适的存储中。我还想搜索以前存储的谜题,以确定生成的谜题是否重复。
每个谜题都由 50 到 100 个数字组成的数组表示,我希望能够存储数千个数字。
似乎最简单的解决方案是将数组转换为字符串,因为我已经知道如何使用字符串进行核心数据获取请求。我知道它也可以在 Core Data 中存储二进制数据,但似乎不能根据这些数据获取实体?
我是否缺少更适合此类任务的选项?
谢谢你的帮助!
我编写了一个生成谜题的应用程序,我想将其存储在核心数据中 - 或任何最合适的存储中。我还想搜索以前存储的谜题,以确定生成的谜题是否重复。
每个谜题都由 50 到 100 个数字组成的数组表示,我希望能够存储数千个数字。
似乎最简单的解决方案是将数组转换为字符串,因为我已经知道如何使用字符串进行核心数据获取请求。我知道它也可以在 Core Data 中存储二进制数据,但似乎不能根据这些数据获取实体?
我是否缺少更适合此类任务的选项?
谢谢你的帮助!
如果在核心数据中使用 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 有能力获取不同的对象。
否则,您需要在保存之前进行比较。
祝你好运
你说你的谜题是以数字形式存储的,所以谜题的字符串表示是非常合适的。
核心数据关系是一个不允许重复的 NSSet 对象,所以如果你有一个核心数据关系puzzles
,你将无法添加一个重复的拼图。但是,Core Data 根据objectId
属性定义副本,而不是实体的属性。因此,在拼图的 NSManagedObject 子类中,您将覆盖validateForInsert
和validateForUpdate
方法。在下面的示例中,我假设拼图实体有一个名为的属性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;
}