2010-11-29 8 views
7

私はAndroidアプリで問題を戦っています。私はAndroidのドキュメント(Andriod Pro 2)のAndroidドキュメントを読んでいて、私が手に入れることができるほとんどすべての例を見てきましたが、実装する方法を理解できませんでした。ファイル(イメージ、バイナリデータ)コンテンツプロバイダによって公開されるSqliteテーブルのレコード。_dataフィールドを使用してAndroidデータベース(カスタムコンテンツプロバイダ)にファイルを格納する - v1.6

  • は私のプロバイダでContentProviderを実装:ここ

    は、私は(メモ帳のサンプルアプリとほぼ同様)やっていることです。それはすべてCRUD操作のために働く。内部的には、コンテンツプロバイダに

  • 私はレコードを挿入し、ウリを取得し、私は
  • text型の_data列を追加した
  • コールopenOutputStreamを実装SQLiteOpenHelper(かなり標準のもの)をバック使用し、データの書き込みを開始

これは正確にアンドロイドに応じてプロ2 book.Hereはコードのその部分の抜粋です:

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

富栄tは私がエラーを取得する以下:

11-29 01:07:30.717: は(1490)/ System.errのをWARN: java.io.FileNotFoundException: コンテンツのプロバイダによってサポートされません ファイル://myproviderauthority/podcasts/1

私は何をする必要がありますか?私は、Android documentationを読んで、彼らは非常にあいまいです:

実際 コンテンツ含まれている必要があり クライアントにデータを公開するフィールド:URI文字列を。

1)だから、TEXTなるようにフィールドタイプの必要性をしたり、特殊なcontent: URI stringデータ型がありますか?

2)私はURIを持っていません。挿入後にURIを取得し、レコードのそのフィールドを更新する必要がありますか?

レコードはまた、その ファイルをデバイス上の 正確なファイルパスを示しています「_data」という名前の別の フィールドを、持っている必要があります。このフィールドは、 というクライアントではなく、 ContentResolverによって読み取られることを意図しています。

3)このフィールドのタイプはどのようにする必要がありますか?テキスト?

クライアントは ContentResolverを呼び出します。項目のURI を保持するユーザー向きのフィールド のopenInputStream()。

4)これはまったくのゴミです!フィールド上でContentResolver.openInputStream()に電話するにはどうすればいいですか?レコードでこれを呼び出し、Uriを渡すことしかできません。

ありがとうございました。私があなたを助けてくれることを願っています。私はまた、これらのSOの質問(thisthis)を見直して、彼らが役に立たなかった。

ところで私はAPI(バージョン1.6)のレベル4に対してビルドしています。

答えて

3

「どこのプロバイダでもサポートされているファイルがありません」の参照先は、hereです。あなたが説明したものと非常によく似ているようです。

つまり、コンテンツプロバイダ(またはそのスーパークラスの一部)は、openFileメソッドをオーバーライドして実装する必要があります。このエラーは、デフォルトでは「実装されていません - バックオフ!コードはContentProvider.javaです。

私は立ち往生したときにフレームワークの基礎となるソースコードを覗いてみると、ドキュメントには少し欠けていることがあります。

+0

ありがとうございました!私が推測したように、それはopenFileを実装することを伴いますが、それはどこにも言及されていませんでした。とにかくファイルに格納することが含まれていることがわかりましたので、カスタムプロバイダでファイルを公開しないため、私には利点がありません。 – Aliostad

関連する問題