365連休

にわかのandroidとかの開発メモ。

Android Studio 3.6 MediaStoreのBaseColumn._IDが主キーじゃないという話

android.provider.MediaStoreのImageColumnsもFileColumnsもandroid.provider.BaseColumnsを継承しているが、

BaseColumns._IDは主キーじゃなかったという話。

 

 ハイラルキー

  • BaseColumns
    • MediaColumns
      • ImageColumns
      • AudioColumns
      • VideoColumns
      • DownloadColumns
      • FileColumns

 

BaseColumnsには_ID_COUNTが定義されていて、継承してる他のXXXColumnsでも全部使えるのね~なるほど~と思ってたら、

単一ファイルを指すMediaProviderのUri

ContentResolver#query(uri, null, null, null, null); //select * from uri

を実行したら、_IDが入ってなくて、ファッ!?

※ちなみに_COUNTも入っていない。

 

 

普段はFilesとか全件取ってくるようなqueryしか流してなくて、知らなかった。

 

BaseColumns._IDのコメントには

< Android API 29 Platform >

    /**
     * The unique ID for a row.
     */
    @Column(Cursor.FIELD_TYPE_INTEGER)
    public static final String _ID = "_id";

とあって、直訳すると"行のユニークID"

意味わからんけど、どうも結果セットのユニークIDっぽい。

 

 

以下Emulator(Android 4.4)での実行結果

ContentResolver#queryに渡すUri _ID
MediaStore.Files.getContentUri("external") 1~の通し番号。まるで主キー。
MediaStore.Images.Media.EXTERNAL_CONTENT_URI Filesの_IDと完全一致。まるで主キー。
画像Uri

projection=nullの時、存在しない列。ファッ!?

projectionに_IDを含めた場合、常に0。(-_-)

※ちなみに_COUNT列をprojectionに含めると、「そんな列無い」って例外でる。

 

 

 

 

はいらるきー?

neet-rookie.hatenablog.com