Android ContentProvider+ContentObserver

这一生的挚爱 提交于 2020-03-02 07:41:09

说明:文章仅供本人学习记录所用。

   1.理解含义:

      ContentProvider: 内容提供者,将数据以表的形式进行操作。主要实现应用程序间数据共享,操作系统本地数据(包括短       信、音频、视屏、数据库)。

      ContentObserver:内容观察者,监听数据变化。

   2.使用方法:

       ContentProvider:

       1)步骤:新建MyProvider类继承ContentProvider类;注册URI;重写方法(onCreate、query、bulkInsert、insert、           delete、update);在AndroidManifest.xml中配置provider;

       2)代码:

public class MyProvider extends ContentProvider {
	private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
	private static final int INSERT = 1;
	private static final int UPDATE = 2;
	private static final int DELETE = 3;
	private static final int QUERY = 4;
	private static final int INSERTS = 5;
	private DBHelper dbOpenHelper;
	private String TAG = "Provider";
	static {
		// 为UriMatcher注册si四个Uri
		matcher.addURI(Picture.AUTHORITY, "insert", INSERT);
		matcher.addURI(Picture.AUTHORITY, "update", UPDATE);
		matcher.addURI(Picture.AUTHORITY, "delete", DELETE);
		matcher.addURI(Picture.AUTHORITY, "query", QUERY);
		matcher.addURI(Picture.AUTHORITY, "inserts", INSERTS);
		//说明Picture.AUTHORITY:表示你要操作的ContentProvider,一般以要操作的实体类的包名命名。
	}

	@Override
	public boolean onCreate() {
	        //获取数据库辅助类
		dbOpenHelper = DBHelper.getInstance(getContext());
		DatabaseManager.initializeInstance(dbOpenHelper);
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		// TODO Auto-generated method stub
		int code = matcher.match(uri);
		Cursor c = null;
		switch (code) {
		case QUERY:
			SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
			c = database.query("picture", projection, selection, selectionArgs,
					null, null, sortOrder);

			c.setNotificationUri(getContext().getContentResolver(), uri);
			DatabaseManager.getInstance().closeDatabase();
		case UriMatcher.NO_MATCH:
			Log.i(TAG, "------------未知的URI" + uri);
			break;
		}
		return c;
	}

	@Override
	public String getType(Uri uri) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		int code = matcher.match(uri);
		switch (code) {
		case INSERT:
			SQLiteDatabase database = DatabaseManager.getInstance()
					.openDatabase();// 线程安全并发操作数据库
			try {// 获得数据库实例
				database.insert("picture", null, values);
				getContext().getContentResolver().notifyChange(uri, null);
			} catch (Exception ex) {
				Log.i(TAG, "insert ex=====" + ex.toString());
			} finally {
				DatabaseManager.getInstance().closeDatabase();
			}
			break;
		case UriMatcher.NO_MATCH:
			Log.i(TAG, "------------未知的URI" + uri);
			break;
		}

