ContentResolver和ContentProvider通过相同的URI联系,实现数据共享。我重写了public class MyAdapter extends BaseAdapter,putData(),然后listview.setAdapter(myAdapter)显示数据。edit layout用来安排显示数据的格式。主要代码来自《安卓编程兵书》p311。完整的URI如下,"content://"+AUTHORITY+"/books",books是图书信息表的名字,AUTHORITY定义如下:

public static final String AUTHORITY="lmy.com.bookinfo_provider"

1.CotentProvider

//《安卓变成兵书》p311
//sample_8_6.java
package lmy.com.sample_8_6;import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.text.TextUtils;public class Sample_8_6 extends ContentProvider{private DB_helper dbhelper = null;private static UriMatcher sUriMatcher =null;private static final int BOOKS_RECORDS = 1;private static final int BOOKS_RECORD =2;static{sUriMatcher  = new UriMatcher(UriMatcher.NO_MATCH);sUriMatcher.addURI(Bookinfo_provider.AUTHORITY,"books",BOOKS_RECORDS);sUriMatcher.addURI(Bookinfo_provider.AUTHORITY,"books/#",BOOKS_RECORD);}@Overridepublic boolean onCreate(){dbhelper = new DB_helper(this.getContext());return true;}public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.androidbook.book";public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.androidbook.book";@Overridepublic String getType(Uri uri){//TODO Auto-generated method stubswitch(sUriMatcher.match(uri)) {case BOOKS_RECORDS:return Bookinfo_provider.Bookinfo.CONTENT_TYPE;case BOOKS_RECORD:return Bookinfo_provider.Bookinfo.CONTENT_ITEM_TYPE;default:throw new IllegalArgumentException("Uknown URI "+uri);}}@Overridepublic Uri insert(Uri uri,ContentValues values){if(sUriMatcher.match(uri)!=BOOKS_RECORDS){throw new IllegalArgumentException("Unknown URI "+uri);}if(!values.containsKey(Bookinfo_provider.Bookinfo.BOOK_NAME)){throw new SQLException("Failed to insert,please input Book name"+uri);}if(!values.containsKey(Bookinfo_provider.Bookinfo.BOOK_ISBN)){values.put(Bookinfo_provider.Bookinfo.BOOK_ISBN,"Unknown ISBN");}if(!values.containsKey(Bookinfo_provider.Bookinfo.BOOK_AUTHOR)){values.put(Bookinfo_provider.Bookinfo.BOOK_AUTHOR,"Unknown author");}SQLiteDatabase db = dbhelper.getWritableDatabase();long rowID = db.insert(Bookinfo_provider.Bookinfo.TABLE_NAME,Bookinfo_provider.Bookinfo.BOOK_NAME,values);if(rowID>0){Uri insertBookedUri = ContentUris.withAppendedId(Bookinfo_provider.Bookinfo.CONTENT_URI,rowID);getContext().getContentResolver().notifyChange(insertBookedUri,null);return insertBookedUri;}throw new SQLException("Failed to insert row int "+uri);}@Overridepublic int delete(Uri uri,String selection,String[] selectionArgs){SQLiteDatabase db = dbhelper.getWritableDatabase();int count = 0;switch(sUriMatcher.match(uri)){case BOOKS_RECORDS:count = db.delete(Bookinfo_provider.Bookinfo.TABLE_NAME,selection,selectionArgs);break;case BOOKS_RECORD:String rowID = uri.getPathSegments().get(1);String where = Bookinfo_provider.Bookinfo._ID+"="+rowID+(!TextUtils.isEmpty(selection)?" AND ("+selectionArgs+')':"");count = db.delete(Bookinfo_provider.Bookinfo.TABLE_NAME,where,selectionArgs);break;default:throw new IllegalArgumentException("Unknown URI"+uri);}db.close();this.getContext().getContentResolver().notifyChange(uri,null);return count;}@Overridepublic int update(Uri uri,ContentValues values,String selection,String[] selectionArgs){SQLiteDatabase db = dbhelper.getWritableDatabase();int count = 0;switch (sUriMatcher.match(uri)){case BOOKS_RECORDS:count = db.update(Bookinfo_provider.BOOKS_TABLE_NAME,values,selection,selectionArgs);break;case BOOKS_RECORD:String rowID = uri.getPathSegments().get(1);String where = Bookinfo_provider.Bookinfo._ID+"="+rowID+(!TextUtils.isEmpty(selection)?" AND("+selection+')':"");count = db.update(Bookinfo_provider.BOOKS_TABLE_NAME,values,where,selectionArgs);break;default:throw new IllegalArgumentException("Uknown URI "+uri);}getContext().getContentResolver().notifyChange(uri,null);return count;}@Overridepublic Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder){Cursor cursor = null;SQLiteDatabase db = dbhelper.getReadableDatabase();switch(sUriMatcher.match(uri)){case BOOKS_RECORDS:cursor = db.query(Bookinfo_provider.BOOKS_TABLE_NAME,projection,selection,selectionArgs,null,null,sortOrder);break;case BOOKS_RECORD:String id = uri.getPathSegments().get(1);cursor = db.query(Bookinfo_provider.BOOKS_TABLE_NAME,projection,Bookinfo_provider.Bookinfo._ID+"="+id+(!TextUtils.isEmpty(selection)?" AND ("+selectionArgs+')':""),selectionArgs,null,null,sortOrder);break;default:throw new IllegalArgumentException("Unknown URI "+uri);}ContentResolver cr = this.getContext().getContentResolver();cursor.setNotificationUri(cr,uri);return cursor;}
}
//MainActivity.java
package lmy.com.sample_8_6;import android.app.ListActivity;
import android.os.Bundle;public class MainActivity extends ListActivity {private Sample_8_6 mContentProvider=new Sample_8_6();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}}
//DB_helper.java
package lmy.com.sample_8_6;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
//创建数据库
public class DB_helper extends SQLiteOpenHelper {public DB_helper(Context context){super(context,Bookinfo_provider.DATABASE_NAME,null,Bookinfo_provider.DATABASE_VERSION);}
//创建图书信息表@Overridepublic void onCreate(SQLiteDatabase db){String sql = "CREATE TABLE "+ Bookinfo_provider.Bookinfo.TABLE_NAME+" ("+ Bookinfo_provider.Bookinfo._ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+ Bookinfo_provider.Bookinfo.BOOK_NAME+" TEXT,"+ Bookinfo_provider.Bookinfo.BOOK_ISBN+" TEXT,"+ Bookinfo_provider.Bookinfo.BOOK_AUTHOR+" TEXT)";db.execSQL(sql);}@Overridepublic void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){String sql = "DROP TABLE IF EXISTS "+Bookinfo_provider.Bookinfo.TABLE_NAME;db.execSQL(sql);onCreate(db);}
}
//Bookinfo_provider.java
package lmy.com.sample_8_6;import android.net.Uri;
import android.provider.BaseColumns;public class Bookinfo_provider {public static final String DATABASE_NAME = "book.db";public static final int DATABASE_VERSION = 1;public static final String AUTHORITY="lmy.com.bookinfo_provider";public static final String  BOOKS_TABLE_NAME = "books";public static final class Bookinfo implements BaseColumns {public static final String TABLE_NAME = "books";public static final String BOOK_NAME = "name";public static final String BOOK_ISBN = "isbn";public static final String BOOK_AUTHOR = "author";public static final String _ID = "_id";public static final Uri CONTENT_URI = Uri.parse("content://"+AUTHORITY+"/books");public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.androidbook.book";public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.androidbook.book";public static final String DEFAULT_SORT_ORD="id DESC";}
}
<!--main.xml-->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"
><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="BookinfoProvider!"/><ListViewandroid:id="@android:id/list"android:layout_width="match_parent"android:layout_height="366dp" /></LinearLayout>
<!--edit.xml-->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/edit"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="书名" /><EditTextandroid:id="@+id/name"android:layout_width="325dp"android:layout_height="wrap_content"android:inputType="text" /></LinearLayout><LinearLayoutandroid:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:text="书号"android:layout_width="wrap_content"android:layout_height="wrap_content"/><EditTextandroid:id="@+id/isbn"android:layout_width="323dp"android:layout_height="wrap_content"android:inputType="text" /></LinearLayout><LinearLayoutandroid:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="作者" /><EditTextandroid:id="@+id/author"android:layout_width="322dp"android:layout_height="wrap_content"android:inputType="text" /></LinearLayout><LinearLayoutandroid:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:text="取消"android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/cancel"/><Buttonandroid:id="@+id/ok"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toEndOf="@+id/cancel"android:text="确定" /></LinearLayout>
</LinearLayout>
<!--AndroidManifest.xml-->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="lmy.com.sample_8_6"><applicationandroid: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"><providerandroid:authorities="lmy.com.bookinfo_provider"android:name=".Sample_8_6"android:exported="true" /><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

