iOS 8 - 为 App Group 创建 SQLite 数据库

Posted

技术标签:

【中文标题】iOS 8 - 为 App Group 创建 SQLite 数据库【英文标题】:iOS 8 - Create SQLite database for App Group 【发布时间】:2014-09-16 18:40:56 【问题描述】:

我正忙着为我的应用创建一个 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 扩展程序中访问该数据库。

谁能帮我解决这个问题?那太好了!

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

【参考方案2】:
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 文件,并且也可以从容器应用程序和扩展应用程序访问。 请记住,“允许完全访问”必须打开才能从此方法获取路径

【讨论】:

但是“允许完全访问”只是用于键盘扩展,对吧?

以上是关于iOS 8 - 为 App Group 创建 SQLite 数据库的主要内容,如果未能解决你的问题,请参考以下文章

带有 App Group 的 NSUserDefault 在 iOS 8 Beta3 中不起作用

iOS:将图像保存在 App Group 中以在 Apple Watch 上使用

在 App-Group 文件夹中创建领域文件在 WatchOS(WatchKit 扩展)下不起作用

iOS 13 如何将 UIDocumentPickerViewController 与 App Group 一起使用?

iOS App Today Widget App Group Entitlement with Keychain Sharing Entitlement,像模拟器-25243这样的设备上的错误(err

沙盒和App Group