- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 SQL 命令,使用普通 SQL 构建起来非常简单,但在使用 Core Data 使其工作时遇到了很多麻烦。
我有 3 个实体;项目、文件夹和组。项目位于文件夹中,文件夹位于组中。通过文件夹名称和组名称,文件夹是唯一的。项目只存储文件夹名称,而文件夹则存储文件夹名称和组名称。
有问题的 SQL 命令大致是这样的:SELECT ItemID FROM Item WHERE Item.folderName =folderName ANDFolder.folderName = Item.folderName ANDFolder.groupName = groupName;
(是的,我知道我没有通过 CoreData 获得特定属性,我只是为了示例而这样做)
当我执行 Folder.folderName = Item.folderName AND Folder.groupName = groupName
部分时,就会出现问题。我不知道如何将其表示为谓词。
我应该注意,项目和文件夹之间以及文件夹和组之间都有关系。
编辑:
这是我的数据模型的设置:
这是我现在用来发出请求的代码:
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"FavouriteItem" inManagedObjectContext:context];
[request setEntity:entity];
request.predicate = [NSPredicate predicateWithFormat:@"folderName = %@ AND folderRelationship.groupName = %@", self.folderName, self.groupName];
NSError *fetchError;
NSArray *results = [context executeFetchRequest:request error:&fetchError];
最佳答案
因此,基本上,您想要获取特定文件夹中的所有项目(即,您想要具有给定文件夹名称和组名称的所有项目......它们唯一标识特定文件夹)。
既然你说你已经有了关系,我会假设它们是建立在反向关系上的。
此外,我将假设一个项目具有名为“文件夹”的一对一关系,即该项目所在的文件夹。该文件夹将与该文件夹中的项目具有一对多关系“项目”。
因此,以下将是实现您想要的目标的众多方法之一。
- (NSSet*)getItemsForFolderName:(NSString*)folderName
groupName:(NSString*)groupName
inMOC:(NSManagedObjectContext*)moc
error:(NSError**)error {
NSSet *result = nil;
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Folder"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"folderName = %@ AND groupName = %@", folderName, groupName];
fetchRequest.relationshipKeyPathsForPrefetching = @[@"items"];
NSArray *folders = [moc executeFetchRequest:fetchRequest error:error];
if (folders) {
result = [[folders firstObject] items];
}
return result;
}
您也可以简单地获取项目。至于哪个最好,这取决于您如何为您的属性建立索引,以及您正在进行什么类型的其他抓取。
- (NSArray*)getItemsForFolderName:(NSString*)folderName
groupName:(NSString*)groupName
inMOC:(NSManagedObjectContext*)moc
error:(NSError**)error {
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Item"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"folderName = %@ AND folder.groupName = %@", folderName, groupName];
return [moc executeFetchRequest:fetchRequest error:error];
}
编辑
JamEngulfer221,我很确定这些例子会起作用,但既然你说即使在我指出你帖子中的错误后它们也不起作用,我想我会搞一个快速的项目并测试......我'我老了,有时忘记东西...
因此,我使用以下代码破解了一个测试。
首先,创建模型...
- (NSManagedObjectModel *)makeModel {
NSEntityDescription *group = [[NSEntityDescription alloc] init];
group.name = @"Group";
NSAttributeDescription *groupName = [[NSAttributeDescription alloc] init];
groupName.name = @"groupName";
groupName.attributeType = NSStringAttributeType;
NSEntityDescription *folder = [[NSEntityDescription alloc] init];
folder.name = @"Folder";
NSAttributeDescription *folderName = [[NSAttributeDescription alloc] init];
folderName.name = @"folderName";
folderName.attributeType = NSStringAttributeType;
NSEntityDescription *item = [[NSEntityDescription alloc] init];
item.name = @"Item";
NSAttributeDescription *itemName = [[NSAttributeDescription alloc] init];
itemName.name = @"itemName";
itemName.attributeType = NSStringAttributeType;
NSRelationshipDescription *folderToGroupRelationship = [[NSRelationshipDescription alloc] init];
NSRelationshipDescription *groupToFoldersRelationship = [[NSRelationshipDescription alloc] init];
groupToFoldersRelationship.name = @"folders";
groupToFoldersRelationship.destinationEntity = folder;
groupToFoldersRelationship.minCount = 0;
groupToFoldersRelationship.maxCount = 0;
groupToFoldersRelationship.deleteRule = NSCascadeDeleteRule;
groupToFoldersRelationship.inverseRelationship = folderToGroupRelationship;
folderToGroupRelationship.name = @"group";
folderToGroupRelationship.destinationEntity = group;
folderToGroupRelationship.minCount = 0;
folderToGroupRelationship.maxCount = 1;
folderToGroupRelationship.deleteRule = NSNullifyDeleteRule;
folderToGroupRelationship.inverseRelationship = groupToFoldersRelationship;
NSRelationshipDescription *folderToItemsRelationship = [[NSRelationshipDescription alloc] init];
NSRelationshipDescription *itemToFolderRelationship = [[NSRelationshipDescription alloc] init];
folderToItemsRelationship.name = @"items";
folderToItemsRelationship.destinationEntity = item;
folderToItemsRelationship.minCount = 0;
folderToItemsRelationship.maxCount = 0;
folderToItemsRelationship.deleteRule = NSCascadeDeleteRule;
folderToItemsRelationship.inverseRelationship = itemToFolderRelationship;
itemToFolderRelationship.name = @"folder";
itemToFolderRelationship.destinationEntity = folder;
itemToFolderRelationship.minCount = 0;
itemToFolderRelationship.maxCount = 1;
itemToFolderRelationship.deleteRule = NSNullifyDeleteRule;
itemToFolderRelationship.inverseRelationship = folderToItemsRelationship;
group.properties = @[groupName, groupToFoldersRelationship];
folder.properties = @[folderName, groupName, folderToGroupRelationship, folderToItemsRelationship];
item.properties = @[itemName, folderName, itemToFolderRelationship];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] init];
model.entities = @[group, folder, item];
return model;
}
以及搜索方法...
- (NSArray*)getItemsForFolderName:(NSString*)folderName
groupName:(NSString*)groupName
inMOC:(NSManagedObjectContext*)moc
error:(NSError**)error {
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Item"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"folderName = %@ AND folder.groupName = %@", folderName, groupName];
return [moc executeFetchRequest:fetchRequest error:error];
}
还有测试...
- (void)testBlarg {
NSManagedObjectModel *model = [self makeModel];
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
[psc addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:NULL];
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
moc.persistentStoreCoordinator = psc;
for (int g = 0; g < 10; ++g) {
NSManagedObject *group = [NSEntityDescription insertNewObjectForEntityForName:@"Group" inManagedObjectContext:moc];
NSString *groupName = [NSString stringWithFormat:@"Group %02d", g];
[group setValue:groupName forKey:@"groupName"];
for (int f = 0; f < 10; ++f) {
NSManagedObject *folder = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:moc];
NSString *folderName = [NSString stringWithFormat:@"Folder %02d", f];
[folder setValue:folderName forKey:@"folderName"];
[folder setValue:groupName forKey:@"groupName"];
[folder setValue:group forKey:@"group"];
for (int i = 0; i < 10; ++i) {
NSManagedObject *item = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:moc];
NSString *itemName = [NSString stringWithFormat:@"Item %02d (%@;%@)", i, folderName, groupName];
[item setValue:itemName forKey:@"itemName"];
[item setValue:folderName forKey:@"folderName"];
[item setValue:folder forKey:@"folder"];
}
}
}
[moc save:NULL];
[moc reset];
NSString *folderName = @"Folder 04";
NSString *groupName = @"Group 02";
NSArray *items = [self getItemsForFolderName:folderName groupName:groupName inMOC:moc error:NULL];
items = [items sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"itemName" ascending:YES]]];
XCTAssertEqual(10, items.count);
for (int i = 0; i < 10; ++i) {
NSManagedObject *object = items[i];
NSString *expectedItemName = [NSString stringWithFormat:@"Item %02d (%@;%@)", i, folderName, groupName];
XCTAssertEqualObjects(expectedItemName, [object valueForKey:@"itemName"]);
NSManagedObject *folder = [object valueForKey:@"folder"];
XCTAssertEqualObjects(folderName, [folder valueForKey:@"folderName"]);
XCTAssertEqualObjects(groupName, [folder valueForKey:@"groupName"]);
NSManagedObject *group = [folder valueForKey:@"group"];
XCTAssertEqualObjects(groupName, [group valueForKey:@"groupName"]);
}
}
关于ios - NSPredicate 和 Core Data 多表查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33027681/
我有一台 MySQL 服务器和一台 PostgreSQL 服务器。 需要从多个表中复制或重新插入一组数据 MySQL 流式传输/同步到 PostgreSQL 表。 这种复制可以基于时间(Sync)或事
如果两个表的 id 彼此相等,我尝试从一个表中获取数据。这是我使用的代码: SELECT id_to , email_to , name_to , status_to
我有一个 Excel 工作表。顶行对应于列名称,而连续的行每行代表一个条目。 如何将此 Excel 工作表转换为 SQL 表? 我使用的是 SQL Server 2005。 最佳答案 这取决于您使用哪
我想合并两个 Django 模型并创建一个模型。让我们假设我有第一个表表 A,其中包含一些列和数据。 Table A -------------- col1 col2 col3 col
我有两个表:table1,table2,如下所示 table1: id name 1 tamil 2 english 3 maths 4 science table2: p
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 1 年前。 Improve th
下面两个语句有什么区别? newTable = orginalTable 或 newTable.data(originalTable) 我怀疑 .data() 方法具有性能优势,因为它在标准 AX 中
我有一个表,我没有在其中显式定义主键,它并不是真正需要的功能......但是一位同事建议我添加一个列作为唯一主键以随着数据库的增长提高性能...... 谁能解释一下这是如何提高性能的? 没有使用索引(
如何将表“产品”中的产品记录与其不同表“图像”中的图像相关联? 我正在对产品 ID 使用自动增量。 我觉得不可能进行关联,因为产品 ID 是自动递增的,因此在插入期间不可用! 如何插入新产品,获取产品
我有一个 sql 表,其中包含关键字和出现次数,如下所示(尽管出现次数并不重要): ____________ dog | 3 | ____________ rat | 7 | ____
是否可以使用目标表中的LAST_INSERT_ID更新源表? INSERT INTO `target` SELECT `a`, `b` FROM `source` 目标表有一个自动增量键id,我想将其
我正在重建一个搜索查询,因为它在“我看到的”中变得多余,我想知道什么 (albums_artists, artists) ( ) does in join? is it for boosting pe
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我试图获取 MySQL 表中的所有行并将它们放入 HTML 表中: Exam ID Status Assigned Examiner
如何查询名为 photos 的表中的所有记录,并知道当前用户使用单个查询将哪些结果照片添加为书签? 这是我的表格: -- -- Table structure for table `photos` -
我的网站都在 InnoDB 表上运行,目前为止运行良好。现在我想知道在我的网站上实时发生了什么,所以我将每个页面浏览量(页面、引荐来源网址、IP、主机名等)存储在 InnoDB 表中。每秒大约有 10
我在想我会为 mysql 准备两个表。一个用于存储登录信息,另一个用于存储送货地址。这是传统方式还是所有内容都存储在一张表中? 对于两个表...有没有办法自动将表 A 的列复制到表 B,以便我可以引用
我不是程序员,我从这个表格中阅读了很多关于如何解决我的问题的内容,但我的搜索效果不好 我有两张 table 表 1:成员 id*| name | surname -------------------
我知道如何在 ASP.NET 中显示真实表,例如 public ActionResult Index() { var s = db.StaffInfoDBSet.ToList(); r
我正在尝试运行以下查询: "insert into visits set source = 'http://google.com' and country = 'en' and ref = '1234
我是一名优秀的程序员,十分优秀!