2017-02-10 34 views
0

我已經在iOS Realm DB中創建了簡單的關係數據庫(如存在於其他dbs中)模型。我在哪裏創建了2個獨立的Realm模型(表格)用戶標識符以及其他詳細信息和一個願望清單,其中用戶使用RLMArray有一系列願望清單。心願單可以包含1個或多個產品,如my previous question。在這個使用用戶ID的模型表中是恆定的,但願望清單表RLMArray可以更新或刪除。我可以使用領域更新RLMArrayaddOrUpdateObject但是我如何從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

一些我如何設法從境界刪除數據。使用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

Realm CocoaDocs

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

我試過這個,我必須存儲'RLMArray',然後再從索引中刪除,再將'RLMArray'附加到模型中。有沒有其他的方法。 –

2

領域是對象數據庫,而不是關係數據庫,因此您不應該需要實現外鍵系統才能鏈接對象。如果您想查看哪個User a項目所屬的項目,則可以使用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對象存儲在域單獨的表中,既沒有明確地擁有對方(他們只是做參考)。如果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]; 
}]; 
+0

我會試試這個。謝謝 –

+0

如何刪除願望清單中的單個對象而不是所有對象。 –

+0

您可以使用'[RLMRealm deleteObject:]'刪除單個對象。如果你使用'[RLMArray removeObjectAtIndex:]',那會從'wishlist'中刪除對象,但不會從Realm中刪除它。 – TiM