Sibainu Relax Room

愛犬の柴犬とともに過ごす部屋

Android の ContentResolver と Cursor について

朝の散歩です。何か殺風景な感じがする。これでいいのかという顔をしている柴犬です。

去年の今頃はもう満開でしたが、今年は満開がかなり遅くなりそうです。3月からに入ってからかなり寒い日が多かったので遅いようです。

概要

これまでCameraXで作ってきたAndroidアプリで撮影した写真が溜まりすぎると削除したくなる場面がでてくると思います。

ファイルの削除は次のコードでできます。

File file = new File(Environment.getExternalStorageDirectory() + "/ファイル名.jpg");
file.delete();

Androidアプリのデータベースからの削除は次のコードでできます。

context.getContentResolver().delete(
    MediaStore.Files.getContentUri("external"),
    MediaStore.Files.FileColumns.DATA + "=?",
    new String[]{ Path }
);

URI が分かっている場合の削除はどうするのかと思い考えてみましたので記録します。

WEBのみでは断片的で覚えにくいので最初に購入した Kotlin の本です。

URI を使用

URI を使用してファイルを削除を考えてみたところ次のようになりました。

Uri imageuri;
String[] projection = {MediaStore.MediaColumns.DATA};
//アプリケーションのデータベースに接続して DATA を検索し格納されている path を取得
Cursor cursor =
    getContentResolver().query(
        imageuri, projection, null, null, null
    );

if (cursor != null) {
    //最初のレコードにカーソルを移します
    if (cursor.moveToFirst()) {
        //カラムは一つだけなのでインデックスは 0
        path = cursor.getString(0).toString();
    }
    cursor.close();

    File file = new File(path);
    //ファイルの削除
    file.delete();

    //データベースから削除
    context.getContentResolver().delete(
        MediaStore.Files.getContentUri("external"),
        MediaStore.Files.FileColumns.DATA + "=?",
        new String[]{ Path }
    );
}

こうすると、MediaStore.Files.FileColumns.DATA だけでなく画像関係の項目は56種あるので項目に合わせた new String[]{ 配列 } を作れば柔軟に拾い上げができて削除できそうな感じがします。

私の予想に過ぎませんので機会があれば試したいと思います。

ContentResolver

ContentResolver の Android のHPでの説明は次のURIにあります。

https://developer.android.com/reference/android/content/ContentResolver
ContentResolver
メソッド
内容
戻り値
acquireContentProviderClient(Uri uri)
必要に応じてプロバイダを起動します。
final ContentProviderClient
acquireContentProviderClient(String name)
nameの権限を持つContentProviderに関連付けられているContentProviderClientを返し、必要に応じてプロバイダを起動します。
final ContentProviderClient
acquireUnstableContentProviderClient(String name)
acquireContentProviderClient(java.lang.String)と同様ですが、対象となるコンテンツ・プロバイダの安定性が信頼できない場合に使用します。
final ContentProviderClient
acquireUnstableContentProviderClient(Uri uri)
acquireContentProviderClient(android.net.Uri)と同様ですが、ターゲットコンテンツプロバイダの安定性が信頼できない場合に使用します。
final ContentProviderClient
addPeriodicSync(Account account, String authority, Bundle extras, long pollFrequency)
指定された頻度で、指定されたアカウント、権限、エクストラで同期を要求することを指定します。
static void
addStatusChangeListener(int mask, SyncStatusObserver callback)
SyncManager のさまざまな側面が変更されたときに通知を要求します。
static Object
applyBatch(String authority, ArrayList operations)
各 ContentProviderOperation オブジェクトを適用し、その結果の配列を返します。
ContentProviderResult[]
bulkInsert(Uri url, ContentValues[] values)
指定されたURLのテーブルに複数行を挿入します。
final int
call(Uri uri, String method, String arg, Bundle extras)
プロバイダ定義のメソッドを呼び出します。
final Bundle
call(String authority, String method, String arg, Bundle extras)
 
