如何在 Parse 中存储一组自定义对象?

Posted

技术标签:

【中文标题】如何在 Parse 中存储一组自定义对象?【英文标题】:How can I store an array of custom objects in Parse? 【发布时间】:2014-07-26 21:06:41 【问题描述】:

对于使用 Parse 的 ios 应用程序,我需要将一组自定义对象存储到 PFObject 中。我试过这样做,我收到错误:'NSInvalidArgumentException',原因:'JSON 写入中的无效类型(JSQMessage)'

有没有办法在 Parse 中存储一组自定义对象?我似乎找不到一个好的答案。

供您参考,我在https://github.com/jessesquires/JSQMessagesViewController使用JSQMessages 视图控制器库

我试图添加到 PFObject 的数组是用代码初始化的:

[[NSMutableArray alloc] initWithObjects:
                        [[JSQMessage alloc] initWithText:initialtext sender:[[PFUser currentUser] objectId] date:[NSDate date]],
                                     nil];

【问题讨论】:

您只能添加其他 PFObjects 或基本类型 (Boolean, string..) 的数组。您不能添加任意对象的数组 @Paulw11 有没有办法将信息存储在 PFObject 中,或许可以通过将其转换为其他有效数据类型? 你读过关于对象的解析文档吗? 是的,您可以在 Parse.dashboard 中创建一个新的 PFObject 类型,并为您的每个JSQMessages 创建该类型的实例。然后,您可以将这些 PFObject 添加到现有 PFObject 中的数组列中。 Parse API 自动解析对象引用 - 请参阅关系数据部分 - parse.com/docs/ios_guide#objects-pointers/iOS 【参考方案1】:

如果您的自定义对象符合NSCoding 协议,那么是的,您绝对可以保存它们。

这是一个魔术:聚会系列的例子

@interface MTGSet : NSObject <NSCoding>

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *code;
@property (nonatomic, strong) NSDate *releaseDate;

@end

实施

#import "MTGSet.h"

@implementation MTGSet

- (void)encodeWithCoder:(NSCoder *)aCoder

    [aCoder encodeObject:_name forKey:@"name"];
    [aCoder encodeObject:_code forKey:@"code"];
    [aCoder encodeObject:_releaseDate forKey:@"releaseDate"];


- (id)initWithCoder:(NSCoder *)aDecoder

    return [self initWithJSONDictionary:
            @@"name" : [aDecoder decodeObjectForKey:@"name"],
              @"code" : [aDecoder decodeObjectForKey:@"code"],
              @"releaseDate" : [aDecoder decodeObjectForKey:@"releaseDate"]];


@end

用法

MTGSet *set = [MTGSet new];
set.name = @"Magic 2015";
set.code = @"M15";
set.releaseDate = [NSDate date];

NSData *dataFromSet = [NSKeyedArchiver archivedDataWithRootObject:set];
PFObject *object = [PFObject objectWithClassName:@"MyObject"];
object[@"set"] = dataFromSet;
[object save];

MTGSet *unarchivedSet = [NSKeyedUnarchiver unarchiveObjectWithData:object[@"set"]];
NSLog(@"Here's the set: %@", unarchivedSet);

有一些库可以使用我推荐的 Objective-c 运行时来简化此操作。

https://github.com/eladb/Parse-NSCoding

【讨论】:

以上是关于如何在 Parse 中存储一组自定义对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何线程安全存档一组自定义对象?

如何从一组自定义字段值中显示 Wordpress 帖子

如何将一组自定义结构保存到 plist swift

在 Core Data 中保存一组自定义类

如何为一组自定义分类页面创建可变页面标题

如何创建一组自定义对象(Swift)?