android.provider.MediaStoreのImageColumnsもFileColumnsもandroid.provider.BaseColumnsを継承しているが、
BaseColumns._IDは主キーじゃなかったという話。
ハイラルキー
- BaseColumns
- MediaColumns
- ImageColumns
- AudioColumns
- VideoColumns
- DownloadColumns
- FileColumns
- MediaColumns
BaseColumnsには_IDと_COUNTが定義されていて、継承してる他のXXXColumnsでも全部使えるのね~なるほど~と思ってたら、
単一ファイルを指すMediaProviderのUriで
ContentResolver#query(uri, null, null, null, null); //select * from uri
を実行したら、_IDが入ってなくて、ファッ!?
※ちなみに_COUNTも入っていない。
普段はFilesとか全件取ってくるようなqueryしか流してなくて、知らなかった。
BaseColumns._IDのコメントには
/** * 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に含めると、「そんな列無い」って例外でる。 |
はいらるきー?