ContentProviderトランザクションおよびデータベースの監視を実現

4581 ワード

データベースの操作では、トランザクションが回避されないことがよくあります.これにより、データベースの操作回数を減らすことができ、読み書きデータベースの効率が向上します.以前、ContentProviderの基本的な使用と関連する知識点について大まかな要約がありましたが、ここでは詳しく説明しません.今日は主にContentProviderを使用してトランザクションを処理する方法と、データベースのテーブルを監視する方法について説明します.
一、ContentProviderによるデータベースのバッチ処理
一般的にデータベース操作には、カプセル化されたContentProviderを使用して外部(他のプロセスまたはオブジェクト)にデータベース操作を行う方法と、SQLiteDatabaseを介してsql文を直接実行する方法の2つがあり、データベースの削除と変更の効果を達成する方法が知られています.
SQLiteDatabaseを使用してデータベース操作を行う場合
DatabaseHelper dbhelper = new DatabaseHelper(ctx);
SQLiteDatabase db =dbhelper.getWritableDatabase(); 
StringBuffer sb = new StringBuffer();
		sb.append("CREATE TABLE IF NOT EXISTS ");
		sb.append(DvbNetworkDatabase.TransportStreams.TABLE_NAME);
		sb.append(" (");
		sb.append(TransportStreams._ID).append(" INTEGER PRIMARY KEY,");
		sb.append(TransportStreams.FREQUENCY).append(" INT,");
		sb.append(TransportStreams.DEVLIVERY_TYPE).append(" INT,");
		sb.append(TransportStreams.TRANSPORT_STREAM_ID).append(" INT,");
		sb.append(TransportStreams.MPEG_TRANSPORT_STREAM_ID).append(" INT,");
		sb.append(TransportStreams.NETWORK_ID).append(" INT,");
		sb.append(TransportStreams.ORIGINAL_NETWORK_ID).append(" INT,");
		sb.append(TransportStreams.INFO_VERSION).append(" INT,");
		sb.append(TransportStreams.TUNE_PARAM).append(" TEXT);");
		createTSTableSql = sb.toString();
db.execSQL(createTSTableSql);

SQLiteDatabaseによるトランザクション・バッチの実装
SQLiteDatabase db =mOpenHelper.getWritableDatabase(); 
                   db.beginTransaction();//     
//  insertdelete update       
db.setTransactionSuccessful();//       Successful 
db.endTransaction();//    

SQLiteDatabaseを使用してデータベースを操作する場合、私たちは一般的にアプリケーション(同じプロセスで)で実現していますが、ContentProviderの対外インタフェースを通じて、私たちはどのように実現しますか?公式サイトのドキュメントをめくったり、ソースコードを見たりしてapplyBatchの方法を見つけることができます.Override this to handle requests to perform a batch of operations(この処理要求を書き直して一括操作を実行します)
public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
			throws OperationApplicationException {
		SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
		db.beginTransaction();//     
		try {
			ContentProviderResult[] results = super.applyBatch(operations);
			db.setTransactionSuccessful();//        successful
			return results;
		} finally {
			db.endTransaction();//     
			Uri uri = null;
			for (ContentProviderOperation opt : operations) {
				if (opt.getUri().equals(uri)) {
					continue;
				}
				uri = opt.getUri();
				getContext().getContentResolver().notifyChange(opt.getUri(), null);
				Log.i(TAG, "notifychange endTransaction..uri:" + opt.getUri());
			}
		}
	}

ContentProviderでバッチを実行する場合、次の方法があります.
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
//    
String[] args = new String[] { String.valueOf(GROUP_ID), String.valueOf(USER_ID) };
		ops.add(ContentProviderOperation.newDelete(uri).withSelection(DEL_SELECTTION, args)
				.build());
//     value ContentValue
ops.add(ContentProviderOperation.newInsert(uri).withValues(value).build());
//    
……newUpdate……

二、ContentObserverによるデータベース表の監視
通常、私たちはあるデータを監視して、すべて1つのスレッドを作成してデータ監視の効果を達成して、このようにcpuの占有率とメモリのオーバーヘッドに対してとても大きくて、データベースの表に対して監視を行って、androidは1セットの完備したメカニズムを提供して、ContentProviderを使用します.ContentObserver:特定のUriによって引き起こされるデータベースの変化を観察(捕捉)することを目的とするコンテンツ・オブザーバー.次に、データベース技術におけるTriggerに類似した処理を行い、ContentObserverによって観察されるUriが変化するとトリガーされる.フリップフロップは、テーブルフリップフロップ、ラインフリップフロップに分けられ、それに応じてContentObserverも「テーブルContentObserver、ラインContentObserver」に分けられる.ContentObserverでデータベース・テーブル/ローを監視するには、次の3つのステップが必要です.
1.我々の特定のContentObserver派生クラスを作成するには、onChange()メソッドを再ロードしてコールバック後の機能実装を処理しなければならない2、contextを利用する.getContentResolover()はContentResoloveオブジェクトを取得し、registerContentObserver()メソッドを呼び出してコンテンツオブザーバを登録し、指定したUriにContentObserver派生クラスインスタンスを登録し、指定したUriが変更された場合、そのインスタンスオブジェクトをコールバックして処理する.3、ContentObserverのライフサイクルがActivityやServiceなどに同期していないため、不要な場合はunregisterContentObserver()を手動で呼び出して登録をキャンセルする必要があります.
public ContentObserver setChannelObserver(){
		channelObserver = new ContentObserver(channelHandler) {
			public void onChange(boolean selfChange) {
				Log.i("3--3", "--------------go in Observe channelObserver");
				postLoadChannels();
			};
		};
		return channelObserver;
	}
……
context.getContentResolver().registerContentObserver(channelsUri, false,
						setChannelObserver());
……