这个ContentProvider的样例,在一个db数据库中,有二个TAB(分别是:programmer,leader),分别提供了对每个表的增,删,改,查操作,但是在这个例子中,我们没有采用AsyncQueryHandler来异步对db数据库的数据进行增,删,改,查操作,其实这原理和样例一是相同的,大家可以参考使用就OK了。
1.效果图:
2.详细代码:
(1)LeaderInfo.java
package com.example.testcontentprovider02;
public class LeaderInfo {
public String name;
public String title;
public int level;
public LeaderInfo(String name,String title,int level){
this.name = name;
this.title = title;
this.level = level;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public void setTitle(String title){
this.title = title;
}
public String getTitle(){
return title;
}
public void setLevel(int level){
this.level = level;
}
public int getLevel(){
return level;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString()+"--name:"+name+"--title:"+title+"--level:"+level;
}
}
(2)ProgrammerInfo.java
package com.example.testcontentprovider02;
public class ProgrammerInfo {
public String name;
public int age;
public ProgrammerInfo(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString()+"--name:"+name+"--age:"+age;
}
}
(3)DatabaseHelper.java
package com.example.testcontentprovider02;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "db_demo.db";
private static final int DATABASE_VERSION = 1;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + Provider.ProgrammerColumns.TABLE_NAME + " ("
+ Provider.ProgrammerColumns._ID + " INTEGER PRIMARY KEY,"
+ Provider.ProgrammerColumns.NAME + " TEXT,"
+ Provider.ProgrammerColumns.AGE + " INTEGER"
+ ");");
db.execSQL("CREATE TABLE " + Provider.LeaderColumns.TABLE_NAME + " ("
+ Provider.LeaderColumns._ID + " INTEGER PRIMARY KEY,"
+ Provider.LeaderColumns.NAME + " TEXT,"
+ Provider.LeaderColumns.TITLE + " TEXT,"
+ Provider.LeaderColumns.LEVEL + " INTEGER"
+ ");");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + Provider.ProgrammerColumns.TABLE_NAME);
db.execSQL("DROP TABLE IF EXISTS " + Provider.LeaderColumns.TABLE_NAME);
onCreate(db);
}
}
(4)Provider.java
package com.example.testcontentprovider02;
import android.net.Uri;
import android.provider.BaseColumns;
public class Provider{
public static final String AUTHORITY = "com.android.provider.demo.common";
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.android.demo";
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.android.demo";
public static final class ProgrammerColumns implements BaseColumns {
public static final Uri CONTENT_URI = Uri.parse("content://"+ AUTHORITY +"/programmers");
public static final String TABLE_NAME = "programmer";
public static final String DEFAULT_SORT_ORDER = "age desc";
public static final String NAME = "name";
public static final String AGE = "age";
}
public static final class LeaderColumns implements BaseColumns {
public static final Uri CONTENT_URI = Uri.parse("content://"+ AUTHORITY +"/leaders");
public static final String TABLE_NAME = "leader";
public static final String DEFAULT_SORT_ORDER = "level desc";
public static final String NAME = "name";
public static final String TITLE = "title";
public static final String LEVEL = "level";
}
}
(5)CommonProvider.java
package com.example.testcontentprovider02;
import java.util.HashMap;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
public class CommonProvider extends ContentProvider{
private static HashMap<String, String> sprogrammersProjectionMap;
private static final UriMatcher sUriMatcher;
private DatabaseHelper mOpenHelper;
private static final int PROGRAMMERS = 1;
private static final int PROGRAMMERS_ID = 2;
private static final int LEADERS = 3;
private static final int LEADERS_ID = 4;
static {
sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sUriMatcher.addURI(Provider.AUTHORITY, "programmers", PROGRAMMERS);
sUriMatcher.addURI(Provider.AUTHORITY, "programmers/#", PROGRAMMERS_ID);
sUriMatcher.addURI(Provider.AUTHORITY, "leaders", LEADERS);
sUriMatcher.addURI(Provider.AUTHORITY, "leaders/#", LEADERS_ID);
sprogrammersProjectionMap = new HashMap<String, String>();
sprogrammersProjectionMap.put(Provider.ProgrammerColumns._ID, Provider.ProgrammerColumns._ID);
sprogrammersProjectionMap.put(Provider.ProgrammerColumns.NAME, Provider.ProgrammerColumns.NAME);
sprogrammersProjectionMap.put(Provider.ProgrammerColumns.AGE, Provider.ProgrammerColumns.AGE);
sprogrammersProjectionMap.put(Provider.LeaderColumns._ID, Provider.LeaderColumns._ID);
sprogrammersProjectionMap.put(Provider.LeaderColumns.NAME, Provider.LeaderColumns.NAME);
sprogrammersProjectionMap.put(Provider.LeaderColumns.TITLE, Provider.LeaderColumns.TITLE);
sprogrammersProjectionMap.put(Provider.LeaderColumns.LEVEL, Provider.LeaderColumns.LEVEL);
}
@Override
public boolean onCreate() {
mOpenHelper = new DatabaseHelper(getContext());
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
String orderBy;
switch (sUriMatcher.match(uri)) {
case LEADERS:
case LEADERS_ID:
qb.setTables(Provider.LeaderColumns.TABLE_NAME);
// If no sort order is specified use the default
if (TextUtils.isEmpty(sortOrder)) {
orderBy = Provider.LeaderColumns.DEFAULT_SORT_ORDER;
} else {
orderBy = sortOrder;
}
break;
case PROGRAMMERS:
case PROGRAMMERS_ID:
qb.setTables(Provider.ProgrammerColumns.TABLE_NAME);
// If no sort order is specified use the default
if (TextUtils.isEmpty(sortOrder)) {
orderBy = Provider.ProgrammerColumns.DEFAULT_SORT_ORDER;
} else {
orderBy = sortOrder;
}
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
switch (sUriMatcher.match(uri)) {
case LEADERS:
case PROGRAMMERS:
qb.setProjectionMap(sprogrammersProjectionMap);
break;
case PROGRAMMERS_ID:
qb.setProjectionMap(sprogrammersProjectionMap);
qb.appendWhere(Provider.ProgrammerColumns._ID + "=" + uri.getPathSegments().get(1));
break;
case LEADERS_ID:
qb.setProjectionMap(sprogrammersProjectionMap);
qb.appendWhere(Provider.LeaderColumns._ID + "=" + uri.getPathSegments().get(1));
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
// Get the database and run the query
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
// Tell the cursor what uri to watch, so it knows when its source data changes
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
@Override
public String getType(Uri uri) {
switch (sUriMatcher.match(uri)) {
case LEADERS:
case PROGRAMMERS:
return Provider.CONTENT_TYPE;
case PROGRAMMERS_ID:
case LEADERS_ID:
return Provider.CONTENT_ITEM_TYPE;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
}
@Override
public Uri insert(Uri uri, ContentValues initialValues) {
ContentValues values;
if (initialValues != null) {
values = new ContentValues(initialValues);
} else {
values = new ContentValues();
}
String tableName = "";
String nullColumn = "";
switch (sUriMatcher.match(uri)) {
case LEADERS:
tableName = Provider.LeaderColumns.TABLE_NAME;
nullColumn = Provider.LeaderColumns.NAME;
// Make sure that the fields are all set
if (values.containsKey(Provider.LeaderColumns.NAME) == false) {
values.put(Provider.LeaderColumns.NAME, "");
}
if (values.containsKey(Provider.LeaderColumns.TITLE) == false) {
values.put(Provider.LeaderColumns.TITLE, "");
}
if (values.containsKey(Provider.LeaderColumns.LEVEL) == false) {
values.put(Provider.LeaderColumns.LEVEL, 0);
}
break;
case PROGRAMMERS:
tableName = Provider.ProgrammerColumns.TABLE_NAME;
nullColumn = Provider.ProgrammerColumns.NAME;
// Make sure that the fields are all set
if (values.containsKey(Provider.ProgrammerColumns.NAME) == false) {
values.put(Provider.ProgrammerColumns.NAME, "");
}
if (values.containsKey(Provider.ProgrammerColumns.AGE) == false) {
values.put(Provider.ProgrammerColumns.AGE, 0);
}
break;
default:
// Validate the requested uri
throw new IllegalArgumentException("Unknown URI " + uri);
}
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
long rowId = db.insert(tableName, nullColumn, values);
if (rowId > 0) {
Uri noteUri = ContentUris.withAppendedId(uri, rowId);
getContext().getContentResolver().notifyChange(noteUri, null);
return noteUri;
}
throw new SQLException("Failed to insert row into " + uri);
}
@Override
public int delete(Uri uri, String where, String[] whereArgs) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int count;
switch (sUriMatcher.match(uri)) {
case PROGRAMMERS:
count = db.delete(Provider.ProgrammerColumns.TABLE_NAME, where, whereArgs);
break;
case PROGRAMMERS_ID:
String programmerId = uri.getPathSegments().get(1);
count = db.delete(Provider.ProgrammerColumns.TABLE_NAME, Provider.ProgrammerColumns._ID + "=" + programmerId
+ (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
break;
case LEADERS:
count = db.delete(Provider.LeaderColumns.TABLE_NAME, where, whereArgs);
break;
case LEADERS_ID:
String leaderId = uri.getPathSegments().get(1);
count = db.delete(Provider.LeaderColumns.TABLE_NAME, Provider.LeaderColumns._ID + "=" + leaderId
+ (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int count;
switch (sUriMatcher.match(uri)) {
case PROGRAMMERS:
count = db.update(Provider.ProgrammerColumns.TABLE_NAME, values, where, whereArgs);
break;
case PROGRAMMERS_ID:
String noteId = uri.getPathSegments().get(1);
count = db.update(Provider.ProgrammerColumns.TABLE_NAME, values, Provider.ProgrammerColumns._ID + "=" + noteId
+ (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
break;
case LEADERS:
count = db.update(Provider.LeaderColumns.TABLE_NAME, values, where, whereArgs);
break;
case LEADERS_ID:
String leaderId = uri.getPathSegments().get(1);
count = db.update(Provider.LeaderColumns.TABLE_NAME, values, Provider.LeaderColumns._ID + "=" + leaderId
+ (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
}
(6)MainActivity.java
package com.example.testcontentprovider02;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.app.Activity;
import android.content.ContentValues;
public class MainActivity extends Activity implements OnClickListener {
private Button myInserBt_table_progra = null;
private Button myDeleBt_table_progra = null;
private Button myUpdateBt_table_progra = null;
private Button myQueryBt_table_progra = null;
private Button myInserBt_table_leader = null;
private Button myDeleBt_table_leader = null;
private Button myUpdateBt_table_leader = null;
private Button myQueryBt_table_leader = null;
private Controller myController = null;
private LeaderInfo myLeader = null;
private ProgrammerInfo myProgrammer = null;
private int i = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
// TODO Auto-generated method stub
myInserBt_table_progra = (Button)findViewById(R.id.myInserBt_table_progra);
myInserBt_table_progra.setOnClickListener(this);
myDeleBt_table_progra = (Button)findViewById(R.id.myDeleBt_table_progra);
myDeleBt_table_progra.setOnClickListener(this);
myUpdateBt_table_progra = (Button)findViewById(R.id.myUpdateBt_table_progra);
myUpdateBt_table_progra.setOnClickListener(this);
myQueryBt_table_progra = (Button)findViewById(R.id.myQueryBt_table_progra);
myQueryBt_table_progra.setOnClickListener(this);
myInserBt_table_leader = (Button)findViewById(R.id.myInserBt_table_leader);
myInserBt_table_leader.setOnClickListener(this);
myDeleBt_table_leader = (Button)findViewById(R.id.myDeleBt_table_leader);
myDeleBt_table_leader.setOnClickListener(this);
myUpdateBt_table_leader = (Button)findViewById(R.id.myUpdateBt_table_leader);
myUpdateBt_table_leader.setOnClickListener(this);
myQueryBt_table_leader = (Button)findViewById(R.id.myQueryBt_table_leader);
myQueryBt_table_leader.setOnClickListener(this);
myController = new Controller(this);
}
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
if(view == myInserBt_table_progra){
Log.i(Controller.TAG, "onClick--myInserBt_table_progra");
myProgrammer = new ProgrammerInfo("name_programmer_"+i, 20);
myController.onInSertDateProgrammerLister(myProgrammer);
}else if(view == myDeleBt_table_progra){
Log.i(Controller.TAG, "onClick--myDeleBt_table_progra");
String[] deleteValue = {"name_programmer_0"};
String where = "name";
myController.onDeleteDateProgrammerLister(where,deleteValue);
}else if(view == myUpdateBt_table_progra){
Log.i(Controller.TAG, "onClick--myUpdateBt_table_progra");
ContentValues values = new ContentValues();
values.put(Provider.ProgrammerColumns.NAME, "testUpdate");
values.put(Provider.ProgrammerColumns.AGE,39);
String where = "name";
String[] selectValue = {"name_programmer_0"};
myController.onUpdateDateProgrammerLister(values,where,selectValue);
}else if(view == myQueryBt_table_progra){
Log.i(Controller.TAG, "onClick--myQueryBt_table_progra");
myController.onQueryDateProgrammerLister();
}else if(view == myInserBt_table_leader){
Log.i(Controller.TAG, "onClick--myInserBt_table_leader");
myLeader = new LeaderInfo("name_leader_"+i,"super_major",30);
myController.onInSertDateLeaderLister(myLeader);
}else if(view == myDeleBt_table_leader){
Log.i(Controller.TAG, "onClick--myDeleBt_table_leader");
String[] deleteValue = {"name_leader_0"};
String where = "name";
myController.onDeleteDateLeaderLister(where, deleteValue);
}else if(view == myUpdateBt_table_leader){
Log.i(Controller.TAG, "onClick--myUpdateBt_table_leader");
ContentValues values = new ContentValues();
values.put(Provider.LeaderColumns.NAME, "update_leader_name");
values.put(Provider.LeaderColumns.TITLE, "update_title_super");
values.put(Provider.LeaderColumns.LEVEL,40);
String where = "name";
String[] selectValue = {"name_leader_0"};
myController.onUpdateDateLeaderLister(values,where,selectValue);
}else if(view == myQueryBt_table_leader){
Log.i(Controller.TAG, "onClick--myQueryBt_table_leader");
myController.onQueryDateLeaderLister();
}
}
}
(7)Controller.java
package com.example.testcontentprovider02;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
public class Controller{
public static final String TAG = "TestContentProvider02";
private Context myContext = null;
private String[] PROGRAMMER_PROJECTION = new String[] {
Provider.ProgrammerColumns._ID, // 0
Provider.ProgrammerColumns.NAME, // 1
Provider.ProgrammerColumns.AGE // 2
};
private String[] LEADER_PROJECTION = new String[] {
Provider.LeaderColumns._ID, // 0
Provider.LeaderColumns.NAME, // 1
Provider.LeaderColumns.TITLE, // 2
Provider.LeaderColumns.LEVEL // 3
};
public Controller(Context myContext){
this.myContext = myContext;
}
public void onQueryDateLeaderLister() {
// TODO Auto-generated method stub
Log.i(TAG, "Controller--onQueryDateLeaderLister");
Cursor cursor = myContext.getContentResolver().query(Provider.LeaderColumns.CONTENT_URI,
LEADER_PROJECTION, null, null,Provider.LeaderColumns.DEFAULT_SORT_ORDER);
if (cursor.moveToFirst()) {
for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToPosition(i);
String name = cursor.getString(1);
String title = cursor.getString(2);
int level = cursor.getInt(3);
Log.i(TAG, "db第"+i+"个数据:"+"--name:"+name+"--title"+title+"--level:"+level);
}
}
cursor.close();
}
public void onInSertDateLeaderLister(LeaderInfo myLeader) {
// TODO Auto-generated method stub
Log.i(TAG, "Controller--onInSertDateLeaderLister");
ContentValues values = new ContentValues();
values.put(Provider.LeaderColumns.NAME, myLeader.name);
values.put(Provider.LeaderColumns.TITLE, myLeader.title);
values.put(Provider.LeaderColumns.LEVEL, myLeader.level);
Uri uri = myContext.getContentResolver().insert(Provider.LeaderColumns.CONTENT_URI, values);
String lastPath = uri.getLastPathSegment();
if (TextUtils.isEmpty(lastPath)) {
Log.i(TAG, "insert failure!");
} else {
Log.i(TAG, "insert success! the id is:" + lastPath);
}
}
public void onDeleteDateLeaderLister(String where, String[] deleteValue) {
// TODO Auto-generated method stub
Log.i(TAG, "Controller--onDeleteDateLeaderLister");
// 删除ID为1的记录的方法:
//Uri uri = ContentUris.withAppendedId(Provider.LeaderColumns.CONTENT_URI, 1);
//myContext.getContentResolver().delete(uri, null, null);
myContext.getContentResolver().delete(Provider.LeaderColumns.CONTENT_URI, where+"=?", deleteValue);
Log.i(TAG, "delete data:"+"--where:"+where+"--deleteValue:"+deleteValue);
}
public void onUpdateDateLeaderLister(ContentValues values, String where, String[] selectValue) {
// TODO Auto-generated method stub
Log.i(TAG, "Controller--onUpdateDateLeaderLister");
// 更新ID为1的记录
//Uri uri = ContentUris.withAppendedId(Provider.LeaderColumns.CONTENT_URI, 1);
//myContext.getContentResolver().update(uri, values, null, null);
//getContentResolver().update(uri, values, "name"+"=?", selectValue);
myContext.getContentResolver().update(Provider.LeaderColumns.CONTENT_URI, values, where+"=?", selectValue);
}
public void onInSertDateProgrammerLister(ProgrammerInfo myprogrammer) {
// TODO Auto-generated method stub
ContentValues values = new ContentValues();
values.put(Provider.ProgrammerColumns.NAME, myprogrammer.name);
values.put(Provider.ProgrammerColumns.AGE, myprogrammer.age);
Uri uri = myContext.getContentResolver().insert(Provider.ProgrammerColumns.CONTENT_URI, values);
String lastPath = uri.getLastPathSegment();
if (TextUtils.isEmpty(lastPath)) {
Log.i(TAG, "insert failure!");
} else {
Log.i(TAG, "insert success! the id is:" + lastPath);
}
}
public void onDeleteDateProgrammerLister(String where, String[] deleteValue) {
// TODO Auto-generated method stub
// 删除ID为1的记录的方法:
//Uri uri = ContentUris.withAppendedId(Provider.ProgrammerColumns.CONTENT_URI, 1);
//myContext.getContentResolver().delete(uri, null, null);
myContext.getContentResolver().delete(Provider.ProgrammerColumns.CONTENT_URI, where+"=?", deleteValue);
Log.i(TAG, "delete data:"+"--where:"+where+"--deleteValue:"+deleteValue);
}
public void onUpdateDateProgrammerLister(ContentValues values, String where, String[] selectValue) {
// TODO Auto-generated method stub
// 更新ID为1的记录
//Uri uri = ContentUris.withAppendedId(Provider.ProgrammerColumns.CONTENT_URI, 1);
//myContext.getContentResolver().update(uri, values, null, null);
//getContentResolver().update(uri, values, "name"+"=?", selectValue);
myContext.getContentResolver().update(Provider.ProgrammerColumns.CONTENT_URI, values, where+"=?", selectValue);
}
public void onQueryDateProgrammerLister() {
// TODO Auto-generated method stub
Cursor cursor = myContext.getContentResolver().query(Provider.ProgrammerColumns.CONTENT_URI,
PROGRAMMER_PROJECTION, null, null,Provider.ProgrammerColumns.DEFAULT_SORT_ORDER);
if (cursor.moveToFirst()) {
for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToPosition(i);
String name = cursor.getString(1);
int age = cursor.getInt(2);
Log.i(TAG, "db第"+i+"个数据:"+"--name:"+name+"--age:"+age);
}
}
cursor.close();
}
}
(8)activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:id="@+id/myInserBt_table_progra"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="表programmer-插入数据" />
<Button
android:id="@+id/myDeleBt_table_progra"
android:layout_below="@id/myInserBt_table_progra"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="表programmer-删除数据" />
<Button
android:id="@+id/myUpdateBt_table_progra"
android:layout_below="@id/myDeleBt_table_progra"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="表programmer-更新数据" />
<Button
android:id="@+id/myQueryBt_table_progra"
android:layout_below="@id/myUpdateBt_table_progra"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="表programmer-查询数据" />
<Button
android:id="@+id/myInserBt_table_leader"
android:layout_below="@id/myQueryBt_table_progra"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="表leader-插入数据" />
<Button
android:id="@+id/myDeleBt_table_leader"
android:layout_below="@id/myInserBt_table_leader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="表leader-删除数据" />
<Button
android:id="@+id/myUpdateBt_table_leader"
android:layout_below="@id/myDeleBt_table_leader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="表leader-更新数据" />
<Button
android:id="@+id/myQueryBt_table_leader"
android:layout_below="@id/myUpdateBt_table_leader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="表leader-查询数据" />
</RelativeLayout>
</ScrollView>
</RelativeLayout>
(9)androidmanifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testcontentprovider02"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.testcontentprovider02.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider android:name=".CommonProvider"
android:authorities="com.android.provider.demo.common" />
</application>
</manifest>
3.代码下载地址:
4.参考文献:
(1).android 玩转ContentProvider之三--实现一个ContentProvider对多张表进行操作
http://blog.youkuaiyun.com/maylian7700/article/details/7365433
(2).ContentProvider-----一个完整的样例(一)
http://blog.youkuaiyun.com/hfreeman2011/article/details/8556445