对于ContentProvider,我想大家应该都不算陌生,因为它是android四大组件之一,相对而言,它比activity和service要简单挺多,这个contentprovider
的作用就是实现各个应用程序之间的(跨应用)数据共享,比如联系人应用中就使用了ContentProvider,你在自己的应用中可以读取和修改联系人的数据,
不过需要获得相应的权限。其实它也只是一个中间人,真正的数据源是文件或者SQLite等。那么我们直接开始自定义自己的contentprovider
1.我们先定义一个类来继承contentprovider,然后复写它的方法,在这里我就复写了一下query()方法,代码如下:

public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {
    // TODO Auto-generated method stub
    mySqliteOpenHelper =new MySqliteOpenHelper(getContext(), "myDataBase", null, 1);
    sqLiteDatabase=mySqliteOpenHelper.getReadableDatabase();
    cursor=sqLiteDatabase.query("user", null, null, null, null, null, null);
    return cursor;
}

其中数据库myDataBase我已经建好,表也建好并且插入了数据,由于我们这里只是说contentprovider的自定义,就不赘述sqlite的用法了,这个
方法返回的是一个cursor对象,这样的话,contentprovider就算建好了,接下来我们要在Manifest文件中声明这个contentprovider,代码如下:

<provider android:exported="true" android:multiprocess="true" 
android:authorities="com.example.android_textsqlit.MyContentProvider" 
android:name=".MyContentProvider"> </provider>

其中authorities就是你的contentprovider的地址,这里需要说明一下,contentprovider是在你这个应用程序安装的时候就会注册到providerManager
中,这就像是有一个链表,其中放着很多的URI,当你使用contentResolver去调用这个contentprovider时的各个方法时,就会通过传入的URI来
寻找到对应的进程,然后启动这个进程(注意是进程,而不是包括这个进程的整个应用程序),这里的启动是通过contentprovider来启动的,而不是通过mainactivity来启动,启动之后,当我们的
contentprovider用完之后,客户端也退出后,服务器端(也就是contentprovider)就会变为emptyprocess,等待回收。
2.我们创建一个客户端来调用contentprovider,主要代码如下:

public void LinkContentProvider(){
ContentResolver _resolver=getContentResolver();
Log.i("Logcat", "Link");
cursor = _resolver.query(Uri.parse("content://com.example.android_textsqlit.MyContentProvider/user"), null, null, null, null);
Log.i("Logcat", "Link1");

}
这是得到contentresolver对象,并且通过resolver对象的query()方法来调用contentproviderquery()方法,然后将返回的cursor对象赋值给
变量cursor,得到cursor后就很好办了。代码如下:

public void Show(View v){
 list=new ArrayList<HashMap<String,String>>();
 while(cursor.moveToNext()){
     map=new HashMap<String, String>();
     int userid=cursor.getInt(cursor.getColumnIndex("userid"));
     String username=cursor.getString(cursor.getColumnIndex("username"));
     map.put("userid", ""+userid);
     map.put("username", username);
     list.add(map);
 }
 SimpleAdapter simpleAdapter=new SimpleAdapter(MainActivity.this, list, android.R.layout.simple_list_item_2, new String[]{"userid","username"}, new int[]{android.R.id.text1,android.R.id.text2});
 myListView.setAdapter(simpleAdapter);

}
这样就将内容显示在了listview上,这里说一下我为什么不使用SimpleCursorAdapter,因为使用SimpleCursorAdapter必须要求主键为_id,而
我定义表的时候主键不是这样的,所以我就只好用 SimpleAdapter了。
这样我们就实现了简单的自定义的contentprovider了。