2012-03-15 51 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數據庫。