Новый файл создается вместо копирования файла
РЕДАКТИРОВАТЬ: не похоже, что он работает с симулятором либо сейчас.
Еще немного информации. Кажется, если я установлю заархивированную версию, которая сработала, то установлю ту, которая не будет работать, прямо над ней, все отлично работает. но когда я удаляю заархивированную версию и устанавливаю новую, тогда все перестает работать.
Я просто тестировал свое приложение на своем 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" устанавливается во второй раз)? Возможно, вы захотите добавить сообщение журнала, чтобы вы могли знать наверняка.