Как получить файл базы данных Sqlite, когда приложение работает на устройстве? - PullRequest
7 голосов
/ 08 июля 2011

У меня проблема с доступом к файлу базы данных, когда я запускаю его на устройстве. Как я могу получить этот файл? Нет проблем с доступом к файлу, когда я запускаю приложение на симуляторе. Например, когда я запускаю приложение на симуляторе, файл БД находится в:

/Users/Nitish/Library/Application Support/iPhone Simulator/4.3/Applications/1B787527-0608-4BC1-8022-DFDB3CC35F66/mysqlite.sqlite

Где я могу найти файл БД при запуске приложения на устройстве?

Ответы [ 8 ]

20 голосов
/ 27 мая 2013

Читая все комментарии и ответы, я думаю, что на самом деле никто не ответил на простой вопрос автора:

Как получить доступ к файлу базы данных sqlite во время работы на реальном устройстве (это не проблема в симуляторе iPhone, как указал автор)

Вот что я делаю:

  1. (один раз!) Убедитесь, что все скрытые файлы видны на вашем Mac: В окне терминала запустите: по умолчанию напишите com.apple.Finder AppleShowAllFiles ДА

  2. В Xcode откройте «Органайзер» -> «Устройства», найдите свой iPhone и найдите приложение в папке «Приложения».

  3. В нижней части нажмите «Загрузить» и загрузите приложение на рабочий стол (в любом месте)

  4. Откройте Finder, перейдите к загруженному файлу, щелкните его правой кнопкой мыши и выберите «Показать содержимое пакета».Вид изменится на стандартный вид поиска с открытыми файлами в этом приложении.

  5. Перейдите в папку «Документы», найдите файл * .sqlite, щелкните его правой кнопкой мыши и выберите «Открыть с помощью» ->Другое

  6. Выберите браузер базы данных SQLite (http://sqlitebrowser.sourceforge.net) и наслаждайтесь просмотром вашей базы данных через браузер базы данных.

Требуется меньше, чемминута, чтобы запустить весь процесс, как только вы сделаете это один раз.

11 голосов
/ 23 июля 2011

Я использую этот метод для получения URL базы данных:

+ (NSURL *)storeURL
{
    if ([self isExecutingUnitTests])
    {
        NSString *directory = [[NSFileManager defaultManager] currentDirectoryPath];
        return [NSURL fileURLWithPath:[directory stringByAppendingPathComponent:@"UnitTests/test-database.sqlite"]];
    }
    else
    {
        return [NSURL fileURLWithPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/database.sqlite"]];
    }
}

Он отлично работает на симуляторе, на устройстве и даже при выполнении юнит-тестов!UnitTests и Documents должны существовать на уровне .xcodeproj.

5 голосов
/ 26 июля 2011

Как уже говорили другие, ваша база данных не должна находиться в корневой папке вашего приложения. Если вы загружаете статическую базу данных из своего пакета (то есть базы данных, предварительно загруженной путем добавления ее в xCode), вам необходимо получить к ней доступ через пакет.

NSString *path = [[NSBundle mainBundle] pathForResource:@"mysqlite" ofType:@"sqlite"];

Если вы обращаетесь к файлу из каталога документов (то есть он был изменен или сохранен).

NSString *fileName = @"mysqlite.sqlite";
NSString *directoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

NSString *path = [directoryPath stringByAppendingPathComponent:fileName];
4 голосов
/ 28 июля 2011

@ нитиш:

У меня есть код, который будет обращаться к файлу базы данных sqlite при запуске приложения на устройстве.

- (void) initDatabase
{

    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths =    NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                        NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory
                            stringByAppendingPathComponent:@"contacts.db"];

    success = [fileManager fileExistsAtPath:writableDBPath];

    dbpath = [writableDBPath UTF8String];

    NSLog(@"path : %@", writableDBPath);

    if (success) return;
    // The writable database does not exist, so copy the default to the appropriate
    //  location.

    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath]
                           stringByAppendingPathComponent:@"contacts.db"];

    success = [fileManager fileExistsAtPath:defaultDBPath];
    //if(success) return;


    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
    if (!success)
    {
        NSAssert1(0, @"Failed to create writable database file with message '%@'.",[error localizedDescription]);
    }

    dbpath = [writableDBPath UTF8String];
    NSLog(@"path : %@", writableDBPath);
}

"NSLog()" даст вам путь к файлу базы данных sqlite. Он работает как для симулятора, так и для устройства. Надеюсь, это сработает для вас.

4 голосов
/ 23 июля 2011

Скорее всего, ваша база данных находится в каталоге документов приложений. Поэтому вам нужно вызвать этот каталог, используя:

- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
3 голосов
/ 29 июля 2011

Поскольку я не совсем понимаю, что вы пытаетесь сделать, есть большая вероятность, что это не очень поможет;если это бесполезно, дайте мне знать, и я удалю его.

Если вам нужно знать, где создается БД, возможно, вы можете создать ее во время работы приложения в производственной среде (то есть на некоторыхiphone), а затем получить путь с помощью database_list pragma :

[someone@somewhere ~]$ sqlite3 foobar.db
SQLite version 3.7.5
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> pragma database_list;
0|main|/home/someone/foobar.db
2 голосов
/ 08 июля 2011

Оформить путь к файлу базы данных.это может быть только причина.

0 голосов
/ 30 июля 2011

do

NSString *dbFilePath=[NSHomeDirectory stringByAppendingPathComponent:@"mysqlite.sqlite"];

это должно работать как для устройства, так и для симулятора.

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