高级应用中CoreData的使用与验证错误处理
立即解锁
发布时间: 2025-08-26 00:46:19 阅读量: 9 订阅数: 18 


Core Data深入浅出:从入门到精通
### 高级应用中 Core Data 的使用与验证错误处理
#### 1. Core Data 对象创建与验证基础
在 Core Data 中,创建和设置托管对象的属性需要多个步骤。首先在上下文中创建对象,然后设置其属性和关系。例如,为 `Foo` 实体创建托管对象的代码如下:
```objc
NSManagedObject *foo = [NSEntityDescription insertNewObjectForEntityForName:@"Foo"
inManagedObjectContext:[self managedObjectContext]];
// foo 在此时无效;bar 少于五个字符
[foo setValue:@"abcde" forKey:@"bar"];
```
这里,`foo` 对象在创建后处于无效状态,但托管对象上下文会忽略这一点。直到上下文保存时,对象才会被验证。
#### 2. MyStash 应用的验证规则设置
在 MyStash 应用中,需要为数据模型添加验证规则。具体是对 `System` 实体的 `userId` 属性进行如下设置:
- 设置最小长度为 3。
- 设置最大长度为 10。
- 设置正则表达式,只允许字母和数字:`[A-Za-z0-9]*`。
设置完成后,保存数据模型,即可开始实现验证错误处理例程。
#### 3. 验证错误处理例程的实现
验证错误处理例程应接受一个指向 `NSError` 对象的指针,并返回一个包含错误消息的 `NSString`,错误消息之间用换行符分隔。
首先,在 `PasswordListViewController.h` 中声明该例程:
```objc
- (NSString *)validationErrorText:(NSError *)error;
```
然后在 `PasswordListViewController.m` 中实现该例程:
```objc
#pragma mark - Validation Error Handling
- (NSString *)validationErrorText:(NSError *)error
{
// 创建一个字符串来保存所有错误消息
NSMutableString *errorText = [NSMutableString stringWithCapacity:100];
// 确定是单个错误还是多个错误,并将它们放入数组中
NSArray *errors = [error code] == NSValidationMultipleErrorsError ? [[error
userInfo] objectForKey:NSDetailedErrorsKey] : [NSArray arrayWithObject:error];
// 遍历错误
for (NSError *err in errors)
{
// 获取验证出错的属性名
NSString *propName = [[err userInfo] objectForKey:@"NSValidationErrorKey"];
NSString *message;
// 形成适当的错误消息
switch ([err code])
{
case NSValidationMissingMandatoryPropertyError:
message = [NSString stringWithFormat:@"%@ required", propName];
break;
case NSValidationStringTooShortError:
message = [NSString stringWithFormat:@"%@ must be at least %d characters",
propName, 3];
break;
case NSValidationStringTooLongError:
message = [NSString stringWithFormat:@"%@ can't be longer than %d characters",
propName, 10];
break;
case NSValidationStringPatternMatchingError:
message = [NSString stringWithFormat:@"%@ can contain only letters and
numbers", propName];
break;
default:
message = @"Unknown error. Press Home button to halt.";
break;
}
// 用换行符分隔错误消息
if ([errorText length] > 0)
{
[errorText appendString:@"\n"];
}
[errorText appendString:message];
}
return errorText;
}
```
#### 4. 代码调整以集成验证错误处理例程
为了将验证错误处理例程集成到应用中,需要对代码进行一些调整。在 `PasswordListViewController.h` 中,更改两个方法的返回类型:
```objc
- (NSManagedObject *)insertPasswordWithName:(NSString *)name userId:(NSString *)userId
password:(NSString *)password;
- (NSString *)saveContext;
```
`insertPasswordWithName:` 方法现在必须返回一个 `NSManagedObject*`,原因是可能需要删除该方法创建的托管对象。例如,用户创建新密码时输入无效数据,保存上下文失败,之后取消操作,如果没有对新创建对象的引用,无效对象仍会存在于托管对象上下文中,后续保存将失败。
更新后的 `insertPasswordWithName:` 和 `saveContext:` 方法如下:
```objc
- (NSManagedObject *)insertPasswordWithName:(NSString *)name userId:(NSString *)userId
password:(NSString *)password
{
NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[fetchedResultsController fetchRequest] entity];
NSManagedObject *newPassword = [NSEntityDescription
insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
[newPassword setValue:name forKey:@"name"];
[newPassword setValue:userId forKey:@"userId"]
```
0
0
复制全文
相关推荐










