在map中怎么删除一个对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在map中怎么删除一个对象相关的知识,希望对你有一定的参考价值。

1、map容器删除某个条目,可以通过获取到的迭代器对象进行删除,下图标示的代码段,通过find查找到容器中的对象,使用返回的迭代器对象作为erase的入参,将条目删除。

2、从输出的打印结果看,erase成功的删除了通过find查找到的条目。

3、map类提供erase函数多个函数重载,可以通过传入关键字将条目删除。

4、从输出结果看,通过关键字成功删除关键字对应的条目。

5、如果想要删除整个容器的内容,通过传入开始和结束两个参数到erase函数中进行删除操作。

6、从下图输出的结果看,map容器中所有数据已经被删除,因此,没有输出内容。

7、除了上面提供的方法可以删除map容器的所有内容外,map提供了另外一个函数clear,该函数同样可以删除map容器的所有内容。

参考技术A 使用Map集合 对象的Remove方法;
比如:
Map<String ,Object> objMap=new HashMap<String ,Object>();
//首先添加两组值
objMap.put("one","obj1");
objMap.put("two","obj2");
//在这里删除第一个对象
objMap.remove("one");
//这样就把放在objMap中的obj1 删除了
//希望能给你帮助
参考技术B 按key值删除单个对象:remove(key); clear();清除所有 参考技术C remove(对象键值); 参考技术D 看api:
V remove(Object key); 或 void clear();本回答被提问者采纳

RestKit本地删除对象,依然出现在mapping中

【中文标题】RestKit本地删除对象,依然出现在mapping中【英文标题】:RestKit local deletion of objects, still appears in mapping 【发布时间】:2014-03-27 08:30:40 【问题描述】:

我正在为我的应用程序使用 RestKit 0.20.3。它具有离线模式,所以我必须将对象存储在本地核心数据中。

每当从服务器中删除某些对象时,它都会以 JSON 格式发送deleted = true 属性,我在与deletionPredicate 的映射中处理该属性。 这是我的地图。

- (RKEntityMapping *)meetingsMapping 

    RKEntityMapping *meetingsMapping = [RKEntityMapping mappingForEntityForName:@"DBMeetings" inManagedObjectStore:objectManager.managedObjectStore];
    meetingsMapping.setDefaultValueForMissingAttributes = NO;
    meetingsMapping.deletionPredicate = [NSPredicate predicateWithFormat:@"shouldBeDeleted = 1"];
    [meetingsMapping setModificationAttributeForName:@"updated_at"];
    meetingsMapping.identificationAttributes = @[@"id"];

    [meetingsMapping addAttributeMappingsFromDictionary:@
                                                      @"id": @"id",
                                                      @"title": @"title",

                                                      @"start_date_human": @"start_date_human",
                                                      @"start_time_human": @"start_time_human",
                                                      @"finish_date_human": @"finish_date_human",
                                                      @"finish_time_human": @"finish_time_human",

                                                      @"lock": @"lock",
                                                      @"location": @"location",
                                                      @"sample": @"sample",

                                                      @"deleted": @"shouldBeDeleted",

                                                      @"created_at": @"created_at",
                                                      @"updated_at": @"updated_at",
                                                      @"follow_up_id": @"follow_up_id",
                                                      @"total_topics": @"total_topics",
                                                      ];

[meetingsMapping addRelationshipMappingWithSourceKeyPath:@"tags" mapping:[self tagsMapping]];
[meetingsMapping addRelationshipMappingWithSourceKeyPath:@"required_participants" mapping:[self contactsMapping]];
[meetingsMapping addRelationshipMappingWithSourceKeyPath:@"optional_participants" mapping:[self contactsMapping]];
[meetingsMapping addRelationshipMappingWithSourceKeyPath:@"readonly_participants" mapping:[self contactsMapping]];
[meetingsMapping addRelationshipMappingWithSourceKeyPath:@"organizer" mapping:[self contactsMapping]];

return meetingsMapping;

它运行良好,并且从本地 CoreData 中删除了属性。

问题是getObjectsAtPath 方法仍然返回mappingResult 参数中的所有对象。

[[RKObjectManager sharedManager] getObjectsAtPath:[NSString stringWithFormat:@"%@?type=past&page=%i", URL_MEETINGS, pageNo]
                                       parameters:nil
                                          success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
                                              KLog(@"%@", mappingResult.array); // It is returning all objects, not only non-deleted objects 
                                              completionHandler(mappingResult.array, nil);
                                          
                                          failure:^(RKObjectRequestOperation *operation, NSError *error) 
                                              completionHandler(nil, error);
                                          ];   

