[英]How to convert an NSArray of NSManagedObjects to NSData
我是Objective C的新手,想知道是否有人可以幫助我。
我在sqlite數據庫中使用核心數據來保存具有名稱和score屬性(兩者均為NSString類型)的簡單配置文件對象。
我想要做的是獲取配置文件並將其存儲在NSData對象中,請參見下面的代碼:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"GamerProfile" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Name" ascending:YES];
NSArray *sortDecriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDecriptors];
[sortDescriptor release];
[sortDecriptors release];
NSError *error;
NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:items];
[self SendData:data];
[fetchRequest release];
當我運行代碼時,出現錯誤“由於未捕獲的異常'NSInvalidArgumentException'而終止應用程序,原因:'***-[GamerProfile encodeWithCoder:]:無法識別的選擇器發送到實例0x3f4b530'”
我想我必須在我的核心數據NSManagedObject對象(GamerProfile)中添加一個encodeWithCoderClass,但是即使在閱讀了文檔之后 ,我也不知道該怎么做,下面是我的嘗試。 我不確定是否要沿正確的方向前進,因為會收到一條警告,指出“ NSManagedObject”可能無法響應“ -encodeWithCoder””
如果有人能指出正確的方向,我將非常感謝!!
謝謝
C
這是我的GamerProfile(CoreData NSManagedObject對象)的代碼,我嘗試添加encodeWithCoder方法...
頭文件
#import <CoreData/CoreData.h>
@interface GamerProfile : NSManagedObject <NSCoding>
{
}
@property (nonatomic, retain) NSString * GamerScore;
@property (nonatomic, retain) NSString * Name;
- (void)encodeWithCoder:(NSCoder *)coder;
@end
代碼文件
#import "GamerProfile.h"
@implementation GamerProfile
@dynamic GamerScore;
@dynamic Name;
- (void)encodeWithCoder:(NSCoder *)coder {
[super encodeWithCoder:coder];
[coder encodeObject:GamerScore forKey:@"GamerScore"];
[coder encodeObject:Name forKey:@"Name"];
}
我有這個工作。 這是如何做。
首先創建一個NSValueTransformer,如下所示:
ArrayToDataTransformer.h
@interface ArrayToDataTransformer : NSValueTransformer {
}
@end
ArrayToDataTransformer.m
@implementation ArrayToDataTransformer
+ (BOOL)allowsReverseTransformation {
return YES;
}
+ (Class)transformedValueClass {
return [NSData class];
}
- (id)transformedValue:(id)value {
//Take an NSArray archive to NSData
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:value];
return data;
}
- (id)reverseTransformedValue:(id)value {
//Take NSData unarchive to NSArray
NSArray *array = (NSArray*)[NSKeyedUnarchiver unarchiveObjectWithData:value];
return array;
}
@end
上面是您與NSManagedObject的接口,現在創建一個使用它的接口,例如:
Array.h
#import <CoreData/CoreData.h>
@class Arrays;
@interface Array : NSManagedObject
{
}
@property (nonatomic, retain) id myArray;
@property (nonatomic, retain) Arrays * arrayOfArrays;
@end
Array.m
#import "Array.h"
#import "Arrays.h"
@implementation Array
@dynamic myArray;
@dynamic arrayOfArrays;
@end
在xcdatamodel中,Array需要將myArray Attributes設置為Optional(通常總是選中),並且Type是:Transformable,並且Value Transformer名稱:ArrayToDataTransformer
現在您可以使用它了;
NSMutableArray* positionArray;
positionArray = [[NSMutableArray alloc] arrayWithCapacity:[myArray count]];
for(NSArray *pos in myArray) {
[positionArray addObject:[NSString stringWithFormat:@"%@",pos]];
}
NSLog(@"ArrayCtrl : positionArray cnt = %d",[positionArray count]);
//Now add the positionArray to CoreData using the setValue & myArray Key
Array *array = (Array*)[NSEntityDescription insertNewObjectForEntityForName:@"Array" inManagedObjectContext:self.managedObjectContext];
[array setValue:positionArray forKey:@"myArray"];
[myArrays setMyArrays:array];
[self saveAction:array];
[positionArray release];
要從CoreData檢索數據:
使用一對一關系,因此myArrays指向僅一個數組元素
NSArray *positionArray = [myArrays.array valueForKey:@"myArray"];
如果使用一對多,並且事物的名稱如上,則將獲得NSSet。
核心數據應將數組作為Blob存儲在數據庫中,並且大型數組可以非常快速地寫入,例如具有3500個對象的數組只需不到一秒鍾的時間。 其性能可與使用幾乎相同的概念存儲和檢索UIImage的方式相媲美。 我認為檢索速度更快。 另一種方法是將數組的每個值分別寫入Core Data。 為此,您需要創建適當的NSManageObject,但是請注意,您必須為每個數組值保存3500次,對於3500個項目,這將需要20到30秒。 因此,上述方法非常適合一次將大型數組寫入CoreData,並一次也可檢索它們。 在這個上面花了幾個小時,正要放棄,然后我看到了燈!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.