2014-09-16 2 views
6

내 앱용 iOS 8 Today 확장 프로그램을 만드는 중입니다. 내 확장 기능에서 SQLite (코어 데이터 아님) 데이터베이스에 액세스하려고합니다. 웹에서 약간의 검색을 한 후 App Group이 필요하다는 것을 알게되었습니다. 그래서 저는 "group.AppName"이라는 이름의 내 응용 프로그램 용 App Group을 만들었습니다.iOS 8 - App Group 용 SQLite 데이터베이스 만들기

다음 코드를 사용하여 NSDocumentDirectory에 SQLite 데이터베이스를 만듭니다. 하지만 앱 확장은 NSDocumentDirectory에 액세스 할 수 없습니다. 그래서 내 App Group에 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); 
    } 
} 

내 응용 프로그램 그룹에서이 데이터베이스를 어떻게 만들 수 있는지 파악할 수 없으므로 오늘 확장 기능에서 데이터베이스에 액세스 할 수 있습니다.

누구든지이 문제를 해결할 수 있습니까? 그게 좋을거야!

답변

14

앱 그룹 디렉토리의 포함 앱에서도 데이터베이스 파일을 만들어야합니다. 그래서 포함하는 앱과 앱 확장 프로그램은 데이터베이스 파일과 동일한 파일 경로를 사용합니다.

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

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

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

그래서 이런 방법으로 포함하는 응용 프로그램에서 데이터베이스 파일을 만들 앱 확장에 동일한 방법으로 데이터베이스 파일을 받고 있습니다.

+1

내 날을 저장했습니다 ...! thanks – 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