final Bundle
cancelSync(Uri uri)
代わりに cancelSync(android.accounts.Account, java.lang.String) を使用してください。
void
cancelSync(SyncRequest request)
指定された同期を削除します。
static void
cancelSync(Account account, String authority)
アカウントと権限が一致するアクティブまたは保留中の同期をキャンセルします。
static void
canonicalize(Uri url)
指定されたurlを、参照されているリソースの正規表現に変換します。
final Uri
delete(Uri url, String where, String[] selectionArgs)
コンテンツURIで指定された行を削除します。
final int
delete(Uri url, Bundle extras)
コンテンツURIで指定された行を削除します。
final int
getCurrentSync()
このメソッドは API レベル 15 で廃止されました。複数の同時同期がサポートされるようになったため、現在の同期の正確なリストを取得するには getCurrentSyncs() を使用する必要があります。このメソッドは、現在の同期リストの最初の項目を返すか、何もない場合は NULL を返します。
static SyncInfo
getCurrentSyncs()
すべてのアクティブな同期に関する情報を含むリストを返します。
static List
getIsSyncable(Account account, String authority)
このアカウント/プロバイダが同期可能かどうかをチェックします。
static int
getMasterSyncAutomatically()
すべてのプロバイダとアカウントに適用されるグローバル自動同期設定を取得します。
static boolean
getOutgoingPersistedUriPermissions()
呼び出し元のアプリがホストしているすべての永続化されたURIパーミッショングラントのリストを返します。
List
getPeriodicSyncs(Account account, String authority)
指定されたアカウントおよび権限の定期的な同期に関する情報のリストを取得します。
static List
getPersistedUriPermissions()
呼び出し元のアプリによって永続化されたすべてのURIパーミッショングラントのリストを返します。
List
getStreamTypes(Uri url, String mimeTypeFilter)
openTypedAssetFileDescriptor(Uri,String,Bundle)を使用してストリームとして開いたときに、指定されたコンテンツURLを返すことができる表現の可能なMIMEタイプを問い合わせます。
String[]
getSyncAdapterTypes()
システムに知られているSyncAdaptersに関する情報を取得します。
static SyncAdapterType[]
getSyncAutomatically(Account account, String authority)
ネットワークティックルを受信したときにプロバイダが同期されるべきかどうかをチェックします。このメソッドは、呼び出し元がパーミッションManifest.permission.READ_SYNC_SETTINGSを保持している必要があります。
static boolean
getType(Uri url)
与えられたコンテンツURLのMIMEタイプを返します。
final String
getTypeInfo(String mimeType)
タイプを説明するアイコンとラベルを含む、指定された MIME タイプの詳細な説明を返します。
final ContentResolver.MimeTypeInfo
insert(Uri url, ContentValues values, Bundle extras)
指定されたURLのテーブルに行を挿入します。
final Uri
insert(Uri url, ContentValues values)
指定されたURLのテーブルに行を挿入します。
final Uri
isSyncActive(Account account, String authority)
指定されたアカウントまたは権限に対する同期処理が現在アクティブに処理されている場合は true を返します。
static boolean
isSyncPending(Account account, String authority)
一致するオーソリティの保留ステータスが true の場合、true を返します。
static boolean
loadThumbnail(Uri uri, Size size, CancellationSignal signal)
与えられたUriのビジュアルサムネイルを効率的にロードする便利なメソッドです。
Bitmap
notifyChange(Collection uris, ContentObserver observer, int flags)
複数の行が更新されたことを登録されたオブザーバに通知します。
void
notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork)
このメソッドはAPIレベル30で非推奨となりました。呼び出し元はnotifyChange(android.net.Uri, android.database.ContentObserver, int)への移行を検討する必要があります。notifyChangeはNOTIFY_SYNC_TO_NETWORKだけでなく、より多くのオプションをサポートしています。
void
notifyChange(Uri uri, ContentObserver observer, int flags)
登録されているオブザーバに、行が更新されたことを通知します。
void
notifyChange(Uri uri, ContentObserver observer)
登録されたオブザーバに、行が更新されたことを通知し、変更をネットワークに同期させようとします。
void
openAssetFile(Uri uri, String mode, CancellationSignal signal)
 
final AssetFileDescriptor
openAssetFileDescriptor(Uri uri, String mode, CancellationSignal cancellationSignal)
未加工のファイル記述子を開き、URI配下のデータにアクセスします。
final AssetFileDescriptor
openAssetFileDescriptor(Uri uri, String mode)
URI の下にあるデータにアクセスするために、生のファイル記述子を開きます。
final AssetFileDescriptor
openFile(Uri uri, String mode, CancellationSignal signal)
 
final ParcelFileDescriptor
openFileDescriptor(Uri uri, String mode, CancellationSignal cancellationSignal)
URI配下のデータにアクセスするために生のファイル記述子を開きます。
final ParcelFileDescriptor
openFileDescriptor(Uri uri, String mode)
URI の下にあるデータにアクセスするために生のファイル記述子を開きます。
final ParcelFileDescriptor
openInputStream(Uri uri)
コンテンツ URI に関連付けられたコンテンツへのストリームを開きます。
final InputStream
openOutputStream(Uri uri)
openOutputStream(uri, “w”)の同義語。
final OutputStream
openOutputStream(Uri uri, String mode)
コンテンツURIに関連付けられたコンテンツにストリームをオープンします。
final OutputStream
openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts, CancellationSignal signal)
 
