После копирования файла sqlite в папку «Документы» файл становится пустым - PullRequest
3 голосов
/ 20 января 2012

У меня проблема с файлом .db, который после копирования в папку «Документы» имеет размер 0 КБ, а исходный файл - 137 КБ.Я попытался открыть скопированный файл в диспетчере SQLite.Он открывается, не жалуется на повреждение файла ... Он просто не содержит ни одной таблицы.

Мой код для копирования файла:

- (void) createEditableDatabase
{
    BOOL success; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error;
    NSString *writableDB = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"yc_ch.db"];
    success = [fileManager fileExistsAtPath:writableDB];
    if (success)
    {
        return;
    }
    NSString *defaultPath = [[NSBundle mainBundle] pathForResource:@"yc_ch" ofType:@"db"];
    error = nil;
    success = [fileManager copyItemAtPath:defaultPath toPath:writableDB error:&error];
    if (!success) 
    {
        NSAssert1(0, @"Failed to create writable database file:%@", [error localizedDescription]);
    }
}

Проверяет, существует ли файл,если не копирует.Проверка происходит в

- (void)viewDidLoad
{
    self.subCountriesArr=[[NSMutableArray alloc]initWithCapacity:1];
    NSMutableArray *subCountriesTemp=[[[NSMutableArray alloc]init]autorelease];

    DBAccess *dbAccess=[[DBAccess alloc]init];
    [dbAccess createEditableDatabase]; //method to copy file
    subCountriesTemp=[dbAccess getSubCountries];

    [dbAccess closeDataBase];
    [dbAccess release];
}

RootViewController. Так что это странно для меня.Любая помощь, пожалуйста?Заранее спасибо.

Ответы [ 4 ]

7 голосов
/ 06 декабря 2012

В конце концов, я сделал это так. Это сработало для меня.

1) нажмите на файл .db.

2) затем найдите fileInspector на правой стороне, щелкните файлinspector

3) проверить целевое членство файла .db независимо от того, установлен флажок или нет.

4) если флажок не установлен,

Надеюсь, это будет работать ...

1 голос
/ 20 января 2012

Как насчет того, чтобы попробовать это с этим:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDB = [documentsDirectory stringByAppendingPathComponent:@"yc_ch.db"];

NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:writableDB] ) {
    NSString *databaseFile = [[NSBundle mainBundle] pathForResource:@"yc_ch" ofType:@"db"];
    [fileManager copyItemAtPath:databaseFile toPath:writableDB error:nil];
    NSLog(@"database copied");
}

Я не думаю, что NSHomeDirectory является допустимым способом доступа к каталогу документов ....

Не знаюконечно, если это решит проблему, но стоит попробовать.

0 голосов
/ 24 февраля 2015

Я не знаю, помогает ли это, но если вы копируете базу данных базовых данных «.sqlite», она также копирует ее пустую, но есть еще два файла «.sqlite-shm» и «.sqlite-wal».Если вы скопируете эти два файла с тем же именем места назначения с соответствующим расширением, база данных больше не будет пустой.

0 голосов
/ 20 января 2012

Ну, я решил эту проблему. В моем классе DBAccess у меня был метод:

-(void)initializeDataBase
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yc_ch.db"];

   // NSString *path=[[NSBundle mainBundle] pathForResource:@"yc_ch" ofType:@"db"];
    if (sqlite3_open([path UTF8String], &database) == SQLITE_OK)
    {
        //
    }
    else
    {
        [self dbConnectionError];
    }
}

И это было вызвано в init. - (void) initializeDataBase запускается вообще. Теперь этот кусок кода:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yc_ch.db"];

NSString *path=[[NSBundle mainBundle] pathForResource:@"yc_ch" ofType:@"db"];
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK)

Я вызываю каждый метод отдельно. Это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...