2.ContentResolver

//《安卓编程兵书》p311
//Sample_8_6.java
package lmy.com.sample_8_6_test;import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class Sample_8_6_test extends AppCompatActivity {private ListView listview;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);listview = (ListView)findViewById(R.id.myListView);MyAdapter myAdapter = new MyAdapter(this,putData());listview.setAdapter(myAdapter);try{test_insert();test_insert();test_insert();test_delete();test_update();test_find();}catch (Throwable e){System.out.println(e.toString());e.printStackTrace();}}public void test_insert() throws Throwable{ContentResolver cr = this.getContentResolver();//Uri inserturi = Uri.parse("content://lmy.com.bookinfo_provider/books");Uri inserturi = Uri.parse("content://"+Bookinfo_provider.AUTHORITY+"/books");ContentValues cv = new ContentValues();cv.put("name","Android");cv.put("isbn","123456");Uri re_uri = cr.insert(inserturi,cv);System.out.println("test_insert:"+re_uri);}public void test_delete() throws Throwable{ContentResolver contentResolver = getContentResolver();//Uri uri = Uri.parse("content://lmy.com.bookinfo_provider/books/1");Uri uri = Uri.parse("content://"+Bookinfo_provider.AUTHORITY+"/books/1");//"/books/1"表示books表中的第一条记录contentResolver.delete(uri,null,null);}public void test_update() throws Throwable{ContentResolver contentResolver = getContentResolver();//Uri updateUri = Uri.parse("content://lmy.com.bookinfo_provider/books/2");Uri updateUri = Uri.parse("content://"+Bookinfo_provider.AUTHORITY+"/books/2");ContentValues values = new ContentValues();values.put("name","Android示例");contentResolver.update(updateUri,values,null,null);System.out.println("修改完成");}public void test_find() throws Throwable{ContentResolver contentResolver = getContentResolver();//Uri uri = Uri.parse("content://lmy.com.bookinfo_provider/books");Uri uri = Uri.parse("content://"+Bookinfo_provider.AUTHORITY+"/books");Cursor cursor =contentResolver.query(uri,null,null,null,null);while(((Cursor) cursor).moveToNext()){String id = cursor.getString(0);String name = cursor.getString(1);String isbn = cursor.getString(2);String author = cursor.getString(3);System.out.println("_id="+id+",name="+name+",isbn="+isbn+",author="+author);}cursor.close();}public List<Map<String,Object>> putData(){List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();Map<String,Object> map1 ;ContentResolver contentResolver = getContentResolver();//Uri uri = Uri.parse("content://lmy.com.bookinfo_provider/books");Uri uri = Uri.parse("content://"+Bookinfo_provider.AUTHORITY+"/books");Cursor cursor =contentResolver.query(uri,null,null,null,null);while(((Cursor) cursor).moveToNext()){String id = cursor.getString(0);String name = cursor.getString(1);String isbn = cursor.getString(2);String author = cursor.getString(3);System.out.println("_id="+id+",name="+name+",isbn="+isbn+",author="+author);map1 = new HashMap<String,Object>();map1.put("_id",id);map1.put("name",name);map1.put("isbn",isbn);map1.put("author",author);list.add(map1);}return list;}
}
//MyAdapter.java
package lmy.com.sample_8_6_test;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import java.util.List;
import java.util.Map;public class MyAdapter extends BaseAdapter {private LayoutInflater mInflater;private List<Map<String,Object>> list;public MyAdapter(Context context , List<Map<String,Object>> list){this.mInflater = LayoutInflater.from(context);this.list = list;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn list.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn list.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubViewHolder holder = null;if (convertView == null) {holder = new ViewHolder();convertView = mInflater.inflate(R.layout.edit, null);holder._id = (EditText) convertView.findViewById(R.id._id);holder.name = (EditText)convertView.findViewById(R.id.name);holder.isbn=(EditText)convertView.findViewById(R.id.isbn);holder.author=(EditText)convertView.findViewById(R.id.author);convertView.setTag(holder);}else{holder = (ViewHolder)convertView.getTag();}holder._id.setText((String)list.get(position).get("_id"));holder.name.setText((String)list.get(position).get("name"));holder.isbn.setText((String)list.get(position).get("isbn"));holder.author.setText((String)list.get(position).get("author"));return convertView;}public final class ViewHolder{public EditText _id;public EditText name;public EditText isbn;public EditText author;}}
//Bookinfo_provider.java
package lmy.com.sample_8_6_test;import android.net.Uri;
import android.provider.BaseColumns;public class Bookinfo_provider {public static final String DATABASE_NAME = "book.db";public static final int DATABASE_VERSION = 1;public static final String AUTHORITY="lmy.com.bookinfo_provider";public static final String  BOOKS_TABLE_NAME = "books";public static final class Bookinfo implements BaseColumns {public static final String TABLE_NAME = "books";public static final String BOOK_NAME = "name";public static final String BOOK_ISBN = "isbn";public static final String BOOK_AUTHOR = "author";public static final String _ID = "_id";public static final Uri CONTENT_URI = Uri.parse("content://"+AUTHORITY+"/books");public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.androidbook.book";public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.androidbook.book";public static final String DEFAULT_SORT_ORD="_id DESC";}
}
<!--main.xml-->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"
><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><TextViewandroid:layout_width="50dp"android:layout_height="wrap_content"android:text="序号"/><TextViewandroid:layout_width="100dp"android:layout_height="wrap_content"android:text="书名"   /><TextViewandroid:layout_width="100dp"android:layout_height="wrap_content"android:text="ISBN"   /><TextViewandroid:layout_width="100dp"android:layout_height="wrap_content"android:text="作者"   /></LinearLayout><ListViewandroid:id="@+id/myListView"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>
<!--edit.xml-->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/edit"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><EditTextandroid:id="@+id/_id"android:layout_width="50dp"android:layout_height="wrap_content"android:inputType="number" /><EditTextandroid:id="@+id/name"android:layout_width="100dp"android:layout_height="wrap_content"android:inputType="text" /><EditTextandroid:id="@+id/isbn"android:layout_width="100dp"android:layout_height="wrap_content"android:inputType="text" /><EditTextandroid:id="@+id/author"android:layout_width="100dp"android:layout_height="wrap_content"android:inputType="text" /></LinearLayout>
<!--AndroidManifest.xml-->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="lmy.com.sample_8_6_test"><applicationandroid: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=".Sample_8_6_test"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

