1

私は小さなデータベース駆動型アプリをやっています。xcodeのサポートファイルの下にSQLiteデータベースファイルがあります。最初は、メインバンドルにあるときにデータを書き込もうとしていましたが、書き込めませんでした。検索した後、私はこの答えに出くわし、コードを次のように変更しました。

- (void)viewDidLoad
{
    [super viewDidLoad];

        BOOL success;
        NSFileManager *filemngr = [[NSFileManager alloc] init];
        NSError *error;
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
        NSString *documentDirectory = [paths objectAtIndex:0];
        NSString *writableDbPath = [documentDirectory stringByAppendingPathComponent:@"contacts.sqlite"];
        success = [filemngr fileExistsAtPath:writableDbPath];
        if(!success)
        {
            [status setText:@"Error occurred!"];
        }

        NSString *defaultDbPath = [[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent:@"contacts.sqlite"];
        success = [filemngr copyItemAtPath:defaultDbPath toPath:writableDbPath error:&error];
        if (!success)
        {
            [status setText:[error localizedDescription]];
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error!"
                                                            message:[error localizedDescription]
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
            [alert show];
        }
    }

ファイルを書き込み可能な場所(UIAlertViewが表示されている場所)にコピーしようとすると、最後のifブロックで次のエラーが発生します。

操作を完了できませんでした。(ココアエラー516)

誰かがこのエラーを修正する方法を教えてもらえますか?

ありがとうございました。

4

1 に答える 1

3

まだコピーされていない場合は、ファイルをドキュメントディレクトリにコピーします。コード内でファイルがすでに存在する場合は、それをドキュメントディレクトリにコピーしようとしています。その結果、2番目のif(!success)ブロックが実行されます。次のようにメソッドを変更します。

- (void)viewDidLoad
{
    [super viewDidLoad];

        BOOL success;
        NSFileManager *filemngr = [[NSFileManager alloc] init];
        NSError *error;
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
        NSString *documentDirectory = [paths objectAtIndex:0];
        NSString *writableDbPath = [documentDirectory stringByAppendingPathComponent:@"contacts.sqlite"];
        success = [filemngr fileExistsAtPath:writableDbPath];
        if(!success)
        {
            NSString *defaultDbPath = [[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent:@"contacts.sqlite"];
        success = [filemngr copyItemAtPath:defaultDbPath toPath:writableDbPath error:&error];
          if (!success)
          {
            [status setText:[error localizedDescription]];
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error!"
                                                            message:[error localizedDescription]
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
            [alert show];
          }
        }
    }
于 2012-12-19T10:58:45.273 に答える