		return null;
	}
	/**
	 * 批量插入
	 */
	@Override
	public int bulkInsert(Uri uri, ContentValues[] values) {
		int code = matcher.match(uri);
		switch (code) {
		case INSERTS:
			SQLiteDatabase database = DatabaseManager.getInstance()
					.openDatabase();// 线程安全并发操作数据库
			try {// 获得数据库实例
				int numValues = 0;
				numValues = values.length;
				for (int i = 0; i < numValues; i++) {
					ContentValues value = values[i];
					database.delete("picture", "name = ?",
							new String[] { String.valueOf(value.get("name")) });
					Log.i(TAG,
							"name===== values"
									+ String.valueOf(value.get("name")));
					database.insert("picture", null, values[i]);
					Log.i(TAG, "Value insert====" + i);
				}
				getContext().getContentResolver().notifyChange(uri, null);
			} catch (Exception ex) {
				Log.i(TAG, "insert ex=====" + ex.toString());
			} finally {
				DatabaseManager.getInstance().closeDatabase();
			}
			break;
		case UriMatcher.NO_MATCH:
			Log.i(TAG, "------------未知的URI" + uri);
			break;
		}

		return 0;

	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		int code = matcher.match(uri);
		switch (code) {
		case DELETE:
			SQLiteDatabase database = DatabaseManager.getInstance()
					.openDatabase();
			int i = 0;
			try {
				i = database.delete("picture", selection, selectionArgs);
				if (i > 0) {
					getContext().getContentResolver().notifyChange(uri, null);
				}
			} catch (Exception ex) {
				Log.i(TAG, "delete ex====" + ex.toString());
			} finally {
				// database.close();
				DatabaseManager.getInstance().closeDatabase();
			}

			return i;
		case UriMatcher.NO_MATCH:
			Log.i(TAG, "------------未知的URI" + uri);
			break;
		}
		return 0;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		// TODO Auto-generated method stub
		int code = matcher.match(uri);
		switch (code) {
		case UPDATE:
			// SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
			SQLiteDatabase database = DatabaseManager.getInstance()
					.openDatabase();
			int i = 0;
			try {
				i = database
						.update("picture", values, selection, selectionArgs);
				if (i != 0) {
					getContext().getContentResolver().notifyChange(uri, null);
				}
			} catch (Exception ex) {
				Log.i(TAG, "update ex===" + ex.toString());
			} finally {
				// database.close();
				DatabaseManager.getInstance().closeDatabase();
			}
			return i;
		case UriMatcher.NO_MATCH:
			Log.i(TAG, "------------未知的URI" + uri);
			break;
		}
		return 0;
	}

}

//在数据库操作类中添加以下方法。
//单条数据添加
public static void addPicture(Picture picture) {
		Uri uri = Uri.parse("content://" + Picture.AUTHORITY + "/insert");
		ContentValues values = new ContentValues();//封装数据
		values.put("name", picture.name);
		...
		AppApplication.getInstance().getContentResolver().insert(uri, values);
	}
//多条数据添加
public static void addPictures(List<Picture> pictures) {
		Uri uri = Uri.parse("content://" + Picture.AUTHORITY + "/inserts");
		ContentValues[] values = new ContentValues[pictures.size()];
		for (int i = 0; i < pictures.size(); i++) {
			Picture picture = pictures.get(i);
			ContentValues value = new ContentValues();
			value.put("name", picture.name);
			...
			values[i] = value;
		}
		Log.i(TAG, "addPictures_values_size=====" + values.length);
		AppApplication.getInstance().getContentResolver().bulkInsert(uri, values);
	}	
//删除操作
public static void deletePictureTag() {
		Uri uri = Uri.parse("content://" + Picture.AUTHORITY + "/delete");
		int i = AppApplication.getInstance().getContentResolver()
				.delete(uri, "whereName = ?", new String[] { "value" });
	}	

//修改操作
public static void updatePicture(Picture picture) {
		Uri uri = Uri.parse("content://" + Picture.AUTHORITY + "/update");
		ContentValues values = new ContentValues();
		values.put("tagStatus", picture.tagStatus);
		int i = AppApplication.getInstance().getContentResolver()
				.update(uri, values, "whereName = ?", new String[] { picture.name });
	}	
//AndroidManifest.xml中配置provider
<provider
            android:name="com....provider.MyProvider"//包名
            android:authorities="com....provider.myProvide" />

  ContentObserver:

   1)步骤:注册与注销ContentObserver;添加ContentObserver方法。

   2)代码:

//uri与provider中注册的uri对应
Uri uri = Uri.parse("content://" + Picture.AUTHORITY + "/insert");//监听添加
getContentResolver().registerContentObserver(uri, true, cob);
Uri uri_inserts = Uri.parse("content://" + Picture.AUTHORITY+ "/inserts");//监听批量添加
getContentResolver().registerContentObserver(uri_inserts, true, cob);
Uri uri_update = Uri.parse("content://" + Picture.AUTHORITY + "/update");//监听修改
getContentResolver().registerContentObserver(uri_update, true, cob);

getContentResolver().unregisterContentObserver(cob);//在onDestroy销毁

//监听数据改变的方法
private ContentObserver cob = new ContentObserver(new Handler()) {
		@Override
		public boolean deliverSelfNotifications() {
			return super.deliverSelfNotifications();
		}

		@Override
		public void onChange(boolean selfChange) {
			super.onChange(selfChange);
			//改变数据时做出相应的操作
			......
			}
}



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!