Ошибки SQLite при использовании симулятора iPhone / Возможная проблема с разрешениями - PullRequest
1 голос
/ 28 января 2011

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

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

Первое, что запустилось с этим тестом, это [self checkAndCreateDatabase], которое выглядит следующим образом:* Затем я пытаюсь открыть базу данных со следующей строкой:

int result = sqlite3_open([databasePath UTF8String], &database);

Это происходит каждый раз с ошибкой с кодом ошибки 14 SQLITE_CANTOPEN, а databasePath - "/ Users / labuser / Library / Application Support / iPhone Simulator / Documents /projectfusion.db3 ".

Странно то, что когда я захожу в этот каталог, Documents / там нет, поэтому, если я его создаю, то это не дает сбоя, НО projectfusion.db3 затем имеетразмер 0кб;там нет таблицЭто приводит к сбою любого sqlite3_prepare_v2 (), потому что таблиц там нет.Если я вручную скопирую файл projectfusion.db3 в этот каталог перед запуском, он будет работать нормально.

Это потому, что я делаю это внутри модульных тестов, а у сценариев нет разрешения или что-то еще?Или это возможно, потому что я работаю на школьном компьютере в моем университете и не могу писать в этот каталог?(Я попытался войти в систему как администратор, но это тоже не сработало).

Ответы [ 2 ]

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

Попробуйте код, приведенный ниже,

Я установил макрос с именем TEST, поэтому мне не нужно комментировать код.

- (NSString *)createEditableCopyOfDatabaseIfNeeded {
    // First, test for existence.
    BOOL success;

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    #ifdef TEST
    documentsDirectory = [[NSFileManager defaultManager] currentDirectoryPath];
    #endif


    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:DBNAME];
    success = [fileManager fileExistsAtPath:writableDBPath];
    if (success) { return writableDBPath;} ;
    // The writable database does not exist, so copy the default to the appropriate location.

    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:DBNAME];    
    #ifdef TEST
    defaultDBPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"YOURDB" ofType:@"sqlite"];
    #endif

    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
    if (!success) {
        NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }
    return (defaultDBPath);
}
0 голосов
/ 28 января 2011

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

- (NSString *)applicationDocumentsDirectory {

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
return basePath;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...