DBAccess - 将自定义类对象设置为DBObject属性

时间:2015-07-31 08:07:29

标签: ios dbaccess

我是iOS开发和DBAccess框架的初学者,我遇到的问题可能很容易解决,但我真的不知道如何呈现它。

我的DBObject类扩展:

标题

//FavouriteProduct.h

#import <UIKit/UIKit.h>
#import <DBAccess/DBAccess.h>
#import "Product.h"

@interface FavouriteProduct : DBObject
@property Product *product;
@property NSString *userID;
@property NSString *productID;
@end

实施

//FavouriteProduct.m

#import "FavouriteProduct.h"
#import "Product.h"

@implementation FavouriteProduct
@dynamic productID;
@dynamic userID;
@dynamic product;
@end

Product.m文件:

@implementation Product{
NSString *id;
float price;
float discount;
NSDictionary *ownerProduct;
NSDictionary *originalDict;
}

//I create my Product objects from JSON
-(instancetype)initWithJSONDictionary:(NSDictionary *)JSONDict{
  self = [super init];
  if (self) {
      [self setValuesForKeysWithDictionary:JSONDict];
  }
  originalDict = [[NSDictionary alloc] initWithDictionary:JSONDict];
  return self;
}
// + some more getter methods

Product.h文件包含getter方法的接口声明和上面的initWithJSONDictionary方法。

我尝试使用以下代码设置产品属性:

FavouriteProduct *fav = [FavouriteProduct new];
fav.product = self.product; //self.product is an object of Product class
fav.productID = self.product.getProductID;
[fav commit];

我收到此错误:  由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [FavouriteProduct setProduct:]:无法识别的选择器发送到实例0x16e5bf10'

我也是这样试过的:

FavouriteProduct *fav = [FavouriteProduct new];
fav.product = [[Product alloc]initWithJSONDictionary:self.product.getOriginalDictionary]; //set a Product object from NSDictionary
fav.productID = self.product.getProductID;
[fav commit];

我得到了同样的错误。

我错过了什么?谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

因为您的FavouriteProduct中的属性(我猜是)实现为@dynamic,所以objc不会生成自动生成的get / set方法。因此,当赋值发生时,在尝试调用setProduct:

时会抛出异常

通常,DBAccess会为您创建这些,但它只能针对已知类型执行这些操作。

DBAccess检查该类并为其认为定义为@dynamic的任何属性分配存储类型,该列表在其支持中是全面的,但它不能保留自定义类,它不知道如何存储/重建它们。

现在,我原本期望它做的是创建一个BLOB列并尝试存储它,然后引发一个异常,说没有支持NSKeyedArchiver用于类&#39; xyz&#39;。我将研究为什么没有发生这种情况。

如何让它运作?

那么,您可以将Product类设置为DBObject,这将使DBAccess能够知道如何处理它以及如何存储它。或者您可以将.product属性保留为@sythensized,这意味着DBAccess不会尝试存储它。然后添加一个额外的属性,例如.productDictionary并存储用于创建它的NSDictionary,每次获得product属性时,重新构建完整对象并将其缓存到某处。

作为参考,这些是DBAccess可以持久保存而没有其他扩展的对象类型。

NSNumber,NSString,NSImage / UIImage,NSArray,NSDictionary,NSDate,int,bool,long,float,char,short,long long,uchar,ushort,ulong,ulong long,double,char *,NSURL,NSData, NSMutableData,NSMutableArray,NSMutableDictionary,DBObject派生类,NSObject(其中类实现NSKeyedArchiver),int64,uint64。

如果要在NSArray或NSDictionary属性中存储内容,则这些属性只能包含简单数据类型而不包含自定义类型。所以NSNumbers,日期,图像,词典和其他基类型的数组都很好。但是包含您自己的自定义类型的数组和字典将无法保留。

我希望这有帮助,

阿德里安