Android ContentProvider和ContentResolver实例相关推荐

  1. Android ContentProvider、ContentResolver和ContentObserver的使用

    1.ContentProvider.ContentResolver和ContentObserver ContentProvider是Android的四大组件之中的一个,可见它在Android中的作用非 ...

  2. Android基础——ContentProvider和contentResolver

    ContentProvider ContentProvider和contentResolver是什么? ContentResolver使用 URI是什么? URI解析 增 删 改 查 ContentP ...

  3. Android ContentProvider和getContentResolver

    安卓系统中的数据库SqlLite操作和java中mysql的数据库操作很不一样,造成这样的原因是因为在安卓中数据库是属于进程的不存在数据库客户端,也不存在数据库服务器. 关于SqlLite数据库的文章 ...

  4. Android ContentProvider支持跨进程数据共享与互斥、同步 杂谈

    在开发中,假如,A.B进程有部分信息需要同步,这个时候怎么处理呢?设想这么一个场景,有个业务复杂的Activity非常占用内存,并引发OOM,所以,想要把这个Activity放到单独进程,以保证OOM ...

  5. android contentprovider api,Content Provider Basics

    一个内容提供者访问数据的中央资源库.提供者是应用程序的一部分,提供自己的操作数据的UI.然而,内容提供者主要是被其他应用程序引用,通过提供者客户对象访问提供者.提供者和提供者客户端为数据提供一个一致的 ...

  6. android contentprovider学习(遇到最满意的介绍)---阿冬专栏

    转自出处:http://blog.csdn.net/dmk877/article/details/50387741 1.什么是内容提供者? 首先我们必须要明白的是ContentProvider(内容提 ...

  7. ContentProvider与ContentResolver

    android 没有一个可以将所有应用程序数据统一放置的地方,即两个应用程序间的数据不能共享.但ContentProvider与ContentResolver可以解决多应用程序数据共享. 方法: De ...

  8. 安卓应用间的数据共享:ContentProvider、ContentResolver全解

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓应用间的数据共享:ContentProvider.ContentResolver全解 ContentProvider用于应用程序向系统公开数据,C ...

  9. Android ContentProvider 完全解析及简单DEMO

    Android应用程序运行在不同的进程空间中,因此不同应用程序的数据是不能够直接访问的.为了增强程序之间的数据共享能力,Android系统提供了像SharedPreferences这类简单的跨越程序边 ...

