Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios MagicalRecord FindByaAttribute返回反向关系文档问题_Ios_Cocoa_Core Data_Magicalrecord - Fatal编程技术网

Ios MagicalRecord FindByaAttribute返回反向关系文档问题

Ios MagicalRecord FindByaAttribute返回反向关系文档问题,ios,cocoa,core-data,magicalrecord,Ios,Cocoa,Core Data,Magicalrecord,我在弄清楚如何使用核心数据和MagicalRecord建模/获取项目时遇到了一个问题。我有两个实体,用户和消息,这两个实体彼此之间有反向关系: 用户实体 Relationship Destination Inverse Type ------------------------------------------------- messages Message user To Many Relationship Destinati

我在弄清楚如何使用核心数据和MagicalRecord建模/获取项目时遇到了一个问题。我有两个实体,
用户
消息
,这两个实体彼此之间有反向关系:

用户实体

Relationship    Destination    Inverse    Type
-------------------------------------------------
messages        Message        user       To Many
Relationship    Destination    Inverse    Type
-------------------------------------------------
user            User           messages   To One
消息实体

Relationship    Destination    Inverse    Type
-------------------------------------------------
messages        Message        user       To Many
Relationship    Destination    Inverse    Type
-------------------------------------------------
user            User           messages   To One
问题

当给定用户获取消息时,MagicalRecord返回的记录数是2倍,因为它在
user
user处匹配属性。消息。user
关键路径:

- (NSArray *)fetchMessagesByUser:(NSString *)identifier {

    // returning 2x the records it should
    return [Message MR_findByAttribute:@"user.identifier" withValue:identifier];
}

我应该改变使用MagicalRecord的方式,还是我的核心数据模型存在根本性问题?

当我使用
到many
关系使用MagicalRecord设置应用程序,然后运行应用程序几次时,用户会一次又一次地被保存,因此我看到double(和triple)由于同一用户已保存多次而导致的消息数

如果您尝试在代码中更改用户的属性值,以便在下次运行程序时创建具有唯一属性的用户,我想您会看到消息的数量将是您所期望的

通过添加以下代码,可以查看所有用户:

NSArray* users = [User MR_findAll];

for(User* user in users) {
    NSLog(@"%@", [user name]);  //Log whatever attributes you want
}
如果我是对的,这将显示您有多个具有相同属性的用户

========

因为MagicalRecord上的信息太少了,所以我将发布我在安装应用程序时所做的事情。我使用了Xcode 6.3.2

1) 我创建了一个名为
MagicalRecord2
的OSX Cocoa应用程序。我没有检查使用核心数据

2) 在终端窗口中,我执行了以下命令:

~$ gem install cocoapods  //However, you probably need to use sudo(see below)
在我的系统上,我安装了多个版本的ruby(使用rvm来管理它们),您不应该在rvm中使用
sudo
,但是如果您只有ruby的系统安装,那么您需要使用
sudo
来安装gem:
$sudo gem install cocoapods

3) 在终端中,我将目录(cd)更改为我的项目目录:

~$ cd ~/xcode_projects/MagicalRecord2/
4) 在项目目录中,我使用以下命令创建了一个名为
Podfile
的文件 内容:

然后我保存了文件

5) 然后我运行命令

~/xcode_projects/MagicalRecord2$ pod update
该命令完成后,将打印出以下消息:

[!]请关闭所有当前Xcode会话并使用
MagicalRecord2.xcworkspace
从现在开始,用于此项目

所以我退出了Xcode,使用Finder导航到我的项目目录,然后单击
MagicalRecord2.xcworkspace
打开Xcode。如果在ProjectNavigator中展开几个组,很快就会看到普通的AppDelegate.h/.m文件等

6) 在AppDelegate(或者您可以创建一个NSWindowController子类)中,我添加了以下导入:

#import <MagicalRecord/MagicalRecord.h>
正如您所看到的,您只需要两行代码就可以设置Magic Record,这反过来又可以为您设置核心数据

10) 接下来,编写一个方便的方法,您可以调用该方法来创建和保存新用户:

