androidのデータベースとContent Provider(三)
Conttent Providerを使う
Content Resolaverを紹介します.
ContentResolaver cr=get ContentResoliver()
ContentResoloverを使ってConttent Providerを事務操作します.
直接例を見る:
操作が終わったらCursorを消してください.メモリが漏れないようにしてください.
APPの流暢さを保証するために、これらのデータベースに対する操作は非同期のほうがいいです.
Curer Loaderを使用して非同期操作を実現する.
データベースの操作は時間がかかりますので、メインスレッドでのデータベース操作を避ける必要があります.
Cursorを自分で管理して、UIプロセスで非同期で正確に操作するのは難しいです.これらのステップを簡略化するために、Android 3.0(API level 11)は、Loaderクラスを導入する.LoaderもAndroid Support Libraryで利用できます.
Loadersを紹介します
Loader ManagerはLoaderを管理しています.ActivityとFragmentごとにアクセスできます.これらは非同期的にデータをロードするように設計されたものであり、底のデータソースの変化を監視するものである.
Curer Loaderはデータソースの変化を観察するので、あなた自身のコンテンツ観測者を実現する必要はありません.Loader ManagerはCursorのライフサイクルを管理して、Activityが終了したら、それも閉じることを確保します.
CurrsorLoaderコールバック関数を実現します.
CurrsorLoaderを使用するためには、新しいLoader Manager.LoaderCallbacksを作成して実現する必要があります.
LoaderManager.LoaderCallbacksloaderCallback = new Loader Manager.LoaderCallbacks<Curor>(){
この匿名の実現方法は、単にLoaderが実現する必要があると思います.
Loaderのコールバック関数を紹介します.
1.onCreateLoaderが初期化されたときにこの関数をトリガします.この関数では、新しいCurer Loaderオブジェクトを作成して返す必要があります.Curer Loader構築パラメータはContentResolaverを使ってクエリーを実行します.
2.onLoadFinished Loader Managerが非同期クエリを完了すると、この関数が呼び出され、結果集Cursorがパラメータとして渡されます.このCurerを使って、あなたのadapperと他のUI要素を更新することができます.
3.onLoadReset Loader ManagerがあなたのCurrsorLoaderをリセットすると、この関数が呼び出されます.この関数では、クエリによって得られたデータに対するすべての参照とリセットUIをリリースします.CurorはLoader Managerによって閉じられますので、それを閉じることを試みるべきではありません.
注意:onLoadFinishedとonLoadResetは非同期ではない.
次にonCreat Loaderのフレームコードを示します.
CurrsorLoaderを初期化して再起動します.
Loader Manager loader Manager=get Loader Manager()
新しいCurrsorLoaderを初期化したいなら、Loader Managerのinit Loader方法を呼び出して、Loaderフィードバック実現の引用を伝達して、もう一つの選択可能なパラメータBundeleと一つのloader標識があります.Bundele args=null;loader Manager.initLoader(LOADERuID、cagbacks)
これらのステップは主にActivityのonCreateメソッド内で行われます.
識別子で指定されたloaderが存在しない場合、関連するLoaderフィードバック関数onCreateLoaderに作成されます.前に述べたように.
もっと多くの場合、これが一番必要です.Loader ManagerはLoadersのライフサイクルと下層の照会を管理しています.同様に、結果集の変更も管理しています.
Loaderはすでに作成されています.initLoaderを繰り返すと、既存のloaderに簡単に戻ります.以前に作成したLoaderを放棄したいなら、retart Loader方法を再構築したいです.loader Manager.retart Loader(LOADERuID,args,myLoaderCallbacks).
この典型は、あなたの照会パラメータが変化すると発生します.
コンテントの削除と更新
Conttent Provider上で事務を実行して、Conttent Resolaverはinsert、deleteとudateの方法を使って、これらの操作を別の作業スレッドに移動しない限り、メインスレッドで実行します.
1.insert
Content Resolaverは2つの記録を挿入する方法を提供します.
1.insertシングル記録挿入
一つのコンテントValuesの対象に関連します.
2.bulkInsert一括挿入
Conttent Values配列に関連しています.
例:
2.delete
直接例:
直接例:
Conttent Providerに格納されているファイルにアクセスします.
新しいファイルを訪問したり、挿入したりして、簡単にContentResolaverのopenOutputStreamまたはopenInputStreamを利用して、Contit Providerの中に必要なファイルを含むレコードURIを転送します.
Content Resolaverを紹介します.
ContentResolaver cr=get ContentResoliver()
ContentResoloverを使ってConttent Providerを事務操作します.
直接例を見る:
// Get the Content Resolver.
ContentResolver cr = getContentResolver();
// Specify the result column projection. Return the minimum set
// of columns required to satisfy your requirements.
String[] result_columns = new String[] {
MyHoardContentProvider.KEY_ID,
MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN,
MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN };
// Specify the where clause that will limit your results.
String where = MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN
+ “=” + 1;
// Replace these with valid SQL statements as necessary.
String whereArgs[] = null;
String order = null;
// Return the specified rows.
Cursor resultCursor = cr.query(MyHoardContentProvider.CONTENT_URI,
result_columns, where, whereArgs, order);
多くのContent ProviderにもショートカットURIモードが含まれています.指定された行のデータを操作して、URIにIDを付加します.コンテントUrisの静的な方法を使ってもいいです.// Get the Content Resolver.
ContentResolver cr = getContentResolver();
// Specify the result column projection. Return the minimum set
// of columns required to satisfy your requirements.
String[] result_columns = new String[] {
MyHoardContentProvider.KEY_ID,
MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN,
MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN };
// Append a row ID to the URI to address a specific row.
Uri rowAddress =
ContentUris.withAppendedId(MyHoardContentProvider.CONTENT_URI,
rowId);
// These are null as we are requesting a single row.
String where = null;
String whereArgs[] = null;
String order = null;
// Return the specified rows.
Cursor resultCursor = cr.query(rowAddress,
result_columns, where, whereArgs, order);
戻りの結果セットに従ってCursorに存在し、Cursorに対して動作する.float largestHoard = 0f;
String hoardName = “No Hoards”;
// Find the index to the column(s) being used.
int GOLD_HOARDED_COLUMN_INDEX = resultCursor.getColumnIndexOrThrow(
MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN);
int HOARD_NAME_COLUMN_INDEX = resultCursor.getColumnIndexOrThrow(
MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN);
// Iterate over the cursors rows.
// The Cursor is initialized at before first, so we can
// check only if there is a “next” row available. If the
// result Cursor is empty, this will return false.
while (resultCursor.moveToNext()) {
float hoard = resultCursor.getFloat(GOLD_HOARDED_COLUMN_INDEX);
if (hoard > largestHoard) {
largestHoard = hoard;
hoardName = resultCursor.getString(HOARD_NAME_COLUMN_INDEX);
}
}
// Close the Cursor when you’ve finished with it.
resultCursor.close();
操作が終わったらCursorを消してください.メモリが漏れないようにしてください.
APPの流暢さを保証するために、これらのデータベースに対する操作は非同期のほうがいいです.
Curer Loaderを使用して非同期操作を実現する.
データベースの操作は時間がかかりますので、メインスレッドでのデータベース操作を避ける必要があります.
Cursorを自分で管理して、UIプロセスで非同期で正確に操作するのは難しいです.これらのステップを簡略化するために、Android 3.0(API level 11)は、Loaderクラスを導入する.LoaderもAndroid Support Libraryで利用できます.
Loadersを紹介します
Loader ManagerはLoaderを管理しています.ActivityとFragmentごとにアクセスできます.これらは非同期的にデータをロードするように設計されたものであり、底のデータソースの変化を監視するものである.
Curer Loaderはデータソースの変化を観察するので、あなた自身のコンテンツ観測者を実現する必要はありません.Loader ManagerはCursorのライフサイクルを管理して、Activityが終了したら、それも閉じることを確保します.
CurrsorLoaderコールバック関数を実現します.
CurrsorLoaderを使用するためには、新しいLoader Manager.LoaderCallbacksを作成して実現する必要があります.
LoaderManager.LoaderCallbacks
この匿名の実現方法は、単にLoaderが実現する必要があると思います.
Loaderのコールバック関数を紹介します.
1.onCreateLoaderが初期化されたときにこの関数をトリガします.この関数では、新しいCurer Loaderオブジェクトを作成して返す必要があります.Curer Loader構築パラメータはContentResolaverを使ってクエリーを実行します.
2.onLoadFinished Loader Managerが非同期クエリを完了すると、この関数が呼び出され、結果集Cursorがパラメータとして渡されます.このCurerを使って、あなたのadapperと他のUI要素を更新することができます.
3.onLoadReset Loader ManagerがあなたのCurrsorLoaderをリセットすると、この関数が呼び出されます.この関数では、クエリによって得られたデータに対するすべての参照とリセットUIをリリースします.CurorはLoader Managerによって閉じられますので、それを閉じることを試みるべきではありません.
注意:onLoadFinishedとonLoadResetは非同期ではない.
次にonCreat Loaderのフレームコードを示します.
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// Construct the new query in the form of a Cursor Loader. Use the id
// parameter to construct and return different loaders.
String[] projection = null;
String where = null;
String[] whereArgs = null;
String sortOrder = null;
// Query URI
Uri queryUri = MyContentProvider.CONTENT_URI;
// Create the new Cursor loader.
return new CursorLoader(DatabaseSkeletonActivity.this, queryUri,
projection, where, whereArgs, sortOrder);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
// Replace the result Cursor displayed by the Cursor Adapter with
// the new result set.
adapter.swapCursor(cursor);
// This handler is not synchronized with the UI thread, so you
// will need to synchronize it before modifying any UI elements
// directly.
}
public void onLoaderReset(Loader<Cursor> loader) {
// Remove the existing result Cursor from the List Adapter.
adapter.swapCursor(null);
// This handler is not synchronized with the UI thread, so you
// will need to synchronize it before modifying any UI elements
// directly.
}
CurrsorLoaderを初期化して再起動します.
Loader Manager loader Manager=get Loader Manager()
新しいCurrsorLoaderを初期化したいなら、Loader Managerのinit Loader方法を呼び出して、Loaderフィードバック実現の引用を伝達して、もう一つの選択可能なパラメータBundeleと一つのloader標識があります.Bundele args=null;loader Manager.initLoader(LOADERuID、cagbacks)
これらのステップは主にActivityのonCreateメソッド内で行われます.
識別子で指定されたloaderが存在しない場合、関連するLoaderフィードバック関数onCreateLoaderに作成されます.前に述べたように.
もっと多くの場合、これが一番必要です.Loader ManagerはLoadersのライフサイクルと下層の照会を管理しています.同様に、結果集の変更も管理しています.
Loaderはすでに作成されています.initLoaderを繰り返すと、既存のloaderに簡単に戻ります.以前に作成したLoaderを放棄したいなら、retart Loader方法を再構築したいです.loader Manager.retart Loader(LOADERuID,args,myLoaderCallbacks).
この典型は、あなたの照会パラメータが変化すると発生します.
コンテントの削除と更新
Conttent Provider上で事務を実行して、Conttent Resolaverはinsert、deleteとudateの方法を使って、これらの操作を別の作業スレッドに移動しない限り、メインスレッドで実行します.
1.insert
Content Resolaverは2つの記録を挿入する方法を提供します.
1.insertシングル記録挿入
一つのコンテントValuesの対象に関連します.
2.bulkInsert一括挿入
Conttent Values配列に関連しています.
例:
// Create a new row of values to insert.
ContentValues newValues = new ContentValues();
// Assign values for each row.
newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN,
hoardName);
newValues.put(MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN,
hoardValue);
newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN,
hoardAccessible);
// [ ... Repeat for each column / value pair ... ]
// Get the Content Resolver
ContentResolver cr = getContentResolver();
// Insert the row into your table
Uri myRowUri = cr.insert(MyHoardContentProvider.CONTENT_URI,
newValues);
2.delete
直接例:
// Specify a where clause that determines which row(s) to delete.
// Specify where arguments as necessary.
String where = MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN +
“=” + 0;
String whereArgs[] = null;
// Get the Content Resolver.
ContentResolver cr = getContentResolver();
// Delete the matching rows
int deletedRowCount =
cr.delete(MyHoardContentProvider.CONTENT_URI, where, whereArgs);
3.udate直接例:
// Create the updated row content, assigning values for each row.
ContentValues updatedValues = new ContentValues();
updatedValues.put(MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN,
newHoardValue);
// [ ... Repeat for each column to update ... ]
// Create a URI addressing a specific row.
Uri rowURI =
ContentUris.withAppendedId(MyHoardContentProvider.CONTENT_URI,
hoardId);
// Specify a specific row so no selection clause is required.
String where = null;
String whereArgs[] = null;
// Get the Content Resolver.
ContentResolver cr = getContentResolver();
// Update the specified row.
int updatedRowCount =
cr.update(rowURI, updatedValues, where, whereArgs);
Conttent Providerに格納されているファイルにアクセスします.
新しいファイルを訪問したり、挿入したりして、簡単にContentResolaverのopenOutputStreamまたはopenInputStreamを利用して、Contit Providerの中に必要なファイルを含むレコードURIを転送します.
public void addNewHoardWithImage(String hoardName, float hoardValue,
boolean hoardAccessible, Bitmap bitmap) {
// Create a new row of values to insert.
ContentValues newValues = new ContentValues();
// Assign values for each row.
newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN,
hoardName);
newValues.put(MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN,
hoardValue);
newValues.put(
MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN,
hoardAccessible);
// Get the Content Resolver
ContentResolver cr = getContentResolver();
// Insert the row into your table
Uri myRowUri =
cr.insert(MyHoardContentProvider.CONTENT_URI, newValues);
try {
// Open an output stream using the new row’s URI.
OutputStream outStream = cr.openOutputStream(myRowUri);
// Compress your bitmap and save it into your provider.
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outStream);
}
catch (FileNotFoundException e) {
Log.d(TAG, “No file found for this record.”);
}
}
public Bitmap getHoardImage(long rowId) {
Uri myRowUri =
ContentUris.withAppendedId(MyHoardContentProvider.CONTENT_URI,
rowId);
try {
// Open an input stream using the new row’s URI.
InputStream inStream =
getContentResolver().openInputStream(myRowUri);
// Make a copy of the Bitmap.
Bitmap bitmap = BitmapFactory.decodeStream(inStream);
return bitmap;
}
catch (FileNotFoundException e) {
Log.d(TAG, “No file found for this record.”);
}
return null;
}