我正在使用下面的代码从我的ManagedObjectContext填充数组,但我想要的是只获取与我的查询匹配的每一行的唯一ID号(itemType = 1)并填充fetchResults数组只有这些唯一的ID号。那可能吗? 任何帮助表示赞赏。 LQ
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"MyAppName"
inManagedObjectContext:[self managedObjectContext]]];
NSError *error = nil;
NSPredicate *predicate;
NSArray *fetchResults;
predicate = [NSPredicate predicateWithFormat:@"(itemType = %i)", 1];
[request setPredicate:predicate];
fetchResults = [managedObjectContext executeFetchRequest:request error:&error];
if (!fetchResults) {
// NSLog(@"no fetch results error %@", error);
}
self.mutableArrayName = [NSMutableArray arrayWithArray:fetchResults];
[request release];
答案 0 :(得分:0)
predicate = [NSPredicate predicateWithFormat:@"itemType == 1"];
或
predicate = [NSPredicate predicateWithFormat:@"(itemType == %i)", 1];
应该都有效。
答案 1 :(得分:0)
为了帮助有类似需求的人,我正在回答我自己的问题。我找到了一个解决方案,用于以查询形式从我的SQLite数据库中提取特定的行和/或列数据,而不是使用Fetch with Predicate。 (注意:代码显示了提取字符串和整数数据类型的示例。)
首先,为libsqlite3.0.dylib添加一个Framework
在标题中添加以下文件:
#import <sqlite3.h>
@interface MyViewController : UIViewController {
NSMutableArray *dataArray; // This array will hold data you will extract
NSArray *summaryArray; // This holds an array of PKIDs that will be queried
}
@property (nonatomic, retain) NSMutableArray *dataArray;
@property (nonatomic, assign) NSArray *summaryArray;
- (void)getData:(NSInteger *)intPKID;
- (NSString *) getDBPath;
@end
在实施文件中添加以下内容:
static sqlite3 *database = nil; // add this before the @implementation line
@synthesize dataArray;
@synthesize summaryArray;
- (NSString *) getDBPath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
return [documentsDir stringByAppendingPathComponent:@"MyDatabaseName.sqlite"];
}
- (void)getData:(NSInteger *)intPKID {
NSString *dbPath = [self getDBPath];
if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {
NSString *strSQL;
NSString *strExtractedData;
NSUInteger count;
NSInteger intPK;
if (self.dataArray == nil) {
self.dataArray = [[[NSMutableArray alloc] init] autorelease];
} else {
[self.dataArray removeAllObjects];
}
count = [self.summaryArray count];
for (NSUInteger i = 0; i < count; ++i) {
// Extract a specific row matching a PK_ID:
strSQL = [NSString stringWithFormat: @"select intPKID, strColumnName from MyDatabaseName where (PKID = %i)", [[self.summaryArray objectAtIndex:i]intValue]];
// Extract a range of rows matching some search criteria:
// strSQL = [NSString stringWithFormat: @"select intPKID, strColumnName from MyDatabaseName where (ITEMTYPE = '%i')", 1];
const char *sql = (const char *) [strSQL UTF8String];
sqlite3_stmt *selectstmt;
if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {
while(sqlite3_step(selectstmt) == SQLITE_ROW) {
[self.dataArray addObject:[NSNumber numberWithInt:qlite3_column_int(selectstmt, 0)]];
[self.dataArray addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)]];
}
}
}
} else {
sqlite3_close(database); // Database not responding - close the database connection
}
}