我是靠谱客的博主 辛勤向日葵,这篇文章主要介绍ContentProvider的使用(2),现在分享给大家,希望可以做个参考。

1,ContentProvider 的使用  :

首先创建:server端(服务器端),他的作用是提供数据存储位置,以及提供接口给客户端进行数据操作;

提供一个数据库:


复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class SqliteHelper extends SQLiteOpenHelper{ private static final String NAME="info.db"; private static final int VERSION =1; public SqliteHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } public SqliteHelper(Context context) { super(context, NAME, null, VERSION); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub String sql = "create table person(_id integer primary key,name varchar(16),age integer)"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub if(newVersion !=oldVersion){ Log.i("==TAG==", "数据库版本发生改变。。。"); } } @Override public void onOpen(SQLiteDatabase db) { // TODO Auto-generated method stub super.onOpen(db); Log.i("==TAG==", "数据库被打开。。。"); } }

之后自定义一个ContentProvider:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package org.qianfeng.contentprovider; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; public class MyContentProvider extends ContentProvider{ private SqliteHelper helper ; private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); private static final int QUERY = 1;//查询的返回码 private static final int INSERT = 2;//插入的返回码 private static final int UPDATE = 3;//更新的返回码 private static final int DELETE = 4;//删除的返回码 static { /** * 第一个参数:当前contentprovider的权限设置 * 第二个参数:访问uri的地址 * 第三个参数:如果client端的uri访问当前的地址匹配时的返回码 */ uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "query", QUERY); uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "insert", INSERT); uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "update", UPDATE); uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "delete", DELETE); // String str ="content://org.qianfeng.contentprovider.MyContentProvider/query"; } /** * 提供给当前程序使用 * 当contentprovider创建时 系统回调方法 */ @Override public boolean onCreate() { // TODO Auto-generated method stub //得到SqliteHelper对象 helper = new SqliteHelper(getContext()); return false; } /** * 提供给客户端程序访问使用 * * 作用:查询当前应用程序的数据 返回cursor对象 */ @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub Cursor cursor = null; if(uriMatcher.match(uri)==QUERY){ SQLiteDatabase db = helper.getWritableDatabase(); cursor=db.query("person", null, selection, selectionArgs, null, null, sortOrder); } return cursor; } /** * 返回contentUri的类型 */ @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } /** * 提供给客户端程序使用 * * 作用:向当前应用程序添加数据 返回的是当前插入数据的row的uri对象 */ @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub if(uriMatcher.match(uri)==INSERT){ SQLiteDatabase db = helper.getWritableDatabase(); db.insert("person", null, values); } return null; } /** * 提供给客户端程序使用 * * 作用: 删除当前应用程序的数据 返回的是删除数据row的个数 */ @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int count =0; if(uriMatcher.match(uri)==DELETE){ SQLiteDatabase db = helper.getWritableDatabase(); count=db.delete("person", selection, selectionArgs); } return count; } /** * 提供给客户端程序使用 * * 作用:更改当前应用程序的数据 返回的是更新数据row的个数 */ @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int count =0; if(uriMatcher.match(uri)==UPDATE){ SQLiteDatabase db = helper.getWritableDatabase(); count =db.update("person", values, selection, selectionArgs); } return count; } }

当然了 ContentProvider是四大主键之一 所以需要注册:

复制代码
1
2
3
4
5
<provider android:name="org.qianfeng.contentprovider.MyContentProvider" android:authorities="org.qianfeng.contentprovider.MyContentProvider" android:exported="true" > </provider>

这样  ContentProvider服务端就注册完成了;




2,之后我们写客户端(client端):


复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package org.qianfeng.contentproviderclient; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.support.v4.widget.SimpleCursorAdapter; import android.view.Menu; import android.view.View; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends Activity { private ListView lv; private SimpleCursorAdapter adapter; private ContentResolver contentResolver; private static final String queryPath="content://org.qianfeng.contentprovider.MyContentProvider/query"; private static final String insertPath="content://org.qianfeng.contentprovider.MyContentProvider/insert"; private static final String updatePath="content://org.qianfeng.contentprovider.MyContentProvider/update"; private static final String detelePath="content://org.qianfeng.contentprovider.MyContentProvider/detele"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); contentResolver = getContentResolver(); lv = (ListView) findViewById(R.id.lv); Cursor cursor = contentResolver.query(Uri.parse(queryPath), null, null, null, null); adapter = new SimpleCursorAdapter(MainActivity.this, R.layout.item, cursor, new String[]{"name","age"}, new int []{R.id.textView1,R.id.textView2}); lv.setAdapter(adapter); } @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; } public void onclick (View v){ switch (v.getId()) { case R.id.btn_add: insertData(); break; case R.id.btn_update: updateData(); break; case R.id.btn_delete: deleteData(); break; case R.id.btn_query: break; default: break; } } public void insertData(){ ContentValues values = new ContentValues(); values.put("_id", 1); values.put("name", "zhangsan"); values.put("age", 25); contentResolver.insert(Uri.parse(insertPath), values); values = new ContentValues(); values.put("_id", 2); values.put("name", "lisi"); values.put("age", 33); contentResolver.insert(Uri.parse(insertPath), values); } public void updateData(){ ContentValues values=new ContentValues(); values.put("name","赵四"); contentResolver.update(Uri.parse(updatePath), values,"_id=?", new String[]{1+""}); } public void deleteData(){ int count=contentResolver.delete(Uri.parse(detelePath), "_id=?", new String[]{1+""}); if(count>0){ Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity.this, "删除失败", Toast.LENGTH_SHORT).show(); } } }

这样  就完成了一个自定义的ContentProvider;





最后

以上就是辛勤向日葵最近收集整理的关于ContentProvider的使用(2)的全部内容,更多相关ContentProvider内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(91)

评论列表共有 0 条评论

立即
投稿
返回
顶部