ios - 该操作无法完成。 ( cocoa 错误512。)Coredata Iphone。文件文件夹中不能复制任何文件

标签 ios iphone sqlite core-data

我正在使用iOS 5.1的xcode 4.3版本的coredata项目。
我已经制作了一个ARC空项目,并选中了CoreData复选框,然后按照xcode添加的方法来管理模型,并按照将预填充的sqllite数据库复制到我的应用程序的教程进行了修改,该预填充的数据库位于项目文件夹内的资源组中并具有模型和项目的相同名称。

- (void)saveContext
{
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
         } 
     }
}

#pragma mark - Core Data stack

// Returns the managed object context for the application.

// If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.

- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
         return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext;
}

// Returns the managed object model for the application.
// If the model doesn't already exist, it is created from the application's model.

- (NSManagedObjectModel *)managedObjectModel
{
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Prova1" withExtension:@"momd"];

NSLog(@"modelURL %@",modelURL);

    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

// Returns the persistent store coordinator for the application.
// If the coordinator doesn't already exist, it is created and the application's store added to it.

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

NSString *storePath = [[[self applicationDocumentsDirectory] absoluteString] stringByAppendingPathComponent:@"Prova1.sqlite"];
 NSLog(@"storePath %@",storePath);

 NSURL *storeURL = [NSURL fileURLWithPath:storePath];
 NSLog(@"storeURL %@",storeURL);

 // Put down default db if it doesn't already exist
 NSFileManager *fileManager = [NSFileManager defaultManager];
 if (![fileManager fileExistsAtPath:storePath]) {
     NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Prova1" ofType:@"sqlite"];
     if (defaultStorePath) {
          [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
     }
}/**/

/*NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Prova1.sqlite"];*/

NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
    /*
     Replace this implementation with code to handle the error appropriately.

     abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 

     Typical reasons for an error here include:
     * The persistent store is not accessible;
     * The schema for the persistent store is incompatible with current managed object model.
     Check the error message to determine what the actual problem was.


     If the persistent store is not accessible, there is typically something wrong with the file path. Often, a file URL is pointing into the application's resources directory instead of a writeable directory.

     If you encounter schema incompatibility errors during development, you can reduce their frequency by:
     * Simply deleting the existing store:
     [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]

     * Performing automatic lightweight migration by passing the following dictionary as the options parameter:
     @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES}

     Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details.

     */
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}    

return _persistentStoreCoordinator;
}

#pragma mark - Application's Documents directory
// Returns the URL to the application's Documents directory.

- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

在这里,取而代之的是viewcontroller的实现,该实现带有与db交互的某些字段。
@implementation ALCViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.textfied1 = [[UITextField alloc] initWithFrame:CGRectMake(200, 50, 300, 30)];
    self.textfied1.borderStyle = UITextBorderStyleRoundedRect;
    self.textfied1.delegate = self;
    [self.view addSubview:self.textfied1];

    self.textfied2 = [[UITextField alloc] initWithFrame:CGRectMake(200, 100, 300, 30)];
    self.textfied2.borderStyle = UITextBorderStyleRoundedRect;
    self.textfied2.delegate = self;
    [self.view addSubview:self.textfied2];

    self.salvaButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [self.salvaButton setFrame:CGRectMake(200, 150, 100, 20)];
    [self.salvaButton setTitle:@"salva" forState:UIControlStateNormal];
    [self.salvaButton addTarget:self action:@selector(salva:) forControlEvents:UIControlEventTouchDown];
    [self.view addSubview:self.salvaButton];

    self.cercaButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [self.cercaButton setFrame:CGRectMake(200, 200, 100, 20)];
    [self.cercaButton setTitle:@"Elenca" forState:UIControlStateNormal];
    [self.cercaButton addTarget:self action:@selector(cerca:) forControlEvents:UIControlEventTouchDown];
    [self.view addSubview:self.cercaButton];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    UIToolbar *toolbar = [[UIToolbar alloc] init];
    [toolbar setBarStyle:UIBarStyleBlackTranslucent];
    [toolbar sizeToFit];
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneClicked:)];

    if ([textField isEqual:self.textfied1]) {
        [doneButton setTag:1];
    }
    if ([textField isEqual:self.textfied2]) {
        [doneButton setTag:2];
    }

    [toolbar setItems:[NSArray arrayWithObjects:/*flexibleSpaceLeft,*/ doneButton, nil]];
    [textField setInputAccessoryView:toolbar];
    [textField setText:@""];
    [textField setTextColor:[UIColor blackColor]];
    [textField setFont:[UIFont systemFontOfSize:16]];/**/
    return YES;
}

