2017-02-10 16 views
0

私は、iOS Realm DBに単純なリレーショナルデータベース(他のDBに存在するような)モデルを作成しました。ここでは、2つの別々のRealmモデル(テーブル)のユーザーIDと他の詳細とウィッシュリストを作成しました。ユーザーはRLMArrayを使用してWishlistの配列を持っています。ウィッシュリストには、my previous questionのように1つ以上の製品を含めることができます。このモデル表では、ユーザーIDは一定ですが、RLMArrayのWishlist表は更新または削除できます。領域を使用してRLMArrayを更新できましたaddOrUpdateObjectRLMArrayから要素を削除するにはどうすればよいですか? 例リレーショナルデータベースモデルは以下の通りです:レルムからレルム: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; 

新規挿入アクティビティ:

enter image description here

コードはこれに似ています

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

私は領域からデータを削除するために管理する方法をいくつかRealm CocoaDocsから。 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]; 

誰もがよりよい解決策を持っている場合は、ここで答えることができます。 ご回答いただきありがとうございます。

0

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

私はこれを既に試しました。私は 'RLMArray'を保存してから、インデックスから削除して' RLMArray'をモデルに再度添付しなければなりません。それ以外の方法はありますか? –

2

レルムはオブジェクトデータベースであり、リレーショナルデータベースではないため、オブジェクトをリンクするために外部キーシステムを実装する必要はありません。 UserWishListのどのアイテムが属しているかを確認したい場合は、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が属していることをしたユーザーを取得するためにwishlist.users.firstObjectを呼び出すことができますを意味します。

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オブジェクトは、(彼らはただの参照を作っている)どちらも、明示的にお互いを所有していないと、レルム内の別々のテーブルに格納されています。 WishlistアイテムがUserの1つだけにユニークな場合は、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:]'を使うと、オブジェクトは 'wishlist'から削除されますが、Realmからは削除されません。 – TiM

関連する問題