使用_data字段 - v1.6在Android数据库(自定义内容提供程序)中存储文件

时间:2010-11-29 19:23:51

标签: android file sqlite android-contentprovider

我一直在与Android应用中的问题作斗争。我一直在阅读Android文档,我在Android上的书(Andriod Pro 2)并且几乎看了我可以得到的每一个例子,但是无法弄清楚如何实现存储文件(图像,二进制数据) )对内容提供商公开的Sqlite表中的记录

这是我所做的(几乎类似于Notepad示例应用程序):

  • 在我的提供商中实施ContentProvider。这一切都适用于CRUD操作。在内部,它使用实现SQLiteOpenHelper(非常标准的东西)
  • 我添加了_data类型的文字
  • 我插入一条记录并让Uri回来
  • 在内容提供程序上调用openOutputStream并开始编写数据

这完全符合Android Pro 2的书。这是该部分代码的片段:

Uri uri = getContentResolver().insert(MyAuthority.CONTENT_URI, contentValues);
OutputStream s = getContentResolver().openOutputStream(uri);

但我收到以下错误:

  

11-29 01:07:30.717:   WARN / System.err的(1490):   java.io.FileNotFoundException:没有   提供商支持的文件   内容:// myproviderauthority /播客/ 1

我需要做什么?我阅读了Android documentation,但它们非常模糊:

  

将数据公开的字段   客户实际上应该包含一个   content:URI字符串。

1)字段类型是否需要为TEXT或是否有特殊的content: URI string数据类型?

2)在插入时我没有URI。我是否需要在插入后获取URI,然后更新记录中的该字段?

  

记录还应该有另一个记录   字段,名为“_data”,列出了   设备上的确切文件路径   文件。该字段无意   由客户阅读,但由   ContentResolver的。

3)那么该字段的类型应该是什么?文字 - 我假设?

  

客户将致电   ContentResolver.openInputStream()on   持有URI的面向用户的字段   对于该项目。

4)这完全是垃圾!如何在现场调用ContentResolver.openInputStream()?你只能在记录上调用它并传递Uri。

感谢您的时间,我希望您能帮助我。我还审核了这些问题(thisthis),但他们没有帮助。

顺便提一下,我正在构建API(版本1.6)的第4级。

1 个答案:

答案 0 :(得分:3)

要查看“供应商不支持文件的位置”来自何处,请查看here。那里的情况与你所描述的情况非常相似。

简而言之,您的内容提供程序(或其某些超类)需要覆盖并实现openFile方法。默认情况下“未实现 - 退出!”会引发该错误。 ContentProvider.java中的代码。

当我遇到困难时,我发现查看框架的底层源代码很有帮助,因为文档有时候有点缺乏。