欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android ContentProvider+ContentObserver

程序员文章站 2024-02-09 16:50:22
...

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

   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);
			//改变数据时做出相应的操作
			......
			}
}



转载于:https://my.oschina.net/imeibi/blog/481425

上一篇: I

下一篇: ContentProvider&ContentResolver