使用自定义ContentProvider 图片看不了?点击切换HTTP 返回上层
上一节教程我们学习了如何自定义 ContentProvider,接下来将讲解如何通过 ContentProvider 访问其他应用程序中的数据,并对数据进行更改。
实例 UseDbProvider 演示了通过我们之前建立的自定义 ContentProvider MyDbProvider 访问实例 MyDbDemo 中建立的 SQLite 数据库 mydb,并对其中的数据进行 CRUD 操作的过程。
实例 UseDbProvider 对 MyDbProvider 相关信息的访问是从 MyFriendsDB 类中获取的。
实例 UseDbProvider 的运行效果如图 2 所示。该视图和实例 MyDbDemo 一样,由 main.xml 和 list.xml 组成。

图 2 UseDbProvider界面
该实例实现的步骤如下:
1)在 Eclipse 中建立工程 UseDbProvider,定义包为“introduction.android.useDbprovider”,定义 Activity 为 UseDbCPActivity。
2)从工程 MyDbDemo 中导出 MyDbProvider 的信息描述类 MyFriendsDB。具体操作方法如下:

图 3 选择Export选项

图 4 选择导出类型
在弹出的对话框中选择导出资源为 MyFriendsDB.Java,导出的目标文件为“C:\MyDbProvider.jar”,单击 Finish 按钮。这样,就把 MyFriendsDB 类导出到 myProvider.jar 文件中,也就可以导出到其他文件中使用了,如图 5 所示。

图 5 导出过程
3)在工程 MyFriendsDB 中导入 MyFriendsDB。右击 UseDbProvider,选择 Build Path | Add External Archives 选项(如图 6 所示),在弹出的对话框中选中 MyDbProvder.jar,即可将 MyFriendsDB 类导入工程中。

图 6 选择Add External Archives选项
编写 UseDbCPActivity 类,通过 ContentResolver 完成对 MyDbProvider 的访问,进而完成对数据的操作。
实例 UseDbProvider 中 UseDbCPActivity.java 的代码如下:
由于工程 MyDbDemo 中定义了 MyDbProvider 的访问权限,因此实例 UseDbProvider 的 AndroidManifest.xml 文件中也必须声明相应权限。
AndroidManifest.xml 文件的代码如下:
在实例 UseDbProvider 中对 SQLite 数据库 mydb 进行 CRUD 操作后,运行 MyDbDemo 进行查询,可发现数据库中的数据确实被改变了。由此实现了在一个应用程序中通过自定义的 ContentProvider 修改另一个应用程序中的持久化数据的功能。
实例 UseDbProvider 演示了通过我们之前建立的自定义 ContentProvider MyDbProvider 访问实例 MyDbDemo 中建立的 SQLite 数据库 mydb,并对其中的数据进行 CRUD 操作的过程。
实例 UseDbProvider 对 MyDbProvider 相关信息的访问是从 MyFriendsDB 类中获取的。
实例 UseDbProvider 的运行效果如图 2 所示。该视图和实例 MyDbDemo 一样,由 main.xml 和 list.xml 组成。

图 2 UseDbProvider界面
该实例实现的步骤如下:
1)在 Eclipse 中建立工程 UseDbProvider,定义包为“introduction.android.useDbprovider”,定义 Activity 为 UseDbCPActivity。
2)从工程 MyDbDemo 中导出 MyDbProvider 的信息描述类 MyFriendsDB。具体操作方法如下:
- 右击工程 MyDbDemo,在弹出的菜单中选择 Export 选项,如图 3 所示。
- 在弹出的对话框中选择导出类型为 Java|JAR file,单击 Next 按钮,如图 4 所示。

图 3 选择Export选项

图 4 选择导出类型

图 5 导出过程