#import "AppDelegate.h"
#import <MagicalRecord/MagicalRecord.h>
#import "User.h"
#import "Message.h"

@interface AppDelegate ()
...
...

- (void)persistNewUserWithName:(NSString*) name {

    NSManagedObjectContext* defaultContext =
    [NSManagedObjectContext MR_defaultContext]; //[NSManagedObjectContext MR_contextForCurrentThread] => deprecated

    User* myUser = [User MR_createEntityInContext:defaultContext]; //Requires that you import User.h.
    [myUser setName: name];

    Message* msg1 = [Message MR_createEntityInContext:defaultContext];  //Requires that you import Message.h
    [msg1 setText:@"Hello"];
    [msg1 setUser:myUser];

    Message* msg2 = [Message MR_createEntityInContext:defaultContext];
    [msg2 setText:@"Goodbye"];
    [msg2 setUser:myUser];

    //I commented out the following line so that the database starts out  
    //empty every time I run the project:

    //[defaultContext MR_saveToPersistentStoreAndWait];  //[defaultContext MR_save] => deprecated

}

@end
我收到一个错误,说找不到文件
NSManagedObject.h
。在User.m中,有一行:

#import NSManagedObject.h
我把那句话注释掉了,事情似乎很顺利。Xcode创建了这个文件,我不知道为什么它创建了一个包含import语句的文件,而这个文件并不存在

以下是控制台输出:

2015-06-28 19:42:24.845 MagicalRecord2[2924:73871] Created new private queue context: <NSManagedObjectContext: 0x6000001e7100>
2015-06-28 19:42:24.845 MagicalRecord2[2924:73871] Set root saving context: <NSManagedObjectContext: 0x6000001e7100>
2015-06-28 19:42:24.845 MagicalRecord2[2924:73871] Created new main queue context: <NSManagedObjectContext: 0x6080001e4900>
2015-06-28 19:42:24.846 MagicalRecord2[2924:73871] Set default context: <NSManagedObjectContext: 0x6080001e4900>
2015-06-28 19:42:24.847 MagicalRecord2[2924:73871] User count: 1
2015-06-28 19:42:24.847 MagicalRecord2[2924:73871] Rokkor
2015-06-28 19:42:24.848 MagicalRecord2[2924:73871] Hello
2015-06-28 19:42:24.848 MagicalRecord2[2924:73871] Goodbye
saveWithBlock()的定义大致如下:

(void)saveWithBlock:(void(^)(NSManagedObjectContext*))yourBlock {

    NSManagedObjectContext* context =
        [NSManagedObjectContext MR_defaultContext]; 

    yourBlock(context)

    [context MR_saveToPersistentStoreAndWait];
}
因此,saveWithBlock()会自动保存添加到上下文中的任何内容

2) 查询数据时可以使用筛选器:

 [MagicalRecord saveWithBlock:^(NSManagedObjectContext* defaultContext) {

     User* myUser = [User MR_createEntityInContext:defaultContext];
     [myUser setName: name];


     Message* m1 = [Message MR_createEntityInContext:defaultContext];
     [m1 setText:@"Hello"];
     [m1 setUser:myUser];

     Message* m2 = [Message MR_createEntityInContext:defaultContext];
     [m2 setText:@"Goodbye"];
     [m2 setUser:myUser];

 }];
NSPredicate* messagesFilter =
[NSPredicate predicateWithFormat:@"user.name == %@ && text == %@",
 @"Rokkor", @"Hello"];

NSArray* matchingMessages = [Message MR_findAllWithPredicate:messagesFilter];

for (Message* msg in matchingMessages) {
    NSLog(@"%@", [msg text]);
}

这是一个非常彻底的回答。我相信一些偶然发现它的人会发现它很有用。非常感谢。
NSPredicate* messagesFilter =
[NSPredicate predicateWithFormat:@"user.name == %@ && text == %@",
 @"Rokkor", @"Hello"];

NSArray* matchingMessages = [Message MR_findAllWithPredicate:messagesFilter];

for (Message* msg in matchingMessages) {
    NSLog(@"%@", [msg text]);
}