用到了四个类:
class MainActivity extends Activity;
class DatabaseHelper extends SQLiteOpenHelper;
class MyMetaData;
class MyCP extends ContentProvider;
一、MainActivity:
package com.example.contentprovider; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import com.example.contentprovider.MyMetaData.UserTableMetaData; public class MainActivity extends Activity { Button insert,query; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); insert = (Button) findViewById(R.id.insert); insert.setOnClickListener(new InsertListener()); query = (Button) findViewById(R.id.query); query.setOnClickListener(new QueryListener()); } class InsertListener implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub ContentValues values = new ContentValues(); values.put(UserTableMetaData.USER_NAME, "michal"); Uri uri = getContentResolver().insert( UserTableMetaData.CONTENT_URI, values); System.out.println("uri--->" + uri.toString()); } } class QueryListener implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub Cursor c = getContentResolver().query( UserTableMetaData.CONTENT_URI, null, null, null, null); while (c.moveToNext()) { System.out.println(c.getString(c.getColumnIndex(UserTableMetaData.USER_NAME))); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
二、DatabaseHelper extends SQLiteOpenHelper
package com.example.contentprovider; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DatabaseHelper extends SQLiteOpenHelper{ public DatabaseHelper(Context context) { super(context, MyMetaData.DATABASE_NAME, null, MyMetaData.DATABASE_VERSION); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub String sql = "CREATE TABLE "+MyMetaData.UserTableMetaData.TABLE_NAME+" (_id INTEGER PRIMARY KEY AUTOINCREMENT, "+MyMetaData.UserTableMetaData.USER_NAME+" VARCHAR)"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } }
三、MyMetaData
package com.example.contentprovider; import android.net.Uri; import android.provider.BaseColumns; public class MyMetaData { // 继承了contentprovider的类的全名 public static final String AUTHORITY = "com.example.contentprovider.mycp"; // 数据库名称 public static final String DATABASE_NAME = "FirstProvider.db"; // 数据库的版本 public static final int DATABASE_VERSION = 1; // 静态内部类创建一个表 public static final class UserTableMetaData implements BaseColumns { // 表名 public static final String TABLE_NAME = "users"; // 访问该ContentProvider的表的URI public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_NAME); //规定 public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.mycp.user"; public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.mycp.user"; // 列名,在users表中添加一个名为name的列 public static final String USER_NAME = "name"; // 默认排序方式 public static final String DEFAULT_SORT_ORDER = "_id desc"; } }
四、MyCP extends ContentProvider
package com.example.contentprovider; 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; import com.example.contentprovider.MyMetaData.UserTableMetaData; public class MyCP extends ContentProvider { public static final UriMatcher uriMatcher; // 下面定义两个规则 public static final int INCOMING_USER_COLLECTION = 1; public static final int INCOMING_USER_SINGLE = 2; private DatabaseHelper dh; static { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);// 不匹配根目录 // 多条 uriMatcher.addURI(MyMetaData.AUTHORITY, "users",INCOMING_USER_COLLECTION); // 单条 uriMatcher.addURI(MyMetaData.AUTHORITY, "users/#", INCOMING_USER_SINGLE); } // 有点类似于sql里面表的别名,这个也是给列其别名,必须要用 // 列的别名还是原来的名,没必要修改 public static HashMap<String, String> userProjectionMap; static { userProjectionMap = new HashMap<String, String>(); userProjectionMap.put(UserTableMetaData._ID, UserTableMetaData._ID); userProjectionMap.put(UserTableMetaData.USER_NAME,UserTableMetaData.USER_NAME); } @Override public boolean onCreate() { // TODO Auto-generated method stub //getContext得到当前正在运行着的context dh = new DatabaseHelper(getContext()); System.out.println("on create --> dh = new DatabaseHelper(getContext())"); return true; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub System.out.println("getType-->"); switch (uriMatcher.match(uri)) { case INCOMING_USER_COLLECTION: return UserTableMetaData.CONTENT_TYPE; case INCOMING_USER_SINGLE: return UserTableMetaData.CONTENT_TYPE_ITEM; default: throw new IllegalArgumentException("Unknown uri" + uri); } } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub System.out.println("query"); //创建一个查询的语句 SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); //设置查询哪张表 qb.setTables(UserTableMetaData.TABLE_NAME); qb.setProjectionMap(userProjectionMap); switch(uriMatcher.match(uri)){ case INCOMING_USER_COLLECTION: break; case INCOMING_USER_SINGLE: //添加where条件,getPathSegments:得到uri的path部分content:XXX/user/1,get(1)得到1 qb.appendWhere(UserTableMetaData._ID+"="+uri.getPathSegments().get(1)); break; } String orderBy; if(TextUtils.isEmpty(sortOrder)){ orderBy = UserTableMetaData.DEFAULT_SORT_ORDER; } else { orderBy = sortOrder; } SQLiteDatabase db = dh.getWritableDatabase(); //下面的query使用qb这个对象 Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy); //也是通知下 c.setNotificationUri(getContext().getContentResolver(), uri); return c; } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub System.out.println("insert-->"); SQLiteDatabase db = dh.getWritableDatabase(); long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values); if(rowId>0){ //将rowId追加到后面 //contentUris:用来处理Uri的工具类 Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId); //通知监听器,数据已经改变 getContext().getContentResolver().notifyChange(insertedUserUri, null); return insertedUserUri; } throw new SQLException("Failed to insert row into "+uri); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // 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; } }
最后记得在AndroidManifest.xml里配置:
<provider android:name="com.example.contentprovider.MyCP" android:authorities="com.example.contentprovider.mycp"> </provider>