对于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()
方法来调用contentprovider
的query()
方法,然后将返回的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
了。