1

我是 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

产品.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:]: unrecognized selector sent to instance 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];

我犯了同样的错误。

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

4

1 回答 1

0

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

通常 DBAccess 会为您创建这些,但它只能为已知类型创建这些。

DBAccess 检查该类并为其定义为@dynamic 的任何属性分配存储类型,该列表的支持很全面,但它无法持久化不知道如何存储/重建它们的自定义类。

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

如何让它工作?

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

作为参考,这些是 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、日期、图像、字典和其他基本类型的数组都可以。但是包含您自己的自定义类型的数组和字典将无法持久化。

我希望这有帮助,

阿德里安

于 2015-07-31T09:16:26.660 回答