2012-03-15 50 views
7

我试图创建一个使用内部存储的内容提供者。但是,我在网上看到的所有示例仅使用sqlite。内容提供者示例不使用SQLite

有人能给我一个很好的教程或使用内部存储创建内容提供者的例子吗?

+0

请定义“使用内部存储的内容提供者”的含义,考虑到SQLite通常使用内部存储,但您不需要SQLite。 – CommonsWare 2012-03-15 17:08:07

+0

@CommonsWare根据Android开发页面,有5种存储数据的方式:共享首选项,内部存储,外部存储,SQLite数据库和网络连接。我希望我的内容提供商使用内部存储选项。 – drum 2012-03-15 17:13:45

+0

上下文中的内部存储意味着将东西存储在应用程序私有数据区域的文件中。这不是一个真正的API。鉴于SQLite数据库是作为文件存储在应用程序的私有数据区域中的,因此您必须做一些非常专业的事情才能使其值得费心---使用SQLite通常更容易(也更快)。 – 2012-03-15 17:16:09

回答

4

可以使用内容提供者的文件方法(如 openTypedAssetFile())将数据存储在文件中。这将返回一个AssetFileDescriptor(即跨进程的有效文件句柄)而不是Cursor。

总的来说,这个问题很难回答。内容提供者是数据存储库和客户端之间的“接口”。除了SQLite以外,这些文档没有多说关于存储库的内容,因为a)内容提供者模型是沿着关系数据库的行组织的,b)每个内容提供者的实现都会有所不同。

在知道确切的要求之前,我毫不犹豫地给出了更多建议。这可能是你可以从SQLite中受益,尽管你可能不会立即明白为什么。你也可能是正确的:SQLite不是解决方案,但给了更多的信息,我可以提出一些想法。

+0

我明白你的意思了。另外,似乎ContentProvider的一些功能需要数据库。我一直在试图找到实现query()函数的方法,但是因为它必须返回一个Cursor对象,所以在这种情况下,我猜SQLite是必须的。 – drum 2012-03-16 18:31:20

+1

查找[this](https://android.googlesource.com/platform/packages/providers/WebSearchProvider/+/8637dd8dc1b255052b2615430bfb4603fa8711f7/src/com/android/websearch/SuggestionProvider.java)不使用SQLIte。源数据是JSONArray。我们可以学习如何创建一个Cursor extend AbstractCursor。 – Yeung 2014-04-04 04:23:42

0

那么我知道你正在尝试做什么可能会创建图像,电影,或与内部存储。

您可以使用InternalStorage来存储数据字节。如果你有个字节,你可以这样做:

String FILENAME = "hello_file"; 
String string = "hello world!"; 

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); 
fos.write(string.getBytes()); 
fos.close(); 

把它弄出来:

File file = ... 
    OutputStream out = null; 
    try { 
    out = new BufferedOutputStream(new FileOutputStream(file)); 
    ... 
    finally { 
    if (out != null) { 
     out.close(); 
    } 
    } 

所有来源的thisthis发现。我无法帮助你,因为我从来没有试过它。

+0

是的,我已经看到此页面。但是,这在内容提供商中不起作用。 – drum 2012-03-21 22:23:47

1

在Android SDK示例中有一个名为FileProvider.java的示例,它使用ContentProvider而不是SQLite数据库。