androidのデータベースとContent Provider(三)


Conttent Providerを使う
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.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のフレームコードを示します.
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; 
}