8

我正忙着为我的应用程序创建一个 iOS 8 Today 扩展。我想从我的扩展访问我的 SQLite(不是核心数据)数据库。在网上搜索了一下,我发现我需要一个 App Group。所以我为我的应用创建了一个应用组,名为“group.AppName”。

使用以下代码,我在 NSDocumentDirectory 中创建了一个 SQLite 数据库。但是 App Extensions 不能访问 NSDocumentDirectory。这就是为什么我想将 SQLite 数据库保存在我的 App Group 中。

    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 中创建这个数据库,所以我可以从我的 Today 扩展中访问该数据库。

有人可以帮我解决这个问题吗?那很好啊!

4

2 回答 2

16

您还必须在应用程序组目录中的包含应用程序中创建一个数据库文件。因此,包含应用程序和应用程序扩展名将使用相同的文件路径指向数据库文件。

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

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

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

因此,通过这种方式,您将在包含应用程序中创建数据库文件,并在应用程序扩展中以相同的方式获取数据库文件。

于 2014-09-17T14:20:22.597 回答
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 文件,并且也可以从容器应用程序和扩展应用程序访问。
请记住,“允许完全访问”必须打开才能从此方法获取路径

于 2015-05-11T14:02:08.500 回答