5

我有一个表用户,并且在核心数据模型中有一堆列。其中一列是 user_id ,我正在尝试获取最高的 user_id 并为其添加 + 1 并将其传递给将插入的下一个对象。我遵循苹果开发者指南并按照建议实施。这是我要执行的代码。

问题是:我正在返回的 account_id 值被设置为一些奇怪的数字,甚至在数据库中都不存在。

"account_id" = 139784529; 它应该是 1,因为我只保存了核心数据。

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Users" inManagedObjectContext:self._managedObjectContext];
[request setEntity:entity];

// Specify that the request should return dictionaries.
[request setResultType:NSDictionaryResultType];

// Create an expression for the key path.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"account_id"];

// Create an expression to represent the function you want to apply
NSExpression *expression = [NSExpression expressionForFunction:@"max:"
                                                     arguments:@[keyPathExpression]];

// Create an expression description using the minExpression and returning a date.
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];

// The name is the key that will be used in the dictionary for the return value.
[expressionDescription setName:@"maxAccountId"];
[expressionDescription setExpression:expression];
[expressionDescription setExpressionResultType:NSInteger32AttributeType]; // For example, NSDateAttributeType

// Set the request's properties to fetch just the property represented by the expressions.
[request setPropertiesToFetch:@[expressionDescription]];

// Execute the fetch.
NSError *error;
NSArray *objects = [self._managedObjectContext executeFetchRequest:request error:&error];
if (objects == nil) {
    // Handle the error.
}
else {
    if ([objects count] > 0) {
        nextAccountId = [[[objects objectAtIndex:0] valueForKey:@"maxAccountId"] integerValue];
    }
}
}

@catch (NSException *exception) {
    NSLog(@"%@",[exception reason]);
}

return nextAccountId + 1;

希望有人以前遇到过这个问题并解决了它。

谢谢

4

2 回答 2

3

谢谢大家看问题。也感谢您的评论和回答。在找出从终端查看 sqlite 数据库的问题后,我注意到该表已损坏,并且它正在将所有垃圾值返回给我。这个问题真的很简单。这就是我为修复它所做的。

  1. 从 iPhone 模拟器中删除了该应用程序。
  2. 清洁溶液
  3. 重新编译程序。运行它,然后bam ..它起作用了。

对于那些不知道从终端访问 sqlite的人来说,这只是一个开发者提示。

  1. 找出你的 sqlite 的位置。通常 /User/UserName/Library/Application Support/iPhone Simulator/6.1/xxxxxxxxxx/Documents cd 到这个目录。

  2. 输入 sqlite3 命令

  3. 将“Application.sqlite”附加为 db1

  4. bam .. 运行你的命令。

  5. 如果您想查看在 -type .database 中运行的数据库

再次感谢大家。

于 2013-05-13T00:08:21.633 回答
1

在我删除了 try/catch 代码并将获取请求后的 if 语句简化为:

if ([objects count] > 0) {
    nextAccountId = [[[objects objectAtIndex:0] valueForKey:@"maxAccountId"] integerValue];
}
else {
    nextAccountId = 0;
}

如果这不能解决它,请确认您具有正确的初始化托管对象上下文(self._managedObjectContextself.managedObjectContext您定义它的方式相比)并且实体/属性名称是正确的。

于 2013-05-09T04:11:08.363 回答