最新文章

  1. 【必点】程序员自助SDCC热门主题+图书豪华套餐
  2. 浅谈Java/Android下的注解
  3. css写出三角形(兼容IE)
  4. ctypes python 结构体_Python 中 ctypes 的使用
  5. 【SQL】电商网站各模块指标的统计以及分析
  6. azure kinect三维点云_三维重建技术,你捋清楚了吗?本文适合小白
  7. vue中在哪个生命周期中dom被渲染_Vue生命周期说明
  8. 计算机断网后怎么连接网络连接,电脑突然断网, 连接不上网络怎么办? 三种方法轻松找回...
  9. foobar2000在线标签服务器,在Foobar2000播放器中从音乐名获取标签的技巧
  10. macOS High Sierra 10.13.4 安装n2n
  11. Android 10关机界面定制
  12. 从零到一制作个人网站
  13. 2020年最好用的离线下载网盘,不限速度和空间
  14. 转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧
  15. 【FFMPEG】解决截取MP4视频的中间段时,截取完成后前几帧视频卡住,但是有声音的情况
  16. 全国职业计算机学校排名,2020全国最好的计算机专业学校排名
  17. 2015广州强网杯 致敬经典
  18. 设计模式学习笔记(八):建造者模式
  19. NOJ1076机器狗组装费用——诡异的运行时间
  20. NI Linux实时设备上升级固件

热门文章

  1. ipvsadm 命令
  2. Windows下VS直接下载OpenGL库
  3. 教你几个 Java 编程中的奇技淫巧
  4. Excel表格怎么换行?4个方法任你选!
  5. 新机ThinkpadVantage备份
  6. Android布局属性大全
  7. Paper Reading: Generating Artistic Portrait Drawings from Face Photos with Hierarchical GANs
  8. “你们程序员不就是修电脑的吗,你牛什么牛(1),android移动开发
  9. 一张网卡设置多个IP
  10. 小米手机miui清理存储垃圾app推荐