簡體   English   中英

如何將NSManagedObjects的NSArray轉換為NSData

[英]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

導入“ ArrayToDataTransformer.h”

@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,並一次也可檢索它們。 在這個上面花了幾個小時,正要放棄,然后我看到了燈!

NSManagedObject和NSCoding確實不能很好地配合使用。 考慮對類似問題的背景和可能的解決方案的答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM