2014-01-15 137 views
2

我試圖使用NSPredicate只獲取特定的對象。問題是所有的對象都被提取,並且它只應該是條件正確的特定對象。NSPredicate返回所有對象

- (void)fetchDevices { 
    // Fetch the devices from persistent data store 

    NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Songs"]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Songs" inManagedObjectContext:managedObjectContext]; 
    [fetchRequest setEntity:entity]; 
    // retrive the objects with a given value for a certain property 
    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"selectedRow == %@" , selectedRowNumber]; 
    devices = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 
    [fetchRequest setPredicate:predicate]; 

} 

selectedRowNumber是在.h文件中聲明的int

在我的歌實體一看:

enter image description here

PS。如果需要更多信息,請在下面留言,我會提供。

回答

3

你必須執行讀取請求之前分配謂詞

而且,如果selectedRowNumberint,那麼你必須使用%d格式 而不是%@

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"selectedRow == %d" , selectedRowNumber]; 
[fetchRequest setPredicate:predicate]; 
devices = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 
0

無需使用setEntity來設置實體。

[fetchRequest setPredicate:predicate] 

只需設置謂詞,它就可以工作。

- (void)fetchDevices { 
    // Fetch the devices from persistent data store 

    NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Songs"]; 
    // retrive the objects with a given value for a certain property 
    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"selectedRow == %@" , selectedRowNumber]; 
    [fetchRequest setPredicate:predicate]; 
    devices = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 
    [fetchRequest setPredicate:predicate]; 

} 
0

試試這個,

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"selectedRow = %@" , [NSNumber numberWithInt: selectedRowNumber]]; 
[fetchRequest setPredicate:predicate]; 
devices = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 
0

似乎有兩個問題。

  1. 我想你需要前devices = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];

  2. [fetchRequest setPredicate:predicate];@"selectedRow == %d"似乎不正確的。您可能需要將其更改爲@"selectedRow = %d"

  3. 而且不需要再次設置實體。

所以代碼可能看起來像這樣。

- (void)fetchDevices { 
    int selectedRowNumber = 1; 
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Songs"]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"selectedRow = %d" , selectedRowNumber]; 
    [fetchRequest setPredicate:predicate]; 
    NSArray *devices = [[managedObjectContext executeFetchRequest:fetchRequest error:nil]  mutableCopy]; 
} 

讓我知道如何去:)

+0

您可以使用''==或'='謂詞中,它沒有任何區別。 –

+0

很酷。感謝您的高舉。 –