将sqlite3数据库关联到iPhone应用程序

问题描述:

我试图将SQLite3数据库文件与我们的应用程序相关联,以便从电子邮件中打开备份的数据库。然而,下面似乎并没有工作,因为邮件仍然无法识别该文件(在iPad和iPhone 4):将sqlite3数据库关联到iPhone应用程序

<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> 

任何想法,我做错了吗?

好吧我已经整理出来了。如果您改为使用'target'信息'面板并在其中添加文档类型(然后选择'SQLite'作为类型'),它就会起作用。显然提供你已经导出类型如上。

+0

谢谢!当你在目标的信息面板上填写OS Type,Class和UTI时,你会做什么? – SpaceDog 2010-08-05 09:30:42

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

您有:

<key>CFBundleDocumentTypes</key> 
<dict> 

所以<字典>需要在一个<阵列>元素,像这样:

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

的完整性和可能是我自己参考后来这里是一个点的进一步细节让它为我工作:

声明文档类型您的应用支持 (如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文件。

将'Store Type'设置为'SQLite'并不是我的杀手锏。

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

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

例如,

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

我当然希望其他任何人试图找出如何让自己的应用程序,支持开放sqlite3的数据库备份,发现这是很有帮助的。