Новый файл создается вместо копирования файла

РЕДАКТИРОВАТЬ: не похоже, что он работает с симулятором либо сейчас.

Еще немного информации. Кажется, если я установлю заархивированную версию, которая сработала, то установлю ту, которая не будет работать, прямо над ней, все отлично работает. но когда я удаляю заархивированную версию и устанавливаю новую, тогда все перестает работать.

Я просто тестировал свое приложение на своем iPhone, и оно работало отлично, и когда я заархивировал его и установил ipa на телефон, база данных перестала работать. при загрузке базы данных ошибок не возникает, и, как я уже говорил, она просто работала. Я не изменил ЛЮБОЙ код. он все еще работает на симуляторе, поэтому я знаю, что это связано с копированием базы данных. вот соответствующий код:

dbPath=[NSString stringWithFormat:@"%@/Documents/database.sql", NSHomeDirectory()];
// Get the documents directory
NSFileManager *fmngr = [[NSFileManager alloc] init];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"database.sql" ofType:nil];
NSError *error;
if(![[NSUserDefaults standardUserDefaults] boolForKey:@"didLaunchFirstTime"])
{
    [[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"didLaunchFirstTime"];
    [fmngr removeItemAtPath:[NSString stringWithFormat:@"%@/Documents/database.sql", NSHomeDirectory()] error:&error];

    if(![fmngr copyItemAtPath:filePath toPath:[NSString stringWithFormat:@"%@/Documents/database.sql", NSHomeDirectory()] error:&error])
    {
        // handle the error
        NSLog(@"Error creating the database: %@", [error description]);

    }
}

Мой запрос выглядит так, потому что я использую FMDB для запроса к базе данных. Это отдельный метод, вызываемый, когда пользователь нажимает кнопку поиска.

FMResultSet *s = [db executeQueryWithFormat:@"SELECT Gurmukhi, ShabadID, FirstLetterStr FROM Shabad WHERE FirstLetterStr LIKE %@", searchString];

Я также разархивировал ipa, чтобы проверить, не была ли база данных пустой, и это не так. Я понятия не имею, что происходит.

1 ответ

Решение

Вы не должны жестко задавать пути к каталогам в своем приложении - Apple предоставляет функции для их получения:

Если вы хотите найти файл в вашем комплекте, вы получите его следующим образом:

NSString * dbPathOld = [[NSBundle mainBundle] pathForResource: @ "database" ofType: @ "sql"];

Теперь у вас есть путь к файлу sql, который вы указали в приложении.

Когда вы хотите скопировать его, вы используете этот код:

NSString * docDir = [NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString * dbPathNew = [docDir stringByAppendingPathComponent: @ "database.sql"];

Другие комментарии:

1) Почему бы не использовать NSFileManager * fm = [NSFileManager defaultManager];?

2) С вашими стандартными значениями по умолчанию, вы регистрируете их в методе инициализации в вашем делегате приложения? Вы синхронизируете их после обновления значений (так что фактически "didLaunchFirstTime" устанавливается во второй раз)? Возможно, вы захотите добавить сообщение журнала, чтобы вы могли знать наверняка.

Другие вопросы по тегам