[英]Realm : How to delete object from RLMArray?
我已经在iOS Realm DB中创建了简单的关系数据库模型(就像其他数据库中存在的模型一样)。 我在其中创建了2个单独的Realm模型(表)以及其他详细信息和一个愿望清单,其中用户使用RLMArray
了一个愿望清单数组。 与我之前的问题一样,愿望清单可以包含1个或更多产品。 在此具有用户ID的模型表中,该表是恒定的,但RLMArray
愿望清单表可以更新或删除。 我可以使用领域addOrUpdateObject
更新RLMArray
但是如何从RLMArray
删除元素? 关系数据库模型示例如下:
代码与此类似:
#import <Realm/Realm.h>
@class User;
// User model
@interface User : RLMObject
@property NSString *name;
@property NSString *user_id;
@property RLMArray< Wishlist *>< Wishlist > *wishlist;
@end
// Wishlist model
@interface Wishlist : RLMObject
@property NSString *id;
@property NSInteger *activity;
@property NSInteger *cost;
@end
RLM_ARRAY_TYPE(Wishlist) // define RLMArray<Person>
// Implementations
@implementation User
@end // none needed
@implementation Wishlist
@end // none needed
从领域读取数据:
RLMResults *watchlistDB = [Watchlist allObjects];
WatchlistDB = [realm_data objectAtIndex:index];
RLMArray *realm_array = WatchlistDB.watchlist;
插入新活动:
User *user_realm = [[MyWatchlistDB alloc] init];
user_realm.user_id = _user_id;
user_realm.name = _user_name;
for (NSDictionary *tempDict in activity)
{
Wishlist *wishlist_realm = [[Wishlist alloc] init];
newWatchlist.id =[tempDict objectForKey:@"id"];
newWatchlist.activity =[tempDict objectForKey:@"activity"];
newWatchlist.cost = [tempDict objectForKey:@"cost"];
[user_realm.wishlist addObject:newWatchlist];
}
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
[realm addOrUpdateObject:user_realm];
[realm commitWriteTransaction];
如何从RLMArray删除元素? 删除用户活动时更新用户愿望清单?
Realm是一个对象数据库,而不是关系数据库,因此您不需要实现外键系统来链接对象。 如果您想了解哪些User
一个WishList
的项目属于,你可以使用RLMLinkingObject
功能提供的,而不是你现在在做什么,反向查找。
// Wishlist model
@interface Wishlist : RLMObject
@property NSInteger *activity;
@property NSInteger *cost;
@property (readonly) RLMLinkingObjects *users;
@end
RLM_ARRAY_TYPE(Wishlist) // define RLMArray<Person>
// Implementations
@implementation Wishlist
+ (NSDictionary *)linkingObjectsProperties {
return @{
@"users": [RLMPropertyDescriptor descriptorWithClass:User.class
propertyName:@"wishlist"]
};
}
@end
这意味着您可以调用wishlist.users.firstObject
来获取该wishlist.users.firstObject
Wishlist
所属的用户,而无需进行大量手动链接工作。
此外,如果您在“ User
中拥有要用于唯一标识对象的Realm属性,则可以将其明确标记为主键,以便您查询特定的对象(即使我们为了方便起见也将其称为主键) ,它仍然与关系数据库不同)。
// User model
@interface User : RLMObject
@property NSString *name;
@property NSString *user_id;
@property RLMArray< Wishlist *>< Wishlist > *wishlist;
@end
@implementation User
+ (NSString *)primaryKey {
return @"user_id";
}
@end
User
和Wishlist
对象存储在Realm中的单独表中,彼此之间都不明确拥有(它们只是在进行引用)。 如果一个Wishlist
项目仅对一个User
唯一,那么您只需从Realm删除该Wishlist
对象, Wishlist
对象也会从RLMArray
删除。
要删除属于单个用户的所有愿望清单条目,只需执行此操作即可。
//Get John Smith's entry
User *johnSmith = [User objectForPrimaryKey:@"084"];
//Delete all of the items in John's wishlist
RLMRealm *realm = [RLMRealm defaultRealm]
[realm transactionWithBlock:^{
[realm deleteObjects:johnSmith.wishlist];
}];
我如何设法从领域删除数据。 使用RLMArray
和addOrUpdateObject
。
RLMArray<Wishlist> *wishlist_array = Userdb_realm.wishlist; // reading existing data
User *Userdb = [[User alloc] init];
Userdb.user_id = _Userdb_id;
Userdb.name = _Userdb_name;
for (NSString *temp in delArray)
{
for (int i = 0; i<[wishlist_array count]; i++) {
Wishlist *wishlistTodel = wishlist_array[i];
if ([wishlistTodel.user_id isEqualToString:temp]) {
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
[wishlist_array removeObjectAtIndex:i];
[realm commitWriteTransaction];
break;
}
}
}
Userdb.wishlist = wishlist_array;
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
[realm addOrUpdateObject:Userdb];
[realm commitWriteTransaction];
如果有人有更好的解决方案,可以在这里回答。 感谢您的答复。
- (void)removeObjectAtIndex:(NSUInteger)index
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.