android学习笔记(七)——数据共享
2015-06-30 22:28
615 查看
sharedpreferences和文件虽然都能实现数据共享,但是却无法实现数据库的共享,所以android提供了contentProvider的方法来实现数据库的共享,下面就来介绍contentprovider
1.contentprovider的目的是为了实现数据的共享,为了使用contentprovider就需要先重写其中的4种方法oncreate,insert,delete,query, oncreate为创建时调用的方法,insert为插入数据时的方法,delete未删除数据时的方法,query为查询时使用的方法。这几个方法是必须实现的,原始方法如下:
2.contentprovider使用的关键Universal Resource Identifier,简写为URI,方便的理解方式为web开发中的url类似的概念,就是提供数据的访问“链接”,分三部分组成,”content://”,数据路径,ID标志符,android提供了两个用以操作uri的类UriMatcher 和ContentUris 。
一,UriMatcher
UriMatcher的主要作用是用来初始化Uri
初始化方法如下,第一步:
第二步,注册所需的URI,第一个参数为authorities,第二个参数为路径,第三个参数为匹配码,是之后用来进行uri匹配时用到的值
第三步,URI匹配
二,ContentUris是用来从给定的uri中获取ID,或是添加ID用
1.为路径加上ID
则此时的URI为”content://com.example.ui_demo/mytable/10”
2.获取路径ID
此时获取的ID值为10
三,实际使用时并不是直接使用contentProvider来操作数据,而是通过contentResolver来供外部应用操作contentProvider中的数据,实际的调用ContentProvider是在contentResolver的使用中进行的,而ContentProvider和ContenResolver是怎么关联起来的,可以参考下面的博客,博主写的很全面
http://blog.csdn.net/yangxinle137/article/details/5985608
四,完整的运用过程如下
1.创建一个数据库供contentprovider使用,这个在上一篇中有详细介绍,这里就不多说了
2.注册contentprovider
提供provider的程序,注意provider的注册需要卸载application内,而权限的注册需要放在之外
要使用provider的应用程序定义在application之外
3.注册完毕后,就是重写contentprovider的方法了,重写过程如下
4.通过contentResolver来操作数据
示例代码
dataprovider.java
readotherdatabase.java
1.contentprovider的目的是为了实现数据的共享,为了使用contentprovider就需要先重写其中的4种方法oncreate,insert,delete,query, oncreate为创建时调用的方法,insert为插入数据时的方法,delete未删除数据时的方法,query为查询时使用的方法。这几个方法是必须实现的,原始方法如下:
public boolean onCreate(): //insert第一个参数为uri,第二个参数为要插入的值 public Uri insert(Uri uri, ContentValues values) //delete第一个参数为uri,第二个参数为sql语句的选择条件,第三个参数为当selection参数中有占位符时,取值从第三个参数中获取 public int delete(Uri uri, String selection, String[] selectionArgs) //数据更新,参数与delete是一致的 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) //查询函数第一个参数是uri,第二个参数为返回的项目即select 与from之前的这一部分,三,四参数和上面一致,第五个参数是排序方式 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) //返回数据的mime类型 public String getType(Uri uri)
2.contentprovider使用的关键Universal Resource Identifier,简写为URI,方便的理解方式为web开发中的url类似的概念,就是提供数据的访问“链接”,分三部分组成,”content://”,数据路径,ID标志符,android提供了两个用以操作uri的类UriMatcher 和ContentUris 。
一,UriMatcher
UriMatcher的主要作用是用来初始化Uri
初始化方法如下,第一步:
UriMatcher sMatcher=new UriMatcher(UriMatcher.NO_MATCH);;
第二步,注册所需的URI,第一个参数为authorities,第二个参数为路径,第三个参数为匹配码,是之后用来进行uri匹配时用到的值
sMatcher.addURI("com.example.ui_demo","mytable", 1); sMatcher.addURI("com.example.ui_demo","mytable"+"/#", 2);
第三步,URI匹配
Uri uri = Uri.parse("content://com.example.ui_demo/mytable/10"); switch (sMatcher.match(uri)) { case 1: //匹配码为1时的操作 case 2: //匹配码为2时的操作 default: throw new IllegalArgumentException("Unknown URI"+uri); }
二,ContentUris是用来从给定的uri中获取ID,或是添加ID用
1.为路径加上ID
Uri uri = Uri.parse("content://com.example.ui_demo/mytable"); Uri noteUri=ContentUris.withAppendedId(ur, 10);
则此时的URI为”content://com.example.ui_demo/mytable/10”
2.获取路径ID
Uri uri = Uri.parse("content://com.example.ui_demo/mytable/10"); long id=ContentUris.parseId(uri);
此时获取的ID值为10
三,实际使用时并不是直接使用contentProvider来操作数据,而是通过contentResolver来供外部应用操作contentProvider中的数据,实际的调用ContentProvider是在contentResolver的使用中进行的,而ContentProvider和ContenResolver是怎么关联起来的,可以参考下面的博客,博主写的很全面
http://blog.csdn.net/yangxinle137/article/details/5985608
四,完整的运用过程如下
1.创建一个数据库供contentprovider使用,这个在上一篇中有详细介绍,这里就不多说了
2.注册contentprovider
提供provider的程序,注意provider的注册需要卸载application内,而权限的注册需要放在之外
<permission android:name="com.example.ui_demo.dataprovider.READ_DATABASE" /> <permission android:name="com.example.ui_demo.dataprovider.WRITE_DATABASE" /> <provider android:name=".dataprovider" android:authorities="com.example.ui_demo" android:exported="true" android:readPermission="com.example.ui_demo.dataprovider.READ_DATABASE" android:writePermission="com.example.ui_demo.dataprovider.WRITE_DATABASE"></provider>
要使用provider的应用程序定义在application之外
<uses-permission android:name="com.example.ui_demo.dataprovider.READ_DATABASE"/> <uses-permission android:name="com.example.ui_demo.dataprovider.WRITE_DATABASE"/>
3.注册完毕后,就是重写contentprovider的方法了,重写过程如下
public class dataprovider extends ContentProvider {
//删除considerprovider数据
private final static String tag="ContentProvider";
private datasave database;
private SQLiteDatabase mydata=null;
private static final UriMatcher sMatcher;
static{
sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sMatcher.addURI("com.example.ui_demo","mytable", 1); sMatcher.addURI("com.example.ui_demo","mytable"+"/#", 2);
}
//构造函数,获得上下文
@Override
public int delete(Uri uri, String arg1, String[] arg2) {
// TODO Auto-generated method stub
Log.i(tag,"start delete provider data");
mydata= database.getDataBase();
int count = 0;
switch (sMatcher.match(uri)) {
case 1:
count = mydata.delete("mytable",arg1, arg2);
break;
case 2:
long id=C
14436
ontentUris.parseId(uri);
String where="ID="+id;
count= mydata.delete(table.TNAME,where,arg2);
break;
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
//获取considerprovider数据类型
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
Log.i(tag,"start get provider type");
switch (sMatcher.match(uri)) {
case 1:
return table.CONTENT_TYPE;
case 2:
return table.CONTENT_ITEM_TYPE;
default:
throw new IllegalArgumentException("Unknown URI"+uri);
}
}
//插入considerprovider数据
@Override
public Uri insert(Uri uri, ContentValues value) {
// TODO Auto-generated method stub
Log.i(tag,"start insert provider data");
mydata=database.getDataBase();
switch (sMatcher.match(uri)) {
case 1:
Log.i(tag,"start insert data");
try{
mydata.insert(table.TNAME, null, value);//返回第几行
}catch(Exception e){
Log.i(tag,e.getMessage());
}
long id=(Integer) value.get("ID");
Uri ur=Uri.parse("content://com.example.ui_demo/mydata");
//添加id
Uri noteUri=ContentUris.withAppendedId(ur, id);
this.getContext().getContentResolver().notifyChange(noteUri, null);
return noteUri;
default:
throw new IllegalArgumentException("Unknown URI"+uri);
}
}
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
Log.i(tag,"start create provider");
//打开数据库,参数上下文,数据库名,工厂类,数据库版本
database=new datasave(this.getContext());
database.create("mytable");
return false;
}
//获取considerprovider数据
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
// TODO Auto-generated method stub
Log.i(tag,"start query provider data");
mydata=database.getDataBase();
Cursor cur=null;
switch (sMatcher.match(uri)) {
case 1:
Log.i(tag,"start query mytable provider data");
cur=mydata.query(table.TNAME,projection,selection,selectionArgs,null,null,null);
break;
case 2:
long id = ContentUris.parseId(uri);
Log.i(tag,"start query mytable id provider data"+id);
String sql="select * from mytable where ID ="+id;
//String where = "ID=" + id;
// cur=mydata.query(table.TNAME,projection,where,selectionArgs,null,null,null);
cur=mydata.rawQuery(sql, new String[]{});
break;
default:
throw new IllegalArgumentException("Unknown URI1"+uri);
}
return cur;
}
@Override
public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
// TODO Auto-generated method stub
Log.i(tag,"start update provider data");
return 0;
}
}
4.通过contentResolver来操作数据
contentResolver=ShareDemo.this.getContentResolver();//获取对象 Cursor cur=null; try{ cur=contentResolver.query(uri, null, null, null, null); }catch(Exception e){ Log.i("ContentProvider",e.getMessage()); } while(cur.moveToNext()){ //Toast.makeText(this,cur.getString(1)+"ok1", Toast.LENGTH_LONG).show(); list.add(cur.getString(0)); list.add(cur.getString(1)); //Toast.makeText(this,cur.getString(0)+"ok", Toast.LENGTH_LONG).show(); } listshow showlist=new listshow(ShareDemo.this,list); showlist.show();
示例代码
dataprovider.java
package com.example.ui_demo;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
public class dataprovider extends ContentProvider {
//删除considerprovider数据
private final static String tag="ContentProvider";
private Context context;
private datasave database;
private SQLiteDatabase mydata=null;
private static final UriMatcher sMatcher;
static{
sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sMatcher.addURI("com.example.ui_demo","mytable", 1); sMatcher.addURI("com.example.ui_demo","mytable"+"/#", 2);
}
//构造函数,获得上下文
@Override
public int delete(Uri uri, String arg1, String[] arg2) {
// TODO Auto-generated method stub
Log.i(tag,"start delete provider data");
mydata= database.getDataBase();
int count = 0;
switch (sMatcher.match(uri)) {
case 1:
count = mydata.delete("mytable",arg1, arg2);
break;
case 2:
long id=ContentUris.parseId(uri);
String where="ID="+id;
count= mydata.delete(table.TNAME,where,arg2);
break;
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
//获取considerprovider数据类型
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
Log.i(tag,"start get provider type");
switch (sMatcher.match(uri)) {
case 1:
return table.CONTENT_TYPE;
case 2:
return table.CONTENT_ITEM_TYPE;
default:
throw new IllegalArgumentException("Unknown URI"+uri);
}
}
//插入considerprovider数据
@Override
public Uri insert(Uri uri, ContentValues value) {
// TODO Auto-generated method stub
Log.i(tag,"start insert provider data");
mydata=database.getDataBase();
switch (sMatcher.match(uri)) {
case 1:
Log.i(tag,"start insert data");
try{
mydata.insert(table.TNAME, null, value);//返回第几行
}catch(Exception e){
Log.i(tag,e.getMessage());
}
long id=(Integer) value.get("ID");
Uri ur=Uri.parse("content://com.example.ui_demo/mydata");
//添加id
Uri noteUri=ContentUris.withAppendedId(ur, id);
this.getContext().getContentResolver().notifyChange(noteUri, null);
return noteUri;
default:
throw new IllegalArgumentException("Unknown URI"+uri);
}
}
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
Log.i(tag,"start create provider");
//打开数据库,参数上下文,数据库名,工厂类,数据库版本
database=new datasave(this.getContext());
database.create("mytable");
return false;
}
//获取considerprovider数据
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
// TODO Auto-generated method stub
Log.i(tag,"start query provider data");
mydata=database.getDataBase();
Cursor cur=null;
switch (sMatcher.match(uri)) {
case 1:
Log.i(tag,"start query mytable provider data");
cur=mydata.query(table.TNAME,projection,selection,selectionArgs,null,null,null);
break;
case 2:
long id = ContentUris.parseId(uri);
Log.i(tag,"start query mytable id provider data"+id);
String sql="select * from mytable where ID ="+id;
//String where = "ID=" + id;
// cur=mydata.query(table.TNAME,projection,where,selectionArgs,null,null,null);
cur=mydata.rawQuery(sql, new String[]{});
break;
default:
throw new IllegalArgumentException("Unknown URI1"+uri);
}
return cur;
}
@Override
public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
// TODO Auto-generated method stub
Log.i(tag,"start update provider data");
return 0;
}
//数据库类
public static class datasave{
private SQLiteDatabase dbase=null;
public datasave(Context context){
//打开数据库
Log.i(tag,"open or create database");
try{
dbase=context.openOrCreateDatabase("mydata.db",Context.MODE_PRIVATE, null);
}catch(Exception e){
Log.i(tag,e.getMessage());
}
}
//创建表
public void create(String TableName){
Log.i(tag,"create table if not exists");
try{
String create="CREATE TABLE"+" IF NOT EXISTS "+TableName+" (ID INTEGER,NAME TEXT)";
dbase.execSQL(create);
}catch(Exception e){
Log.i(tag,e.getMessage());
}
}
public void insert(String TableName,String []selections){
Log.i(tag,"insert table data");
try{
String insert="insert into "+TableName+" values(selections[0],selections[1]);";
dbase.execSQL(insert);
}catch(Exception e){
Log.i(tag,e.getMessage());
}
}
public void delete(String TableName){
Log.i(tag,"delete table data");
try{
String delete="DROP TABLE"+TableName;
dbase.execSQL(delete);
}catch(Exception e){
Log.i(tag,e.getMessage());
}
}
public SQLiteDatabase getDataBase(){
return this.dbase;
}
}
public static class table {
public static final String DBNAME = "mydata.db";
public static final String TNAME = "mytable";
public static final int VERSION = 3;
public static final String TID = "tid";
public static final String ID = "ID";
public static final String NAME = "NAME";
public static final String AUTOHORITY = "com.example_ui.demo";
public static final int ITEM = 1;
public static final int ITEM_ID = 2;
//匹配类型,如为MME类型返回CONTENT_TYPE,反之返回ITEM_TYPE
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/mytable";
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/mytable";
public static final Uri uri = Uri.parse("content://" + AUTOHORITY + "/mytable");
}
}
readotherdatabase.java
package com.example.readotherdatabase; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private TableLayout table=null; private ContentResolver contentResolver; private List<String> list=new ArrayList<String>(); private SQLiteDatabase mydata; private ListView listshow; private String []mysql={"读取","读取(ID)","删除","插入"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); table=(TableLayout)this.findViewById(R.id.item); contentResolver=MainActivity.this.getContentResolver(); listshow=(ListView)this.findViewById(R.id.listshowc); //Uri uri = Uri.parse("content://com.example.ui_demo/mytable"); myadapter m=new myadapter(this); listshow.setAdapter(m); } public void updataview(Uri uri){ Cursor cur=null; try{ cur=contentResolver.query(uri, null, null, null, null); }catch(Exception e){ Log.i("ContentProvider",e.getMessage()); } while(cur.moveToNext()){ //Toast.makeText(this,cur.getString(1)+"ok1", Toast.LENGTH_LONG).show(); list.add(cur.getString(0)); list.add(cur.getString(1)); //Toast.makeText(this,cur.getString(0)+"ok", Toast.LENGTH_LONG).show(); } listshow showlist=new listshow(MainActivity.this,list); showlist.show(); } public class myadapter extends BaseAdapter{ private Context context; public myadapter(Context context){ this.context=context; } @Override public int getCount() { // TODO Auto-generated method stub return mysql.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View vi, ViewGroup vg) { // TODO Auto-generated method stub Button button=new Button(MainActivity.this); button.setText(mysql[position]); button.setId(position); buttonclick m=new buttonclick(); button.setOnClickListener(m); return button; } } @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; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } public class buttonclick implements OnClickListener{ private int i=0; @Override public void onClick(View vi) { // TODO Auto-generated method stub if(vi.getId()==0){ //查询表 Uri uri = Uri.parse("content://com.example.ui_demo/mytable"); updataview(uri); }else if(vi.getId()==1){ //读取带ID Uri uri = Uri.parse("content://com.example.ui_demo/mytable/10"); updataview(uri); }else if(vi.getId()==2){ Uri uri=Uri.parse("content://com.example.ui_demo/mytable/11"); contentResolver.delete(uri, null, null); uri = Uri.parse("content://com.example.ui_demo/mytable"); updataview(uri); }else if(vi.getId()==3){ Uri uri=Uri.parse("content://com.example.ui_demo/mytable"); ContentValues value=new ContentValues(); value.put("ID",11); value.put("NAME","lianggong zhazha"); contentResolver.insert(uri, value); updataview(uri); } } } public class listshow{ private List<String> list; private Context context; public listshow(Context context,List<String> list){ this.context=context; this.list=list; } public void show(){ table.removeAllViews(); for(int i=0;i<list.size();i=i+2){ try{ TableRow row=new TableRow(context); TextView text=new TextView(context); text.setText(list.get(i).toString()); text.setId(i); TextView text1=new TextView(context); text1.setText(list.get(i+1).toString()); text1.setId(i+1); row.addView(text); row.addView(text1); table.addView(row); }catch(Exception e){ Toast.makeText(MainActivity.this,e.getMessage(), Toast.LENGTH_LONG).show(); } } } } }
相关文章推荐
- 【Android】组件生命周期
- ECClient红孩子android客户端源码分析之图片加载自动刷新listview
- <android>第一行代码其余章节
- Android性能测试工具Emmagee介绍
- IOS或者Android传递 含有emoji表情的文本到服务器之php处理方式
- Android
- Android Manifest合并
- Android学习笔记:Handler初步
- Android 5.1 长按power键流程分析
- Android一些关键函数和类的分析-ActivityManager
- Android Studio使用技巧
- 基于全志A20 android4.2平台如何支持三个SD卡
- Android开源项目分类汇总
- My Magic Android Tour —— 处女作
- Android Service 笔记
- Android SDK和ADT无法更新的解决办法
- Android实现双进程守护
- Android ListView和CheckBox应用之批量删除操作
- Android的事件处理
- android sdk更新hosts修改