final AssetFileDescriptor
openTypedAssetFileDescriptor(Uri uri, String mimeType, Bundle opts, CancellationSignal cancellationSignal)
与えられたUriのビジュアルサムネイルを効率的にロードする便利なメソッドです。
final AssetFileDescriptor
openTypedAssetFileDescriptor(Uri uri, String mimeType, Bundle opts)
複数の行が更新されたことを登録されたオブザーバに通知します。
final AssetFileDescriptor
query(Uri uri, String[] projection, Bundle queryArgs, CancellationSignal cancellationSignal)
このメソッドはAPIレベル30で非推奨となりました。呼び出し元はnotifyChange(android.net.Uri, android.database.ContentObserver, int)への移行を検討する必要があります。notifyChangeはNOTIFY_SYNC_TO_NETWORKだけでなく、より多くのオプションをサポートしています。
final Cursor
query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal)
登録されているオブザーバに、行が更新されたことを通知します。
final Cursor
query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
登録されたオブザーバに、行が更新されたことを通知し、変更をネットワークに同期させようとします。
final Cursor
refresh(Uri url, Bundle extras, CancellationSignal cancellationSignal)
 
final boolean
registerContentObserver(Uri uri, boolean notifyForDescendants, ContentObserver observer)
未加工のファイル記述子を開き、URI配下のデータにアクセスします。
final void
releasePersistableUriPermission(Uri uri, int modeFlags)
URI の下にあるデータにアクセスするために、生のファイル記述子を開きます。
void
removePeriodicSync(Account account, String authority, Bundle extras)
 
static void
removeStatusChangeListener(Object handle)
URI配下のデータにアクセスするために生のファイル記述子を開きます。
static void
requestSync(Account account, String authority, Bundle extras)
URI の下にあるデータにアクセスするために生のファイル記述子を開きます。
static void
requestSync(SyncRequest request)
コンテンツ URI に関連付けられたコンテンツへのストリームを開きます。
static void
setIsSyncable(Account account, String authority, int syncable)
openOutputStream(uri, “w”)の同義語。
static void
setMasterSyncAutomatically(boolean sync)
コンテンツURIに関連付けられたコンテンツにストリームをオープンします。
static void
setSyncAutomatically(Account account, String authority, boolean sync)
プロバイダがネットワークティックルを受信したときに同期するかどうかを設定します。
static void
startSync(Uri uri, Bundle extras)
代わりにrequestSync(android.account.Account, java.lang.String, android.os.Bundle)を使用してください。
void
takePersistableUriPermission(Uri uri, int modeFlags)
オファーされた永続化可能なURIパーミッショングラントを受け取ります。
void
uncanonicalize(Uri url)
以前にcanonicalize(Uri)によって生成された正規URIが与えられた場合、それをローカルの非正規形式に変換します。
final Uri
unregisterContentObserver(ContentObserver observer)
変更オブザーバの登録を解除します。
final void
update(Uri uri, ContentValues values, Bundle extras)
コンテンツURIの行を更新します。
final int
update(Uri uri, ContentValues values, String where, String[] selectionArgs)
コンテンツURIの行を更新します。
final int
validateSyncExtrasBundle(Bundle extras)
以下の型の値のみがバンドル内にあることを確認します。 Integer Long Boolean Float Double String Account null
static void
wrap(ContentProviderClient wrapped)
すべてのメソッドを指定された ContentProviderClient にリダイレクトする ContentResolver インスタンスを作成します。
static ContentResolver
wrap(ContentProvider wrapped)
すべてのメソッドを指定された ContentProvider にリダイレクトする ContentResolver インスタンスを作成します。
static ContentResolver
 
計 71要素
 

Cursor

Cursor の Android のHP での説明は次のURLにあります。

https://developer.android.com/reference/android/database/Cursor

ContentResolver で検索して、Cursor の操作でいろいろ処理が出来そうです。

やはりリファレンスは大事ですね。

