2012-03-14 5 views
0

Я ориентируюсь на iOS 5.1 и пытаюсь скопировать базу данных из своих файлов приложений в папку «Мои документы». Я сделал это с этим же кодом в приложениях в прошлом, поэтому я немного запутался в том, почему он не работает на этот раз.Невозможно скопировать базу данных по

Это метод, который я использую, чтобы проверить, существует ли он и скопировать его, если это не так. Это от here.

-(void) checkAndCreateDatabase{ 
// Check if the SQL database has already been saved to the users phone, if not then copy it over 
BOOL success; 

// Create a FileManager object, we will use this to check the status 
// of the database and to copy it over if required 
NSFileManager *fileManager = [NSFileManager defaultManager]; 

// Check if the database has already been created in the users filesystem 
success = [fileManager fileExistsAtPath:self.databasePath]; 

// If the database already exists then return without doing anything 
if(success) return; 

NSLog(@"Installing db: %@", self.databasePath); 
// If not then proceed to copy the database from the application to the users filesystem 

// Get the path to the database in the application package 
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName]; 

// Copy the database from the package to the users filesystem 
[fileManager copyItemAtPath:databasePathFromApp toPath:self.databasePath error:nil]; 

//[databasePathFromApp release]; 
//[fileManager release]; 

}

При попытке запроса дб я делаю так, как это:

sqlite3 *database1; 

// Open the database from the users filessytem 
if(sqlite3_open([self.databasePath UTF8String], &database1) == SQLITE_OK) { 
    // Setup the SQL Statement and compile it for faster access 

    NSString *sqlStatement = [NSString stringWithFormat: @"update login set is_logged=0"]; 
    sqlite3_stmt *compiledStatement; 

    if(sqlite3_prepare_v2(database1, [sqlStatement UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK) { 

     if(SQLITE_DONE != sqlite3_step(compiledStatement)){ 
      NSAssert1(0, @"Error while updating logged. '%s'", sqlite3_errmsg(database1)); 
      NSLog(@"Error setting logged_in to 0: %s", sqlite3_errmsg(database1)); 
     } 
     else{ 
      NSLog(@"Made Logged_in=0"); 
     } 
    } 
    else{ 
     NSLog(@"Prop problem1: %s", sqlite3_errmsg(database1)); 
     NSLog(@"Couldn't prep 1"); 
    } 
    // Release the compiled statement from memory 
    sqlite3_finalize(compiledStatement); 
} 
else{ 

    NSLog(@"Couldn't even open db1"); 
} 
sqlite3_close(database1); 

sqlite3_open() функция возвращает ложь в этом случае с sqlite3_errmsg из no such table: login.

У меня есть функция, которая вызывается каждую секунду, которая создает объект, который использует этот объект базы данных. Может быть, база данных не была скопирована в эту секунду, а следующий вызов прерывает предыдущую копию? Это не кажется вероятным.

Любые идеи, что может быть проблемой?

Решение Я проконсультировался на этот вопрос: here и согласно точке номер 2, кажется, что моя база данных не была в списке «Копировать Bundle ресурсов». Я добавил его, и теперь все кажется прекрасным.

Спасибо, что помогли мне думать в правильном направлении.

+1

Используйте Organizer чтобы загрузить файлы с телефона и посмотреть, что скопировано. (Кроме того, имейте в виду, что вам, скорее всего, нужно будет пометить файл базы данных «не делать резервные копии», чтобы перейти к новым стандартам стандарта Apple.) –

+0

Он отображается в папке «Документы», но содержимое пустым. Я бы предположил, что это связано с проблемой кодирования с sql-файлом? – emachine

+0

Поцарапайте это, я просто удалил приложение и переустановил, а база данных не находится в папке «Документы». Кажется, что файл базы данных [empty] появляется только после того, как я попытаюсь его запросить. – emachine

ответ

1

Попробуйте подтвердить, что каждый этап процедуры копирования возвращает действительный объект. Это может быть так (например), что вы не включаете расширение при поиске пути ресурса. Я предпочитаю функцию NSBundle pathForResource:ofType, чтобы получить материал из комплекта. Кроме того, что касается пустой БД, открытая функция sqlite создает базу данных, если она не существует, и открывает ее. Попробуйте получить ошибку от copyItemAtPath

+0

Ошибка: Ошибка домена = NSCocoaErrorDomain Code = 260 «Операция не может быть завершена (ошибка Cocoa 260.)» UserInfo = 0x271dd0 {NSFilePath =/var /mobile/Applications/F39FFDFB-32FB-4533-8EE2-5ECA8A7FBF60/MyApp.app/myappdb.sql, NSUnderlyingError = 0x271d30 «Операция не может быть завершена. Нет такого файла или каталога»} – emachine

+0

Когда я использую [[NSBundle mainBundle ] pathForResource: @ "myappdb" ofType: @ "sql"] Я получаю эту ошибку - Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «*** - [NSFileManager copyItemAtPath: toPath: error:]: source path is nil ' – emachine

+0

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

Смежные вопросы