在objective-C中,我创建了11个类,它们将RLMObject子类化以表示我的数据库模型。 到目前为止,我有一个问题用这个构建我的应用程序,因为如标题中所述,他们似乎没有看到对方。 另外:它们位于同一个文件夹中,#import不会出现任何问题。
作为一个示例,我想提供两个类 以下是Books的课程:
#import <Realm/Realm.h>
#import "Chapter.h"
@interface Book : RLMObject
@property NSInteger id;
@property NSString *name;
@property RLMArray<Chapter> *chapters;
@end
// This protocol enables typed collections. i.e.:
// RLMArray<Book>
RLM_ARRAY_TYPE(Book)
以下是我的章节课程:
#import <Realm/Realm.h>
@class Book;
@interface Chapter : RLMObject
@property NSInteger id;
@property NSString *name;
@property Book *book;
@end
// This protocol enables typed collections. i.e.:
// RLMArray<Chapter>
RLM_ARRAY_TYPE(Chapter)
在Book.h中,我得到:
无法找到&#39;章&#39;
的协议声明
有人有想法吗? 这绝对是某种进口圈子。但是我该如何解决呢? 如果没有必要,我想避免将所有模型类放在前缀头中。
编辑:@class导入帮助了章文件,但它没有在书籍文件中
答案 0 :(得分:4)
您还可以为要在列表属性中使用的对象制作协议转发声明,如下所示:
#import <Realm/Realm.h>
@protocol Chapter;
@interface Book : RLMObject
@property NSInteger id;
@property NSString *name;
@property RLMArray<Chapter> *chapters;
@end
// This protocol enables typed collections. i.e.:
// RLMArray<Book>
RLM_ARRAY_TYPE(Book)
注意:您必须使用@class
进行一对一关系,并使用@protocol
进行一对多关系。
除此之外,我建议你的场景使用章节到书中的a backlink而不是属性。你的问题中有两个独立的属性,不自动同步。
如果你没有正确地维护它,这可能导致类似的东西:
图书:
- id:0,姓名:“Moby Dick”,章节:[第0章,第1章]
- id:1,名称:“Swift编程语言”,章节:[第2章,第3章]
章节:
- id:0,姓名:“Loomings。”,书:Book#0
- id:1,名称:“The Carpet-Bag。”,书:Book#0
- id:2,名称:“关于斯威夫特”,书:书#1
- id:3,名称:“快速游览”,书:书#0
看看“Swift Tour”如何引用“Moby Dick”,而它显然是Swift书的第二章。您的模型目前允许这样做,但您可以通过某种方式对其进行定义,以防止此类方案完全存在。
带有反向链接的解决方案看起来像这样:
@interface Chapter : RLMObject
@property NSInteger id;
@property NSString *name;
@property (readonly) Book *book;
@end
@implementation Chapter
// Define "book" as the inverse relationship to Book.chapters
- (Book *)book {
return [self linkingObjectsOfClass:@"Book" forProperty:@"chapters"].firstObject;
}
@end
答案 1 :(得分:1)
好的,我想出了办法:
我制作了一个头文件ModelProtocols.h,并将所有类型集合的协议添加到该文件中:
#ifndef Your_Project_ModelProtocols_h
#define Your_Project_ModelProtocols_h
@class Book;
@class Chapter;
// This protocol enables typed collections. i.e.:
// RLMArray<Book>
RLM_ARRAY_TYPE(Book)
// This protocol enables typed collections. i.e.:
// RLMArray<Chapter>
RLM_ARRAY_TYPE(Chapter)
#endif
有了这个文件设置后,我需要在我的模型类中导入它:
#import "ModelProtocols.h"
并且可以将@class
用于其余的模型类。这构建得很好,我仍然要测试它,但它应该工作。