为了在应用程序之间交换数据,android提供了ContentProvider,ContentProvider是不同应用程序之间进行数据交换的标准API,当一个应用程序需要把自己的数据暴露给其他程序使用时,该应用程序就可以通过提供ContentPRovider来实现,其他应用程序就可以通过ContentResolver来操作ContentProvider暴露的数据。

实现ContentProvider的步骤:

1)编写一个类,继承ContentProvider,并且重写里面的CRUD方法。

2)在androidmanifest.xml文件中注册provider。

在androidmanifest.xml中注册provider需要以下3个属性:

android:name provider的实现类。

android:authorities provider的uri。

android:exported provider是否暴露给其他程序。


ContentResovler操作ContentProvider:

1)获取ContentResolver,getContentResovler()方法来自于ContextWrapper,所以activity和service中都可以使用。

2)调用CURD方法,通过参数url,调用指定的ContentProvider的方法。


下面是一个demo,向contentProvider中插入一条数据,并且返回到listview中。

main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".Main" >    <ListView        android:id="@+id/listview"        android:layout_width="match_parent"        android:layout_height="wrap_content" /></RelativeLayout>

MySQLiteOpenHelper类

package com.app.dao;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class MySQLiteOpenHelper extends SQLiteOpenHelper {public MySQLiteOpenHelper(Context context, String name,CursorFactory factory, int version) {super(context, name, factory, version);}@Overridepublic void onCreate(SQLiteDatabase db) {String create_sql = "create table tb_test(_id integer primary key autoincrement,name,gender,age)";db.execSQL(create_sql);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}

MyContentProvider类

package com.app.dao;import android.content.ContentProvider;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;public class MyContentProvider extends ContentProvider{MySQLiteOpenHelper helper=null;@Overridepublic int delete(Uri arg0, String arg1, String[] arg2) {return 0;}@Overridepublic String getType(Uri arg0) {// TODO Auto-generated method stubreturn null;}@Overridepublic Uri insert(Uri arg0, ContentValues values) {String insert_sql="insert into tb_test values(null,'wx','boy',17)";helper.getReadableDatabase().execSQL(insert_sql);return null;}@Overridepublic boolean onCreate() {helper=new MySQLiteOpenHelper(this.getContext(),"test.db3",null,1);return true;}@Overridepublic Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,String arg4) {String query_sql="select * from tb_test";Cursor cursor=helper.getReadableDatabase().rawQuery(query_sql, null);return cursor;}@Overridepublic int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {// TODO Auto-generated method stubreturn 0;}}

listview的显示界面show.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal" >    <TextView        android:id="@+id/name"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/gender"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="60dp" />    <TextView        android:id="@+id/age"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="60dp" /></LinearLayout>

Main.java

package com.app.main;import android.annotation.SuppressLint;import android.app.Activity;import android.content.ContentResolver;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.support.v4.widget.CursorAdapter;import android.widget.ListView;import android.widget.SimpleCursorAdapter;public class Main extends Activity {ContentResolver resolver = null;ListView lv = null;@SuppressLint("NewApi")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);lv = (ListView) this.findViewById(R.id.listview);resolver = this.getContentResolver();String str = "content://com.app.test.db/";Uri uri = Uri.parse(str);resolver.insert(uri, null);Cursor cursor = resolver.query(uri, null, null, null, null);SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.show, cursor,new String[] { "name", "gender", "age" }, new int[] {R.id.name, R.id.gender, R.id.age },CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);lv.setAdapter(adapter);}}

实现效果:(执行了3次插入后的效果)


更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Android数据库升级、降级、创建(onCreate() onUpgrade() onDowng
  4. Android(安卓)ORM数据库框架之-greenDao(二)
  5. ANDROID 在eclipse中没有出现AVD的解决方法
  6. 如何把批量数据导入到android 的 sqlite 数据库(更新中)
  7. Android(安卓)LCD(二):LCD常用接口原理篇
  8. View 绘制流程
  9. Android应用程序的安装位置(一)

随机推荐

  1. android中使用static、application、本地
  2. Android G711A编解码
  3. android银行卡操作步骤
  4. ANDROID音频系统散记之四:4.0音频系统HAL
  5. 常用adb命令
  6. Android - 详情页面【仿】淘宝App
  7. JS调用Android、Ios原生控件
  8. Android 自定义可拖拽,可放大缩小的ImageV
  9. Android里can't resolve symbol 问题
  10. Android App Bundle