iOS 8 - создание базы данных SQLite для группы приложений

Я занят созданием расширения iOS 8 Today для своего приложения. Я хочу получить доступ к своей базе данных SQLite (не Core Data) из моего расширения. После небольшого поиска в Интернете я обнаружил, что мне нужна группа приложений. Поэтому я создал группу приложений для своего приложения под названием "group.AppName".

С помощью следующего кода я создаю базу данных SQLite в NSDocumentDirectory. Но расширения приложения не могут получить доступ к NSDocumentDirectory. Вот почему я хочу сохранить базу данных SQLite в моей группе приложений.

    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [path objectAtIndex:0];

dbPathString = [docPath stringByAppendingPathComponent: @"dbName.db"];

char *error;

NSFileManager *fileManager = [NSFileManager defaultManager];

if(![fileManager fileExistsAtPath:dbPathString])
{
    const char *dbPath = [dbPathString UTF8String];

    if(sqlite3_open(dbPath, &treinAppDB) == SQLITE_OK)
    {
        const char *sql_stat = "CREATE TABLE IF NOT EXISTS table (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, code TEXT, lat TEXT, lon TEXT)";
        sqlite3_exec(appDB, sql_stat, NULL, NULL, &error);
        sqlite3_close(appDB);
    }
}

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

Кто-нибудь может мне помочь с этой проблемой? Это было бы прекрасно!

2 ответа

Решение

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

NSString *appGroupId = @"group.YourAPP.extension";

NSURL *appGroupDirectoryPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:appGroupId];

NSURL *dataBaseURL = [directory  URLByAppendingPathComponent:@"dbName.db"];

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

func getTheFilePath() -> String
{
     var url = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.spanglish.www") as NSURL?
     var path = url?.absoluteString?.stringByAppendingPathComponent("English.txt") as String?
     path = path!.stringByReplacingOccurrencesOfString("file:", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)

     return path!
}

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

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