Android-ContentProvider内容提供者
2017-02-14 18:17
411 查看
一、ContentProvider的概念
ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider1、ContentProvider使用表的形式来组织数据
无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格
2、ContentProvider提供的方法
query:查询
insert:插入
update:更新
delete:删除
getType:得到数据类型
onCreate:创建数据时调用的回调函数
3、每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包当中
二、ContentProvider的内部原理
自定义一个ContentProvider,来实现内部原理步骤:
1、定义一个CONTENT_URI常量(里面的字符串必须是唯一)
Public static final Uri CONTENT_URI = Uri.parse(“content://com.example.sj_provider.data”);
如果有子表,URI为:
Public static final Uri CONTENT_URI = Uri.parse(“content://com.example.sj_provider.data/users”);
2、定义一个类,继承ContentProvider
Public class MyContentProvider extends ContentProvider
3、实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)
二、ContentProvider的三要素
1.内容(数据)2.名字(唯一的)
3.开放
下面小编实现了个查询的简单小列子
activity_main.xml
<EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="ID:" android:id="@+id/et_main_id" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="pname:" android:id="@+id/et_main_pname" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="page:" android:id="@+id/et_main_page" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="保存" android:onClick="save" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="查询" android:onClick="query" /> </LinearLayout> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@android:id/list" ></ListView>
item_listview.xml
<TextView android:layout_width="0dp" android:layout_height="wrap_content" android:id="@+id/tv_item_listview_id" android:layout_weight="1" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:id="@+id/tv_item_listview_pnane" android:layout_weight="1" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:id="@+id/tv_item_listview_page" android:layout_weight="1" />
DbHelper.java
public class DbHelper extends SQLiteOpenHelper { public DbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); Log.i("test","DbHelper构造"); } /** * 创建表的操作 * @param sqLiteDatabase */ @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { Log.i("test","创建表"); sqLiteDatabase.execSQL("create table person(_id integer primary key autoincrement,pname,page)"); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { Log.i("test","onUpgrade"); } }
Mainactivity.java
public class MainActivity extends ListActivity { private EditText et_main_id; private EditText et_main_pname; private EditText et_main_page; private SQLiteDatabase db; private ListView listView; private Cursor cursor; private SimpleCursorAdapter simpleCursorAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //打乱集合中的数据 // Collections.shuffle(); DbHelper dbHelper=new DbHelper(this,"questions.db",null,2); db = dbHelper.getReadableDatabase(); initViews(); cursor=getPersons(null);//查询到所有数据 //适配器 //ArrayAdapter SimpleAdapter(List<Map>) BaseAdapter //SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.item_listview,cursor,new String[]{"_id","pname","page"},new int[]{R.id.tv_item_listview_id,R.id.tv_item_listview_pnane,R.id.tv_item_listview_page}); //设置适配器 listView.setAdapter(simpleCursorAdapter); } private void initViews() { et_main_id = (EditText) findViewById(R.id.et_main_id); et_main_pname = (EditText) findViewById(R.id.et_main_pname); et_main_page = (EditText) findViewById(R.id.et_main_page); listView = getListView(); } public void save(View view){ //获取名字和年龄 String pname=et_main_pname.getText().toString(); String page=et_main_page.getText().toString(); ContentValues values=new ContentValues();//Map values.put("pname",pname); values.put("page",page); values.putNull("_id"); db.insert("person","pname",values); cursor=getPersons(null); //通知适配器数据发生改变 simpleCursorAdapter.changeCursor(cursor); } public void query(View view){ //判断ID是否为空 if(TextUtils.isEmpty(et_main_id.getText())){ //查询所有 cursor=getPersons(null); }else{ //查询单个 String id=et_main_id.getText().toString(); cursor=getPersons(id); } //通知适配器数据发生改变 simpleCursorAdapter.changeCursor(cursor); } /** * 从数据库中查询 * 1.查询所有 * 2.查询单个 */ public Cursor getPersons(String id){ if(TextUtils.isEmpty(id)){ //查询所有 //游标 cursor = db.query(false,"person",null,null,null,null,null,null,null); }else{ //查询单个 cursor = db.query(false,"person",null,"_id=?",new String[]{id},null,null,null,null); } // db.rawQuery() return cursor; } }
MyProvider.java
public class MyProvider extends ContentProvider { private DbHelper dbHelper; private SQLiteDatabase db; private UriMatcher uriMatcher; private Cursor c; @Override public boolean onCreate() { Log.i("test","onCreate"); dbHelper = new DbHelper(getContext(),"questions.db",null,2); db = dbHelper.getReadableDatabase(); //实例化URI匹配器 uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //给匹配器中添加匹配规则 //查询所有 uriMatcher.addURI("com.example.sj_provider.data","persons",0); //查询单个 uriMatcher.addURI("com.example.sj_provider.data","persons/#",1); return false; } @Nullable @Override public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) { Log.i("test","query"); //开始匹配 int code=uriMatcher.match(uri); switch (code) { case 0: //查询所有 c = db.query(false,"person",strings,s,strings1,null,null,s1,null); return c; case 1: //得到#的值 long id=ContentUris.parseId(uri); //查询单个: c= db.query(false,"person",strings,"_id=?",new String[]{id+""},null,null,s1,null); return c; } return null; } @Nullable @Override public String getType(Uri uri) { return null; } @Nullable @Override public Uri insert(Uri uri, ContentValues contentValues) { Log.i("test","insert"); return null; } @Override public int delete(Uri uri, String s, String[] strings) { Log.i("test","delete"); return 0; } @Override public int update(Uri uri, ContentValues contentValues, String s, String[] strings) { Log.i("test","update"); return 0; } }
AndroidManifest.xml
<provider android:authorities="com.example.sj_provider.data" android:name="com.example.sj_provider.MyProvider" android:exported="true" > </provider>
相关文章推荐
- [Android Pro] 监听内容提供者ContentProvider的数据变化
- Android开发14——监听内容提供者ContentProvider的数据变化
- Android开发14——监听内容提供者ContentProvider的数据变化
- Android ContentProvider内容提供者
- Android学习---通过内容提供者(ContentProvider)操作另外一个应用私有数据库的内容
- Android组件系列----ContentProvider内容提供者【2】
- Android基础(五) ContentProvider 内容提供者
- Android中内容提供者ContentProvider的详解
- android 复习之路之ContentProvider 内容提供者
- Android 使用ContentProvider(内容提供者)查询手机联系
- Android 使用ContentProvider(内容提供者)共享数据
- ym——Android从零开始(9)(ContentProvider内容提供者)(新)
- Android知识梳理之ContentProvider内容提供者的使用
- android四大组件之一内容提供者contentprovider
- android内容提供者contentProvider_短信插入
- android内容提供者contentProvider_查询联系人
- Android应用开发基础之九:内容提供者(ContentProvider)
- 文章标题android 的ContentProvider内容提供者
- Android 内容提供者ContentProvider的使用
- Android组件之ContentProvider(内容提供者)