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

Ali*_*tad 7 sqlite android file android-contentprovider

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

这是我做的(几乎类似于记事本示例应用程序):

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

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

Uri uri = getContentResolver().insert(MyAuthority.CONTENT_URI, contentValues);
OutputStream s = getContentResolver().openOutputStream(uri);
Run Code Online (Sandbox Code Playgroud)

但我得到以下错误:

11-29 01:07:30.717:WARN/System.err(1490):java.io.FileNotFoundException:提供商在内容中不支持任何文件:// myproviderauthority/podcasts/1

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

向客户端公开数据的字段实际上应包含内容:URI字符串.

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

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

该记录还应该有另一个名为"_data"的字段,该字段列出设备上该文件的确切文件路径.此字段不是由客户端读取,而是由ContentResolver读取.

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

客户端将在面向用户的字段上调用ContentResolver.openInputStream(),该字段包含项目的URI.

4)这完全是垃圾!我ContentResolver.openInputStream()该如何打电话?你只能在记录上调用它并传递Uri.

谢谢你的时间,我希望你能帮助我.我也回顾了这些SO问题(这个这个),但他们没有帮助.

顺便说一句,我正在构建API(版本1.6)的第4级.

Pēt*_*une 3

要了解“提供商不支持...的文件”的来源,请查看此处。那里的情况似乎与你所描述的非常相似。

简而言之,您的内容提供程序(或其某些超类)需要重写和实现openFile方法。该错误是由默认值“未实现 - 退出!”引发的。代码在ContentProvider.java.

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