Zepo / GYDataCenter

An alternative to Core Data for people who like using SQLite directly.
MIT License
842 stars 132 forks source link

属性可以支持数组吗? #2

Open lexiaoyao20 opened 8 years ago

lexiaoyao20 commented 8 years ago

比如有一个Person类,一个Person可以有多条Dog:

@interface Person : GYModelObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSArray<Dog*> *dogs;

@end

@interface Dog : GYModelObject

@property (nonatomic, strong) NSString *name;

@end

支持像上面这种情况吗? 如果支持的话,我们代码需要怎么写?

Zepo commented 8 years ago

目前不支持这种,一般来说,对于上面的情况,dogs 是要排序的,框架不知道以什么方式帮你排序。

Core Data 的做法是按加入的先后顺序排,但一般这种排序不是业务场景需要的。

对于这种情况,其实只需把上面的 dogs 定义成非持久化属性,然后自己实现 getter 方法就可以了。

lexiaoyao20 commented 8 years ago

恩,多谢回复。

CocoaDebug commented 8 years ago

能不能给个demo呢? 我不知道如何才能实现....谢谢!

Zepo commented 8 years ago

比如上面这个例子,在 + persistentProperties 返回的数组里就不要加 @"dogs" 啦。

然后自己实现 dogs 的 getter 方法:

- (NSArray<Dog *> *)dogs {
    if (!_dogs) {
        _dogs = [Dog objectsWhere:...];
    }
    return _dogs;
}
ccnyou commented 8 years ago

意思是Dog单独存一个表么?那么是否也同时需要重写setDogs? 关系型数据库设计来说dog应该是一个单独表,并且有个personId 作为外键记录这个 dog 是属于谁的

Zepo commented 8 years ago

是的,Dogs 是个单独的表,参考主页那个例子就行了

yhl714387953 commented 7 years ago

发现是可以存数组是字典的,数组或者字典里面内容是string 、number类型的可以存储和读取,亲自实验的啊

Zepo commented 7 years ago

@yhl714387953 那样是在框架内部自动转成 data 了,如果 data 太大,会影响数据库性能,用的时候要小心

yhl714387953 commented 7 years ago

原来如此,多谢了大神……