将 sqlite3 db 关联到 iPhone 应用程序

Posted

技术标签:

【中文标题】将 sqlite3 db 关联到 iPhone 应用程序【英文标题】:Associating sqlite3 db to an iPhone app 【发布时间】:2010-06-27 12:42:32 【问题描述】:

我正在尝试将 SQLite3 数据库文件与我们的应用程序相关联,以便从电子邮件中轻松打开备份的数据库。但是,以下内容似乎不起作用,因为 Mail 仍然无法识别该文件(在 iPad 和 iPhone 4 上):

<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.database</string>
            <string>public.data</string>                    
        </array>
        <key>UTTypeDescription</key>
        <string>App Database File</string>
        <key>UTTypeIdentifier</key>
        <string>com.company.App.db</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <string>db</string>
            <key>public.mime-type</key>
            <string>application/x-sqlite3</string>            
        </dict>
    </dict>
</array>

 <key>CFBundleDocumentTypes</key>
 <dict>
  <key>CFBundleTypeName</key>
  <string>App Database</string>
  <key>CFBundleTypeIconFiles</key>
  <array>
   <string>Icon-Small.png</string>
   <string>Icon.png</string>
  </array>
    <key>CFBundleTypeRole</key>
        <string>Editor</string>

  <key>LSItemContentTypes</key>
  <array>
   <string>com.company.App.db</string>
  </array>
  <key>LSHandlerRank</key>
  <string>Alternate</string>
 </dict>
</dict>

知道我做错了什么吗?

【问题讨论】:

【参考方案1】:

为了完整起见,也可能是我稍后自己的参考,这里有一些进一步的细节使它对我有用:

声明您的应用支持的文档类型 (例如 sqlite3 数据库)

<key>UTExportedTypeDeclarations</key>
    <array>
        <dict>
            <key>UTTypeIdentifier</key>
            <string>com.company.sqlite3.database</string>
            <key>UTTypeReferenceURL</key>
            <string>http://www.company.com/</string>
            <key>UTTypeDescription</key>
            <string>MyCompany SQLite Database</string>
            <key>UTTypeIconFile</key>
            <array>
                <string>Icon-Small.png</string>
                <string>Icon.png</string>
            </array>
            <key>UTTypeConformsTo</key>
            <array>
                <string>public.database</string>
                <string>public.data</string>
            </array>
            <key>UTTypeTagSpecification</key>
            <dict>
                <key>public.filename-extension</key>
                <array>
                    <string>sqlite</string>
                </array>
                <key>public.mime-type</key>
                <array>
                    <string>application/x-sqlite3</string>
                    <string>application/octet-stream</string>
                </array>

            </dict>
        </dict>
    </array>
<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>MyCompany SQLite Database</string>
        <key>CFBundleTypeIconFiles</key>
        <array>
            <string>Icon-Small.png</string>
            <string>Icon.png</string>
        </array>

        <key>CFBundleTypeExtensions</key>
        <array>
            <string>sqlite</string>
        </array>

        <key>CFBundleTypeMIMETypes</key>
        <array>
            <string>application/x-sqlite3</string>
            <string>application/octet-stream</string>
        </array>

        <key>LSHandlerRank</key>
        <string>Alternate</string>

        <key>LSItemContentTypes</key>
        <array>
            <string>com.company.sqlite3.database</string>
        </array>

        <key>NSPersistentStoreTypeKey</key>
        <string>SQLite</string>

    </dict>
</array>

将上述 XML 复制粘贴到您的 Info.plist 文件中。

将“存储类型”设置为“SQLite”并不是我的杀手锏。

我之前的帖子在这里提到了一种相当不正确的让它工作的方法,它接受所有文件并且没有正确导出类型。

此外,如果您的应用将这些文件作为附件通过电子邮件发送,请确保它与您设置为捕获的 MIME 类型相匹配。 application/octet-stream 并不重要,只是我们的应用程序的旧版本正在通过电子邮件发送具有该 MIME 类型的数据库。

例如,

[controller addAttachmentData:[NSData dataWithContentsOfFile:dbPath] mimeType:@"application/x-sqlite3" fileName:filename];

我当然希望其他试图了解如何让他们的应用程序支持打开 sqlite3 数据库备份的人发现这很有帮助。

【讨论】:

【参考方案2】:

好的,我已经解决了这个问题。如果您改为使用“目标信息”面板并在那里添加您的文档类型(然后选择“SQLite”作为类型),它就可以工作。显然,前提是您已经导出了上述类型。

【讨论】:

谢谢!当你在目标的信息面板上填写 OS Types、Class 和 UTI 时,你在 OS Types、Class 和 UTI 上放了什么?【参考方案3】:

根据Apple's documentation,CFBundleDocumentTypes 是一个数组,而不是一个字典。

你有:

<key>CFBundleDocumentTypes</key>
<dict>

所以 需要在 元素中,如下所示:

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>App Database</string>
        <!-- ... -->
    </dict>
</array>

【讨论】:

以上是关于将 sqlite3 db 关联到 iPhone 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

将 QTABLEWIDGET 的数据(列、行、所有内容……)导出到 SQLITE3

iPhone Core Data 不会从 Sqlite3 获取任何数据

如何在 SQlite3 (ESP32 - Arduino IDE) 中插入整数值?

Sqlite3 数据库表无法在 XCode 4.2 中打开

错误的sqlite3 db.lock在VS中阻止Web部署

将日期插入 SQLite3