2014-09-16 8 views
6

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

Со следующим кодом я создаю базу данных 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); 
    } 
} 

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

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

ответ

14

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

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

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

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

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

+1

Вы сохранили мой день ...! Спасибо – MAC

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

+0

Но «Разрешить полный доступ» - это просто для расширения клавиатуры, не так ли? – rockdaswift