领域:如何从RLMArray中删除对象?

时间:2017-02-10 07:01:15

标签: ios objective-c realm

我在iOS Realm DB中创建了简单的关系数据库(就像存在于其他dbs中一样)。我在其中创建了两个单独的Realm模型(表)用户ID以及其他详细信息和一个Wishlist,其中用户使用RLMArray拥有一个Wishlist数组。愿望清单可以包含my previous question中的一个或多个产品。在此模型中,具有用户ID的表是常量,但可以更新或删除RLMArray的Wishlist表。我可以使用领域RLMArray 更新addOrUpdateObject,但如何删除RLMArray中的元素? 示例关系数据库模型如下:

enter image description here

代码与此类似:

#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中删除元素?删除某些活动时更新用户心愿单?

3 个答案:

答案 0 :(得分:3)

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所属的用户,而无需进行大量手动链接工作。

此外,如果您在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 

UserWishlist对象存储在Realm中的单独表中,两者都没有明确拥有(他们只是在做引用)。如果Wishlist项仅对一个User唯一,那么您只需从Realm中删除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];
}];

答案 1 :(得分:1)

我如何设法从领域中删除数据。使用RLMArrayaddOrUpdateObject

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];

如果有更好的解决方案可以在这里回答。 感谢您的回复。

答案 2 :(得分:0)

来自Realm CocoaDocs

- (void)removeObjectAtIndex:(NSUInteger)index