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 и получить доступ как из приложения контейнера, так и из приложения расширения.
Помните, что "Разрешить полный доступ" должен быть включен для получения пути из этого метода