Android ContentProvider 應用程序間共享數據庫


閒來無事用下 ContentProvider

這是程序間共享數據的推薦途徑(共享數據庫);

比如通訊錄軟件就用了系統的共享的數據庫;

廢話少說:

要共享自己的數據庫就得把自己整個的表結構以靜態類的形式共享出來

第一步:

/**
 * 外部類和內部類正好對應了 數據庫和表的關係,一個數據庫下可以有多個表,所以可以在People下建多個內部類,類似Man類;
 * 而這個類的包結構正好唯一指定了這個表
 */
public final class People {
	public static final String AUTHORITY="com.nsw.android.provide.People";
	public static final String DB_NAME="People.db";
	public static final int VERSION=1;
	public static final  class Man implements BaseColumns{
		
		public static final String TABLE_NAME="Man";
		public static final Uri Content_URI=Uri.parse("content://"+AUTHORITY+"/"+TABLE_NAME);
		public static final String NAME="name";
		public static final String AGE="age";
		public static final String SEX="sex";
	}
	
}

第二步:

/**
 * 跟你以前寫的DB類類似,只不過繼承了ContentProvider,在其方法中封裝SQLiteDatabase的對象的增刪查改
 * 類裏包含了一個SQLiteHelper的子類的引用
 * 和一個UriMatcher (URI匹配器)
 * @author infinity
 *
 */
public class MyProvider extends ContentProvider {
	/**
	 * 這個變量相當一個URI的過濾器,來識別自己能處理的URI
	 */
	private static final UriMatcher uriMatcher;
	private DBHelper dbHelper;
	static {
		//添加自己能處理的URI
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		uriMatcher.addURI(People.AUTHORITY, People.Man.TABLE_NAME, 0);
	}

	@Override
	public boolean onCreate() {
		// TODO Auto-generated method stub
		dbHelper = new DBHelper(this.getContext(), People.DB_NAME, null,
				People.VERSION);
		return true;
	}

	@Override
	public Uri insert(Uri arg0, ContentValues arg1) {
		// TODO Auto-generated method stub\
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		long id = -1;
		switch (uriMatcher.match(arg0)) {
		case 0:
			id = db.insert(People.Man.TABLE_NAME, null, arg1);
			if (id > 0) {
				this.getContext().getContentResolver().notifyChange(arg0, null);
				return ContentUris.withAppendedId(People.Man.Content_URI, id);
			}
			break;
		}
		return null;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		// TODO Auto-generated method stub
		SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
		SQLiteDatabase db = dbHelper.getReadableDatabase();
		Cursor c = null;
		switch (uriMatcher.match(uri)) {
		case 0:
			qb.setTables(People.Man.TABLE_NAME);
			c = qb.query(db, projection, selection, selectionArgs, null, null,
					sortOrder);
			c.setNotificationUri(getContext().getContentResolver(), uri);

			break;
		}
		return c;
	}

	@Override
	public int delete(Uri arg0, String arg1, String[] arg2) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		// TODO Auto-generated method stub
		return 0;
	}

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

	/**
	 * 因爲一個程序只需要一個數據庫 所以一一個內部類的形式實現 這DB類控制了程序的表結構,更新
	 * 
	 * @author infinity
	 * 
	 */
	private class DBHelper extends SQLiteOpenHelper {

		public DBHelper(Context context, String name, CursorFactory factory,
				int version) {
			super(context, name, factory, version);
			// TODO Auto-generated constructor stub
		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			// TODO Auto-generated method stub
			db.execSQL(String
					.format("create table %s ( %s integer primary key autoincrement ,%s varchar(10),%s varchar(10),%s varchar(2) ) ",
							People.Man.TABLE_NAME, People.Man._ID,
							People.Man.NAME, People.Man.AGE, People.Man.SEX));
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			// TODO Auto-generated method stub
		}

	}

}

上邊偷下了懶 只實現了 增加和查詢,其他方法類似

第三部:
 註冊Provider並把第一步中的類結構寫入 android:authorities屬性裏
 <provider android:name="MyProvider"
            android:authorities="com.nsw.android.provide.People"></provider>

完事,剩下就是再建一個工程,訪問上面工程裏的數據庫了。
把第一步中People類考入 這工程的任意目錄(想訪問別人的數據庫,你必須先知道表結構不是);

訪問很簡單
@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		ContentResolver cr=this.getContentResolver();
		//添加數據
		ContentValues cv=new ContentValues();
		cv.put(People.Man.NAME, "小倪");
		cv.put(People.Man.AGE, "23");
		cv.put(People.Man.SEX,"男");
		cr.insert(People.Man.Content_URI, cv);
		//查詢數據
	    Cursor cs=cr.query(People.Man.Content_URI, new String[]{People.Man.NAME},"age = '23'", null, "age desc");
		TextView tv=(TextView) this.findViewById(R.id.tv);
		tv.setText(cs.getColumnCount()+"");
	}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章