假设如果删除了 20 个对象中的 5 个,mappingResult.array 返回 20 条记录而不是 15 条。这 5 条删除的记录没有数据。当我登录mappingResult.array时,前5条记录打印如下:

2014-03-27 13:10:14.105 MeetingKing[7851:70b] W restkit.network.core_data:RKManagedObjectRequestOperation.m:125 Unable to refetch managed object <DBMeetings: 0xc1cb820> (entity: DBMeetings; id: 0xc1a6a60 <x-coredata://7B9FC7F6-C0E9-4DF5-91AC-D7C49F54B4F5/DBMeetings/t2915CF2E-2D7D-4E29-8B39-B1C51151809410> ; data: <fault>): the object has a temporary managed object ID.
2014-03-27 13:10:14.105 MeetingKing[7851:70b] W restkit.network.core_data:RKManagedObjectRequestOperation.m:125 Unable to refetch managed object <DBMeetings: 0xc5b2ed0> (entity: DBMeetings; id: 0xc5d1110 <x-coredata://7B9FC7F6-C0E9-4DF5-91AC-D7C49F54B4F5/DBMeetings/t2915CF2E-2D7D-4E29-8B39-B1C51151809416> ; data: <fault>): the object has a temporary managed object ID.
2014-03-27 13:10:14.106 MeetingKing[7851:70b] W restkit.network.core_data:RKManagedObjectRequestOperation.m:125 Unable to refetch managed object <DBMeetings: 0xc58b6a0> (entity: DBMeetings; id: 0xc5d3de0 <x-coredata://7B9FC7F6-C0E9-4DF5-91AC-D7C49F54B4F5/DBMeetings/t2915CF2E-2D7D-4E29-8B39-B1C51151809417> ; data: <fault>): the object has a temporary managed object ID.
2014-03-27 13:10:14.106 MeetingKing[7851:70b] W restkit.network.core_data:RKManagedObjectRequestOperation.m:125 Unable to refetch managed object <DBMeetings: 0xc5b50e0> (entity: DBMeetings; id: 0xc5d4af0 <x-coredata://7B9FC7F6-C0E9-4DF5-91AC-D7C49F54B4F5/DBMeetings/t2915CF2E-2D7D-4E29-8B39-B1C51151809419> ; data: <fault>): the object has a temporary managed object ID.
2014-03-27 13:10:14.107 MeetingKing[7851:70b] W restkit.network.core_data:RKManagedObjectRequestOperation.m:125 Unable to refetch managed object <DBMeetings: 0xc1ed5a0> (entity: DBMeetings; id: 0xc1c84e0 <x-coredata://7B9FC7F6-C0E9-4DF5-91AC-D7C49F54B4F5/DBMeetings/t2915CF2E-2D7D-4E29-8B39-B1C51151809422> ; data: <fault>): the object has a temporary managed object ID.

如果我签入数据库,则只有 15 条记录。没关系。

如果我明确地从数据库中获取,它只返回 15 条记录,没关系

但是在getObjectsAtPath回调中,mappingResult.array参数返回20条记录。那不行。 :(

问题是mappingResult.arraycount变成了20,而我的UITableView显示20行,其中5行没有数据。

RestKit 是否有任何其他回调可以准确返回 15 条记录,这样我就不必从数据库中显式获取记录?

【问题讨论】:

【参考方案1】:

mappingResult 正在返回映射的对象,这是它应该做的。一些项目随后被删除的事实并没有改变这一点 - 实际上,您拥有所需的所有信息,因为您知道所有已映射的对象以及哪些对象因此被删除。

简单的解决方案是使用NSFetchedResultsController 来获取表格视图的数据。它将正确处理更新、插入和删除,您不需要做额外的工作。

或者,您需要迭代 mappingResult.array 并过滤掉已删除的项目。最好的验证方法是使用支票:

if (item.isDeleted || item.managedObjectContext == nil) 
    // remove the now invalid item...

【讨论】:

感谢@wain,我正在使用 MagicalRecords,并用它再次从数据库中获取数据。它正在返回正确的记录。我想知道是否有其他方法可以实现这一目标。

以上是关于在map中怎么删除一个对象的主要内容,如果未能解决你的问题,请参考以下文章

怎么给java对象添加动态添加属性和方法

怎么样删除map中指定值为value所有元素

从Java的Map中删除Class对象的键

RestKit本地删除对象,依然出现在mapping中

element vue Array数组和Map对象的添加与删除

JS新增对象Map、Set