ContentProvider作为Android的四大存储方式之一,有着广泛的应用性,它暴露了数据地址,可以让其他应用访问数据,可以用于存储图片、通讯录等信息,这篇博文将详细介绍ContentProvider、URIMatcher,LoaderManager,cursorAdapter的方法使用与介绍。使用ContentProvider的时候一定要注意在manifest清单文件中像Acticity文件一样,声明其属性。如图所示
此外因为我们是用loadermanager来加载数据,MainAcitivity类要实现LoaderCallback接口。按照惯例我们还是看下谷歌官方文档对contentprovider的解释,ContentProvider管理一个结构化的数据集。它封装了数据,并提供定义数据安全机制。ContentProvider的标准接口实现多线程机制来连接数据,一般是用loaderManager异步加载数据。当你想要访问数据在一个ContentProvider,我们使用ContentResolver对象在应用程序的上下文中作为沟通方法。ContentResolver用来解析请求码返还数据。
我们先看看一下本次介绍的工程的目录结构
MainActivity的代码
01.
package
com.example.f14_contentprovider;
02.
03.
import
java.util.ArrayList;
04.
import
java.util.HashMap;
05.
import
java.util.List;
06.
07.
import
android.net.Uri;
08.
import
android.os.Bundle;
09.
import
android.app.Activity;
10.
import
android.app.LoaderManager;
11.
import
android.app.LoaderManager.LoaderCallbacks;
12.
import
android.content.ContentResolver;
13.
import
android.content.ContentValues;
14.
import
android.content.CursorLoader;
15.
import
android.content.Loader;
16.
import
android.database.Cursor;
17.
import
android.view.Menu;
18.
import
android.view.View;
19.
import
android.widget.Button;
20.
import
android.widget.ListView;
21.
import
android.widget.SimpleCursorAdapter;
22.
23.
public
class
MainActivity
extends
Activity
implements
LoaderCallbacks {
24.
private
Button button;
25.
private
ListView listView;
26.
private
LoaderManager loaderManager;
27.
private
SimpleCursorAdapter adapter;
28.
29.
@Override
30.
protected
void
onCreate(Bundle savedInstanceState) {
31.
super
.onCreate(savedInstanceState);
32.
setContentView(R.layout.activity_main);
33.
button = (Button)
this
.findViewById(R.id.button1);
34.
listView = (ListView)
this
.findViewById(R.id.listView1);
35.
button.setOnClickListener(
new
View.OnClickListener() {
36.
37.
@Override
38.
public
void
onClick(View v) {
39.
// TODO Auto-generated method stub
40.
ContentResolver resolver = getContentResolver();
41.
Uri uri = Uri
42.
.parse(
"content://com.example.f14_contentprovider.PersonContentProvider/person"
);
43.
ContentValues values =
new
ContentValues();
44.
values.put(
"name"
,
"jack"
);
45.
values.put(
"address"
,
"hangzhou"
);
46.
resolver.insert(uri, values);
47.
loaderManager.restartLoader(
1001
,
null
, MainActivity.
this
);
48.
}
49.
});
50.
loaderManager = getLoaderManager();
51.
loaderManager.initLoader(
1001
,
null
,
this
);
52.
}
53.
54.
55.
56.
@Override
57.
public
Loader onCreateLoader(
int
id, Bundle args) {
58.
// TODO Auto-generated method stub
59.
/**
60.
* CursorLoader该类用于加载程序,查询ContentResolver并返回一个指针。这个类实现了装载机协议查询游标的标准方法,
61.
* 基于AsyncTaskLoader执行游标查询在一个后台线程,以便它不会阻止应用程序的UI。
62.
*/
63.
CursorLoader loader =
new
CursorLoader(
this
);
64.
Uri uri = Uri
65.
.parse(
"content://com.example.f14_contentprovider.PersonContentProvider/person"
);
66.
loader.setUri(uri);
67.
loader.setProjection(
new
String[] {
"name"
,
"address"
});
68.
return
loader;
69.
}
70.
71.
@SuppressWarnings
(
"deprecation"
)
72.
@Override
73.
public
void
onLoadFinished(Loader arg0, Cursor arg1) {
74.
// TODO Auto-generated method stub
75.
List> list =
new
ArrayList>();
76.
// 加载数据
77.
while
(arg1.moveToNext()) {
78.
HashMap map =
new
HashMap();
79.
map.put(
"name"
, arg1.getString(arg1.getColumnIndex(
"name"
)));
80.
map.put(
"address"
, arg1.getString(arg1.getColumnIndex(
"address"
)));
81.
list.add(map);
82.
}
83.
adapter =
new
SimpleCursorAdapter(
this
, R.layout.item, arg1,
84.
new
String[] {
"name"
,
"address"
},
new
int
[] { R.id.textView1,
85.
R.id.textView2 });
86.
listView.setAdapter(adapter);
87.
adapter.notifyDataSetChanged();
// 若内容发生变化 触发该方法
88.
}
89.
90.
@Override
91.
public
void
onLoaderReset(Loader arg0) {
92.
// TODO Auto-generated method stub
93.
94.
}
95.
96.
}
001.
package
com.example.f14_contentprovider;
002.
003.
import
android.content.ContentProvider;
004.
import
android.content.ContentResolver;
005.
import
android.content.ContentUris;
006.
import
android.content.ContentValues;
007.
import
android.content.UriMatcher;
008.
import
android.database.Cursor;
009.
import
android.database.sqlite.SQLiteDatabase;
010.
import
android.net.Uri;
011.
012.
//要在manifest文件中注册provider
013.
public
class
PersonContentProvider
extends
ContentProvider {
014.
private
MyOpenHelper helper;
015.
private
static
final
UriMatcher matcher =
new
UriMatcher(
016.
UriMatcher.NO_MATCH);
// 专门用来匹配URI的类
017.
private
static
final
int
PERSONS =
1
;
018.
private
static
final
int
PERSON =
2
;
019.
private
ContentResolver resolver;
020.
static
{
021.
matcher.addURI(
"com.example.f14_contentprovider.PersonContentProvider"
,
022.
"person"
, PERSONS);
023.
matcher.addURI(
"com.example.f14_contentprovider.PersonContentProvider"
,
024.
"person/#"
, PERSON);
025.
}
026.
027.
@Override
028.
public
int
delete(Uri uri, String selection, String[] selectionArgs) {
029.
// TODO Auto-generated method stub
030.
return
0
;
031.
}
032.
033.
// 当您需要匹配一个URI,调用匹配(URI),用来来建立一个查询,返回类型,插入或删除一行。
034.
@Override
035.
public
String getType(Uri arg0) {
036.
// TODO Auto-generated method stub
037.
int
match = matcher.match(arg0);
038.
switch
(match) {
039.
case
PERSONS:
040.
return
"vnd.android.cursor.dir/person"
;
041.
case
PERSON:
042.
return
"vnd.android.cursor.item/person"
;
043.
default
:
044.
return
null
;
045.
}
046.
047.
}
048.
049.
@Override
050.
public
Uri insert(Uri uri, ContentValues values) {
051.
// TODO Auto-generated method stub
052.
SQLiteDatabase database = helper.getWritableDatabase();
053.
long
id = database.insert(
"person"
,
null
, values);
054.
Uri rUri = ContentUris.withAppendedId(uri, id);
055.
resolver.notifyChange(rUri,
null
);
056.
return
rUri;
057.
}
058.
059.
@Override
060.
public
boolean
onCreate() {
061.
// TODO Auto-generated method stub
062.
helper =
new
MyOpenHelper(getContext());
063.
resolver = getContext().getContentResolver();
064.
return
true
;
065.
}
066.
067.
@Override
068.
public
Cursor query(Uri uri, String[] projection, String selection,
069.
String[] selectionArgs, String sortOrder) {
070.
// TODO Auto-generated method stub
071.
Cursor cursor =
null
;
072.
int
flag = matcher.match(uri);
073.
SQLiteDatabase database = helper.getReadableDatabase();
074.
switch
(flag) {
075.
case
PERSONS:
076.
cursor=database.query(
"person"
,
null
,
null
,
null
,
null
,
null
,
null
);
077.
break
;
078.
case
PERSON:
079.
long
_id = ContentUris.parseId(uri);
080.
String where_value =
" _id = "
+ _id;
081.
if
(selection !=
null
&& !selection.equals(
""
)) {
082.
where_value += selection;
083.
}
084.
cursor = database.query(
"person"
, projection, where_value,
085.
selectionArgs,
null
,
null
, sortOrder);
086.
break
;
087.
088.
default
:
089.
break
;
090.
}
091.
cursor.setNotificationUri(resolver, uri);
092.
return
cursor;
093.
}
094.
095.
@Override
096.
public
int
update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
097.
// TODO Auto-generated method stub
098.
return
0
;
099.
}
100.
101.
}
01.
package
com.example.f14_contentprovider;
02.
03.
import
android.content.Context;
04.
import
android.database.sqlite.SQLiteDatabase;
05.
06.
import
android.database.sqlite.SQLiteOpenHelper;
07.
08.
public
class
MyOpenHelper
extends
SQLiteOpenHelper {
09.
private
static
final
int
DATABASE_VERSION =
1
;
10.
private
static
final
String PERSON_TABLE_NAME =
"person"
;
11.
12.
public
MyOpenHelper(Context context) {
13.
super
(context, PERSON_TABLE_NAME,
null
, DATABASE_VERSION);
14.
// TODO Auto-generated constructor stub
15.
}
16.
17.
@Override
18.
public
void
onCreate(SQLiteDatabase db) {
19.
// TODO Auto-generated method stub
20.
db.execSQL(
"create table "
21.
+ PERSON_TABLE_NAME
22.
+
"(_id integer primary key autoincrement,name varchar(64),address varchar(64))"
);
23.
24.
}
25.
26.
@Override
27.
public
void
onUpgrade(SQLiteDatabase db,
int
oldVersion,
int
newVersion) {
28.
// TODO Auto-generated method stub
29.
30.
}
31.
32.
}