2017-02-10 3 views
0

Я создал простую реляционную базу данных (например, существующую в другой dbs) модели в iOS Realm DB. Где я создал 2 отдельные модели (таблицы) Realm (идентификаторы пользователей) с другими сведениями и списком пожеланий, где пользователь имеет массив списков пожеланий, используя RLMArray. Список пожеланий может содержать 1 или более продуктов, как в my previous question. В этой таблице моделей с идентификаторами пользователя постоянно, но таблица желаний RLMArray может быть обновлена ​​или удалена. Я могу обновить RLMArray с помощью realm addOrUpdateObjectно как я могу удалить элементы из RLMArray? Пример модели реляционной базы данных ниже:Царство: как удалить объект из 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? обновить список пожеланий пользователя, когда он удалит некоторые действия?

+0

удаления также обновить, просто поместите код между 'удалить beginWriteTransaction' и '' commitWriteTransaction – Tj3n

+1

Да. Я, но в обновлении, мне нужно прочитать RLMArray, затем удалить из индекса и 'commitWriteTransaction'. –

ответ

0

Некоторые, как я удается удалить данные из области. Использование 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]; 

Если кто-нибудь есть лучшее решение, может ответить здесь. Спасибо за ваш ответ.

0

От Realm CocoaDocs

- (void)removeObjectAtIndex:(NSUInteger)index 
+0

Я попробовал это уже для этого, мне нужно сохранить 'RLMArray', а затем удалить из индекса снова присоедините' RLMArray' к модели. Есть ли другой путь. –

2

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, без необходимости делать много ручной работы связующей.

Кроме того, если у вас есть свойство Realm в User, которое вы хотите использовать для уникальной идентификации объектов, вы можете явно отметить это как первичный ключ, который позволяет вам запрашивать определенные объекты (хотя мы называем это первичный ключ для удобства, он все равно не совпадает с реляционной базой данных).

// 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, вы можете просто удалить объект Wishlist из Realm, и он будет удален из 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]; 
}]; 
+0

Я попробую это. Спасибо –

+0

Как я могу удалить один объект внутри списка пожеланий не всех объектов. –

+0

Вы можете использовать '[RLMRealm deleteObject:]' для удаления одного объекта. Если вы используете '[RLMArray removeObjectAtIndex:]', это приведет к удалению объекта из списка пожеланий, но не удалит его из Realm. – TiM

Смежные вопросы