2016-01-04 32 views
1

假設有兩種ManagedObject通過SQLite的支持:如何將NSPredicate與鏈式虛擬財產一起使用?

1)一種User其具有兩個屬性,firstnamelastname並且該只讀虛擬(瞬態)屬性fullname

@interface User : NSManagedObject 
... 
@property NSString *firstname; 
@property NSString *lastname; 
@property (readonly) NSString *fullname; 
@end 

@implementation User 
... 
- (NSString*)fullname 
{ 
    return [NSString stringWithFormat:@"%@ %@", self.firstname, self.lastname]; 
} 
@end 

2.),其具有除了其他幾個屬性存儲在sender屬性恰好一個用戶的關係的Message

@interface Message : NSManagedObject 
@property User *sender; 
@end 

我想使用某個發件人的全名來獲取消息的所有實例。這是NSPredicate我構建:

[NSPredicate predicateWithFormat:@"sender.fullname CONTAINS[cd] %@", @"Searched Name"]] 

不幸的是,我得到一個NSInvalidArgumentException一旦我開始搜索:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unimplemented SQL generation for predicate : (sender.fullname CONTAINS[cd] "S")' 
+1

您可能想查閱本書中關於搜索文本的章節:https://www.objc.io/books/core-data/ - 它介紹瞭如何使字符串搜索工作可靠快速地進行。 Unicode很棘手。這裏有一篇文章涉及到了一些:https://www.objc.io/issues/9-strings/unicode/ –

回答

2

不能在獲取請求謂詞使用瞬態性能,這是因爲您嘗試使用的數據在SQLite數據庫中不存在。

您需要重寫謂詞以僅使用firstnamelast name

您可能想要使用BEGINSWITHENDSWITH來做到這一點,然後您可能還想在獲取提取結果後運行第二個篩選器,以確保結果集中沒有任何誤報。

或者,你可以使全名非瞬態,然後它可以在謂詞中使用。在這種情況下,您將實現自定義訪問器方法,以確保任何更新也適用於全名。

+0

作爲一種+1,我在我的項目中採用了替代方法,包括自定義設置器更新相關屬性。在一天結束時,能夠做適當的提取,尤其是使用NSFetchedResultsControllers時,太重要了。 – Avi

+0

我也採取了替代方法!按預期工作... – Scholle