Cursor
メソッド
内容
戻り値
close()
カーソルを閉じ、すべてのリソースを解放し、完全に無効にします。
abstract void
copyStringToBuffer(int columnIndex, CharArrayBuffer buffer)
要求された列テキストを取得し、指定されたバッファに格納します。
abstract void
deactivate()
このメソッドは、API レベル 16 で非推奨となりました。requery() が非推奨であるため、このメソッドも非推奨です。
abstract void
getBlob(int columnIndex)
要求されたカラムの値をバイト配列として返します。
abstract byte[]
getColumnCount()
列の合計数を返します。
abstract int
getColumnIndex(String columnName)
指定したカラム名のゼロベースのインデックスを返すか、あるいはそのカラムが存在しない場合は -1 を返します。
abstract int
getColumnIndexOrThrow(String columnName)
指定されたカラム名のゼロベースのインデックスを返すか、カラムが存在しない場合は IllegalArgumentException をスローします。
abstract int
getColumnName(int columnIndex)
与えられたゼロベースのカラムインデックスにおけるカラム名を返します。
abstract String
getColumnNames()
結果セットに含まれるすべてのカラムの名前を、 結果にリストされた順番で保持する文字列配列を返します。
abstract String[]
getCount()
カーソル内の行数を返します。
abstract int
getDouble(int columnIndex)
要求された列の値をdoubleで返します。
abstract double
getExtras()
追加値の束を返します。
abstract Bundle
getFloat(int columnIndex)
指定された列の値をfloatで返します。
abstract float
getInt(int columnIndex)
指定された列の値をint型で返します。
abstract int
getLong(int columnIndex)
指定された列の値をlongで返します。
abstract long
getNotificationUri()
setNotificationUri(ContentResolver、Uri) によって以前に設定された、この Cursor のデータの変更の通知が配信される URI を返します。
abstract Uri
getNotificationUris()
以前に setNotificationUris(ContentResolver, List) によって設定された、このカーソルのデータの変更の通知が配信される URI を返します。
default List
getPosition()
行セット内のカーソルの現在位置を返します。
abstract int
getShort(int columnIndex)
要求された列の値を short で返します。
abstract short
getString(int columnIndex)
要求された列の値を String で返します。
abstract String
getType(int columnIndex)
指定された列の値のデータ型を返します。
abstract int
getWantsAllOnMoveCalls()
onMove() は、このメソッドが true を返した場合にのみ、プロセス間で呼び出されます。
abstract boolean
isAfterLast()
カーソルが最後の行の後の位置を指しているかどうかを返します。
abstract boolean
isBeforeFirst()
カーソルが最初の行の前の位置を指しているかどうかを返します。
abstract boolean
isClosed()
カーソルが閉じている場合はtrueを返します。
abstract boolean
isFirst()
カーソルが最初の行を指しているかどうかを返します。
abstract boolean
isLast()
カーソルが最後の行を指しているかどうかを返します。
abstract boolean
isNull(int columnIndex)
指定された列の値がNULLの場合にtrueを返します。
abstract boolean
move(int offset)
カーソルを現在の位置から前方または後方に相対量だけ移動する。
abstract boolean
moveToFirst()
カーソルを最初の行に移動する。
abstract boolean
moveToLast()
カーソルを最後の行に移動する。
abstract boolean
moveToNext()
カーソルを次の行に移動する。
abstract boolean
moveToPosition(int position)
カーソルを絶対位置に移動する。
abstract boolean
moveToPrevious()
カーソルを前の行に移動する。
abstract boolean
registerContentObserver(ContentObserver observer)
このカーソルの内容に変更が起こった時に呼び出されるオブザーバを登録します。
abstract void
registerDataSetObserver(DataSetObserver observer)
例えば、データセットがrequery()、deactivate()、またはclose()によって変更された場合などです。
abstract void
requery()
このメソッドは、API レベル 15 で非推奨となりました。これは使用しないでください。新しいカーソルを要求するだけで、非同期にこれを実行し、新しいカーソルが戻ってきたらリスト・ビューを更新することができます。
abstract boolean
respond(Bundle extras)
これは、カーソルのユーザがカーソルと通信するための帯域外の方法です。
abstract Bundle
setExtras(Bundle extras)
getExtras()によって返されるBundleを設定します。
abstract void
setNotificationUri(ContentResolver cr, Uri uri)
コンテンツURIの変更を監視するために登録します。
abstract void
setNotificationUris(ContentResolver cr, List uris)
setNotificationUri(android.content.ContentResolver、android.net.Uri)と似ていますが、このバージョンでは複数のコンテンツURIの変更を監視することができます。
default void
unregisterContentObserver(ContentObserver observer)
以前にregisterContentObserver(ContentObserver)を介してこのカーソルに登録されたオブザーバの登録を解除します。
abstract void
unregisterDataSetObserver(DataSetObserver observer)
以前に registerContentObserver(ContentObserver) によってこのカーソルに登録されたオブザーバの登録を解除します。。
abstract void
 
計 43要素
 

この件はここまでとします。