- (void)doneClicked:(id)sender {
    UIButton *bSender = (UIButton *)sender;

    switch ([bSender tag]) {
    case 1: {
        [self.textfied1 resignFirstResponder];
    }
    break;
    case 2: {
        [self.textfied2 resignFirstResponder];
    }
    break;
    default:
    break;
    }
}

- (void)salva:(id)sender {
    ALCAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];

    NSManagedObject *newContact;
    newContact = [NSEntityDescription insertNewObjectForEntityForName:@"Stica" inManagedObjectContext:context];
    [newContact setValue:self.textfied1.text forKey:@"nome"];
    [newContact setValue:self.textfied2.text forKey:@"sfiga"];

    self.textfied1.text = @"";
    self.textfied2.text = @"";

    NSError *error;
    [context save:&error];
    //status.text = @”Contact saved”;
}

- (void)cerca:(id)sender {
    ALCAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

    NSManagedObjectContext *context = [appDelegate managedObjectContext];
    NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"Stica" inManagedObjectContext:context];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDesc];

    /*NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name = %@)", name.text];
 [request setPredicate:pred];*/

    NSError *error;

    NSArray *objects = [context executeFetchRequest:request error:&error];

    if ([objects count] == 0) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Risultati" message:@"Vuoto" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alert show];
    } 
    else {
        for (NSManagedObject *object in objects) {
            NSMutableString *string = [[NSMutableString alloc] initWithFormat:@"%@ - %@",[object valueForKey:@"nome"],[object valueForKey:@"sfiga"]];
            NSLog(@"%@",string);
        }
    }
}

@end

当我尝试查看存储在数据库中的记录时,问题就来了,实际上是按下名为“Elenca”的按钮时出错,xcode给了我这个错误:
Unresolved error Error Domain=NSCocoaErrorDomain Code=512 
"The operation couldn’t be completed. (Cocoa error 512.)" 
UserInfo=0x6e7a120 {
    reason=Failed to create file; code = 2
}, 
{
    reason = "Failed to create file; code = 2";
}

我也尝试输出一些变量:

storePath 文件:/localhost/Users/winimac01/Library/Application%20Support/iPhone%20Simulator/5.1/Applications/7733DC6C-CE52-4EB4-9A60-26962F7AEDD9/Documents/Prova1.sqlite

storeURL 文件:/localhost/Users/winimac01/Library/Application%2520Support/iPhone%2520Simulator/5.1/Applications/7733DC6C-CE52-4EB4-9A60-26962F7AEDD9/Documents/Prova1.sqlite-file:// localhost /