图 6 选择Add External Archives选项
编写 UseDbCPActivity 类,通过 ContentResolver 完成对 MyDbProvider 的访问,进而完成对数据的操作。
实例 UseDbProvider 中 UseDbCPActivity.java 的代码如下:
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 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | import android.app.Activity; import android.content.ContentUris; import android.content.ContentValues; import android. database . Cursor ; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android. view . View ; import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.AdapterView.OnItemClickListener; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class UseDbCPActivity extends Activity { private List<Map<String, String>> data; private SimpleAdapter listAdapter; private ListView listview; private HashMap<String, String> item; private Button selBtn, addBtn, updBtn, delBtn; private EditText et_name; private EditText et_age; private EditText et_id; /** * Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_name = (EditText) findViewById(R.id.et_name); et_age = (EditText) findViewById(R.id.et_age); et_id = (EditText) findViewById(R.id.et_id); listview = (ListView) findViewById(R.id.listView); selBtn = (Button) findViewById(R.id.bt_query); addBtn = (Button) findViewById(R.id.bt_add); updBtn = (Button) findViewById(R.id.bt_modify); delBtn = (Button) findViewById(R.id.bt_del); selBtn.setOnClickListener(new Button.OnClickListener() { @Override public void onClick( View v) { // TODO Auto-generated method stub if (et_id.getText().toString().equals( "" )) dbFindAll(MyFriendsDB.CONTENT_TYPE); else dbFindAll(MyFriendsDB.CONTENT_ITEM_TYPE); } }); addBtn.setOnClickListener(new Button.OnClickListener() { @Override public void onClick( View v) { // TODO Auto-generated method stub dbAdd( null ); dbFindAll(MyFriendsDB.CONTENT_TYPE); } }); updBtn.setOnClickListener(new Button.OnClickListener() { @Override public void onClick( View v) { // TODO Auto-generated method stub dbUpdate( null ); dbFindAll(MyFriendsDB.CONTENT_TYPE); } }); delBtn.setOnClickListener(new Button.OnClickListener() { @Override public void onClick( View v) { // TODO Auto-generated method stub dbDel(-1); dbFindAll(MyFriendsDB.CONTENT_TYPE); } }); data = new ArrayList<Map<String, String>>(); dbFindAll(MyFriendsDB.CONTENT_TYPE); listview.setOnItemClickListener(new OnItemClickListener() { private String selId; @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { // TODO Auto-generated method stub Map<String, Object> listltem = (Map<String, Object>) listview.getItemAtPosition(position); et_name.setText((String) listltem.get( "name" )); et_age.setText((String) listltem.get( "age" )); et_id.setText((String) listltem.get( "_id" )); Log.i( "UseDB" , "id=" + selId); } }); } private void showList() { // TODO Auto-generated method stub listAdapter = new SimpleAdapter(this, data, R.layout.listview, new String[]{ "_id" , "name" , "age" }, new int []{R.id.tvID, R.id.tvName, R.id.tvAge}); listview.setAdapter(listAdapter); } protected void dbDel(long iid) { // TODO Auto-generated method stub if (iid < 0) { String id = et_id.getText().toString().trim(); if (id.equals( "" )) { Log.e( "UseDB" , "未指定更新数据" ); return ; } iid = Long.parseLong(id); } Uri uri = ContentUris.withAppendedId(MyFriendsDB.CONTENT_URI, iid); int i = this.getContentResolver(). delete (uri, null , null ); if (i > 0) { Log.i( "UseDB" , " 已删除数据id=" + iid); } else { Log.i( "UseDB" , "数据未删除。" ); } } protected void dbUpdate(ContentValues values ) { // TODO Auto-generated method stub String id = et_id.getText().toString().trim(); if (id.equals( "" )) { Log.e( "UseDB" , "未指定更新数据。" ); return ; } Long selid = Long.parseLong(id); Uri uri = ContentUris.withAppendedId(MyFriendsDB.CONTENT_URI, selid); if ( values == null ) { values = new ContentValues(); values .put( "name" , et_name.getText().toString().trim()); values .put( "age" , et_age.getText().toString().trim()); } int i = this.getContentResolver(). update (uri, values , null , null ); if (i > 0) { Log.i( "UseDB" , "已更新数据id=" + selid); } else { Log.e( "UseDB" , "数据更新失败!" ); } } protected void dbAdd(ContentValues values ) { // TODO Auto-generated method stub if ( values == null ) { values = new ContentValues(); values .put( "name" , et_name.getText().toString().trim()); values .put( "age" , et_age.getText().toString().trim()); } Uri uri = this.getContentResolver(). insert (MyFriendsDB.CONTENT_URI, values ); if (uri == null ) { Log.e( "UseDB" , "数据插入失败!" ); } } protected void dbFindAll(String type) { // TODO Auto-generated method stub data.clear(); Cursor cursor ; Uri uri; if (type == MyFriendsDB.CONTENT_TYPE) { uri = MyFriendsDB.CONTENT_URI; } else { Long selid = Long.parseLong(et_id.getText().toString().trim()); uri = ContentUris.withAppendedId(MyFriendsDB.CONTENT_URI, selid); Log.d( "UseDB" , uri.toString()); } cursor = this.getContentResolver().query(uri, null , null , null , null ); cursor .moveToFirst(); while (! cursor .isAfterLast()) { String id = cursor .getString(0); String name = cursor .getString(1); String age = cursor .getString(2); item = new HashMap<String, String>(); item.put( "_id" , id); item.put( "name" , name ); item.put( "age" , age); data. add (item); cursor .moveToNext(); } showList(); } } |
AndroidManifest.xml 文件的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?xml version= "1.0" encoding= "utf-8" ?> <manifest xmlns:android= "http://schemas.android.com/apk/res/android" package= "introduction.android.useDbdemo" android:versionCode= "1" android:versionName= "1.0" > <uses-sdk android:minSdkVersion= "14" /> <uses-permission android: name = "introduction.android.permission.USE_MYDB" /> <application android:allowBackup= "true" android:icon= "@mipmap/ic_launcher" android:label= "@string/app_name" android:roundIcon= "@mipmap/ic_launcher_round" android:supportsRtl= "true" android:theme= "@style/AppTheme" > <activity android: name = ".UseDbCPActivity" > <intent-filter> < action android: name = "android.intent.action.MAIN" /> <category android: name = "android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |