閒來無事用下 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:name="MyProvider"
android:authorities="com.nsw.android.provide.People"></provider>
完事,剩下就是再建一個工程,訪問上面工程裏的數據庫了。
@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()+"");
}