模型URL 文件://://localhost/Users/winimac01/Library/Application%20Support/iPhone%20Simulator/5.1/Applications/7733DC6C-CE52-4EB4-9A60-26962F7AEDD9/Prova1.app/Prova1.momd/
2012-10-22 12:30:46.598 Prova1 [2479:fb03]()isEditable 0,实体{
Meco =“()name Meco,managedObjectClassName NSManagedObject,renamingIdentifier Meco,isAbstract 0,实体名称(空),属性{\ n miracoli = \”(),name miracoli,isOptional 1,isTransient 0,实体Meco,renamingIdentifier miracoli,验证谓词(\ n),警告(\ n),versionHashModifier(null)\ n userInfo {\ n},attributeType 700,attributeValueClassName NSString,defaultValue(null)\“; \ n morte = \”(),名称morte,isOptional 1,isTransient 0,实体Meco,renamingIdentifier morte,验证谓词(\ n),警告(\ n),versionHashModifier(null)\ n userInfo {\ n},attributeType 700,attributeValueClassName NSString,defaultValue(null)\“; \ n nome = \“(),名称nome,isOptional 1,isTransient 0,实体Meco,renamingIdentifier nome,验证谓词(\ n),警告(\ n),versionHashModifier(null)\ n userInfo {\ n},attributeType 700 ,attributeValueClassName NSString,defaultValue(null)\“; \ n关系= \”(),名称关系,isOptional 1,isTrans方向0,实体Meco,renamingIdentifier关系,验证谓词(\ n),警告(\ n),versionHashModifier(null)\ n userInfo {\ n},目标实体Stica,inverseRelationship关系,minCount 1,maxCount 1,isOrdered 0, deleteRule 1 \“; \ n},子实体(null),userInfo {\ n},versionHashModifier(null)”;
Stica =“()名称Stica,managedObjectClassName NSManagedObject,renamingIdentifier Stica,isAbstract 0,实体名称(空),属性{\ n nome = \”(),名称nome,isOptional 1,isTransient 0,实体Stica,renamingIdentifier nome,验证谓词(\ n),警告(\ n),versionHashModifier(null)\ n userInfo {\ n},attributeType 700,attributeValueClassName NSString,defaultValue(null)\“; \ n关系= \”(),名称关系,isOptional 1,isTransient 0,实体Stica,renamingIdentifier关系,验证谓词(\ n),警告(\ n),versionHashModifier(null)\ n userInfo {\ n},目标实体Meco,inverseRelationship关系,minCount 1,maxCount 1,isOrdered 0,deleteRule 1 \“; \ n sfiga = \”(),名称sfiga,isOptional 1,isTransient 0,实体Stica,renamingIdentifier sfiga,验证谓词(\ n),警告(\ n),versionHashModifier(空)\ n userInfo {\ n},attributeType 700,attributeValueClassName NSString,defaultValue(null)\“; \ n},子条目es(空),userInfo {\ n},versionHashModifier(空)”;
},获取请求模板{
}

而且我不知道为什么 storeURL 具有这种形式,字符串末尾的“-file:// localhost /”是什么?
为什么无法创建.sqlite文件?而这是解决问题的正确方法?我已经尝试过重置模拟器,并且路径正确...

提前致谢

编辑1:
我研究过的tut是this

编辑2:
一个可行的解决方案是更改这段代码:
NSString *storePath = [[[self applicationDocumentsDirectory] absoluteString] stringByAppendingPathComponent:@"Prova1.sqlite"];
NSURL *storeURL = [NSURL fileURLWithPath:storePath];

 // Put down default db if it doesn't already exist
 NSFileManager *fileManager = [NSFileManager defaultManager];
 if (![fileManager fileExistsAtPath:storePath]) {
     NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Prova1" ofType:@"sqlite"];

     if (defaultStorePath) {
         [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
     }
 }/**/

与:
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Prova1.sqlite"];

// Put down default db if it doesn't already exist
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:storePath]) {
    NSURL *defaultStoreURL = [[NSBundle mainBundle] URLForResource:@"Prova1" withExtension:@"sqlite"];

    if (defaultStoreURL) {
        [fileManager copyItemAtURL:defaultStoreURL toURL:storeURL error:NULL];
    }
}/**/

最佳答案

absoluteString

NSString *storePath = [[[self applicationDocumentsDirectory] absoluteString] stringByAppendingPathComponent:@"Prova1.sqlite"];

是不正确的。它创建一个字符串
file:/localhost/Users/winimac01/...

其中“文件:”实际上是字符串的一部分,因此该文件肯定不存在。

相反,使用path应该可以解决此问题:
NSString *storePath = [[[self applicationDocumentsDirectory] path] stringByAppendingPathComponent:@"Prova1.sqlite"];

关于ios - 该操作无法完成。 ( cocoa 错误512。)Coredata Iphone。文件文件夹中不能复制任何文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13010731/

相关文章:

android - onDelete = NO_ACTION 导致错误 : "SQLiteConstraintException: FOREIGN KEY constraint failed" (code 787)

ios - 从 swift 1.2 迁移后 swift2 中的 healthKit 错误

ios - 我如何在 iOS 中将 NSNumber 转换为 ABRecordID

objective-c - 在 iOS 应用程序中实现 SoundCloud API - 出现错误

sqlite - 核心数据轻量级迁移 : what's required to trigger it?

java - 应用程序崩溃 SQLite DB 处理程序

javascript - 在没有 jQuery 的情况下防止双击缩放

ios - Watchkit 动画实现 : clock face, 动画图表,圆形进度条

iphone - 如何在 Core Graphics 中生成 RGBA 图像?

iphone - 创建 NSURL 但仅显示链接文本