核心数据 NSFetchrequest 整数
Posted
技术标签:
【中文标题】核心数据 NSFetchrequest 整数【英文标题】:Core Data NSFetchrequest integer 【发布时间】:2013-09-03 18:54:40 【问题描述】:我有以下情况。我有一个使用 Core Data 处理数据的应用程序。我有一个名为“Brothers”的实体,它有 3 个属性:姓名、状态、年龄。
假设我的数据库中有 1 条记录:
-Name ==> Joe (String)
-Status ==> Married (String)
-Age ==> 28 (Integer)
我有一个 UIlabel、一个 UItextfield 和一个 Button。我希望能够在 UItextfield 上键入名称(在本例中为 Joe),按下按钮并在 UILabel 中显示年龄(在本例中为 28)。我还想将年龄值存储到一个变量类型的整数中,以便以后可以用它进行一些计算。
在按钮内的代码下方。
NSEntityDescription *entitydesc = [NSEntityDescription entityForName:@"Brothers" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:entitydesc];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age %d", [self.age.text integerValue]];
[request setPredicate:predicate];
NSError *error;
NSArray *integer = [context executeFetchRequest:request error:&error];
self.displayLabel.text = integer;
更新 #1
我更新了按钮内的代码,现在我可以按名称搜索并显示年龄。我仍在考虑将年龄作为整数存储到变量中,以便以后使用。
NSEntityDescription *entitydesc = [NSEntityDescription entityForName:@"Brothers" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:entitydesc];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstname like %@", self.firstnameTextField.text];
[request setPredicate:predicate];
NSError *error;
NSArray *integer = [context executeFetchRequest:request error:&error];
if(integer.count <= 0)
self.displayLabel.text = @"No records found";
else
NSString *age;
for (NSManagedObject *object in integer)
age = [object valueForKey:@"age"];
self.displayLabel.text = [NSString stringWithFormat:@"age: %@",age];
【问题讨论】:
如果要搜索name,为什么要使用带有age的谓词? - 将 NSArray 分配给文本字段? - 阅读“Core Data Programming Guide”和“Predicate Programming Guide”可能会有所帮助。 我的错误。我刚刚修复了它,并将在帖子中编辑代码。当我按名字搜索时,我能够在我的 UILabel 上显示年龄。我仍在尝试将年龄值作为整数存储到变量中。 如果 "age" 被定义为 Core Data "Integer" 属性,则该值存储为 NSNumber。所以NSNumber *age = [object valueForKey:@"age"]
,您可以将其转换为纯整数:int i = [age intValue]
。
【参考方案1】:
谓词是一个表达式。如果表达式的计算结果为真,则满足谓词。因此,如果您按年龄搜索,您会使用例如
[NSPredicate predicateWithFormat:@"age = %d", [self.age.text integerValue]]
或按名称:
[NSPredicate predicateWithFormat:@"name = %@", someNameOrOther]
或两者兼而有之:
[NSPredicate predicateWithFormat:@"(name = %@) and (age = %d)", someNameOrOther, [self.age.text integerValue]]
获取请求获取实际的NSManagedObject
s。所以你会得到一个Brother
s 的数组。因此,您可能想要更像这样的东西来输出名称:
if([array count])
self.displayLabel.text = [array[0] name];
或者对于一个年龄:
...
self.displayLabel.text = [[array[0] age] stringValue];
或您输出的任何其他属性。
【讨论】:
OP 说要按名称搜索,因此谓词应该按名称而不是按年龄过滤。 @JuanCatalan 你是对的。从他的代码开始,我完全忽略了他的描述。我有时是一个非常盲目的人。我会解决的。【参考方案2】:我认为你的谓词是错误的,正确的格式应该是这样的:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age.integerValue == %d", [self.age.text integerValue]];
【讨论】:
实际上不需要“integerValue”,@"age = %d", someInt"
应该可以。但是OP说他要搜索name并显示age。以上是关于核心数据 NSFetchrequest 整数的主要内容,如果未能解决你的问题,请参考以下文章
默认情况下,核心数据获取(NSFetchRequest)是不是以任何特定方式排序?
使用 NSPredicate 的特定对象内的核心数据 NSFetchRequest
iPhone 核心数据:具有不同属性和字母部分的 NSFetchRequest