您的位置:首页 > 移动开发 > Android开发

android学习笔记(七)——数据共享

2015-06-30 22:28 615 查看
sharedpreferences和文件虽然都能实现数据共享,但是却无法实现数据库的共享,所以android提供了contentProvider的方法来实现数据库的共享,下面就来介绍contentprovider

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();
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: