Android--简单开发和使用ContentProvider数据共享
今天学习的时候学到了ContentProvider数据共享这个东东,所以自己写了个小例子:
我们要开发ContentProvider的话,需要创建一个类去继承ContentProvider,里面会让你重写四个方法,这四个方法就是数据共享用到的方法
包括SQLite的插入、查询、删除。。
所以,如何共享我们的数据,就看你如何重写这几个方法。
下面是操作步骤,我是用Android studio写的
1、先看工程结构

2、我们建立一个继承ContentProvider的类,创建步骤(右键→new→othet→Provider)
3、ContentProvider共享的数据是SQLite里面的数据,为了方便我把创建SQLite的数据库和创建表的操作也写在了ContentProvider的onCreate()方法里面了
代码
package provider; import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri; import toolclass.MySQLiteOpenHelper; public class MyContentProvider extends ContentProvider { private static final String AUTHORITY = "com.example.fanlei.mycontentprovider";//地址
private static final String DB_FILE = "friends.db";//数据库名称
private static final String DB_TABLE = "friends"; //表名
private static final int URI_ROOT = -1;
private static final int DB_TABLE_FRIENDS = 1;
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + DB_TABLE);//Uri所对应的资源
private static final UriMatcher uriMatcher = new UriMatcher(URI_ROOT);//检查传过来的Uri
static {
uriMatcher.addURI(AUTHORITY,DB_TABLE,DB_TABLE_FRIENDS);
}
private MySQLiteOpenHelper helper;
private SQLiteDatabase db; public MyContentProvider() { } @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// Implement this to handle requests to delete one or more rows.
throw new UnsupportedOperationException("Not yet implemented");
} @Override
public String getType(Uri uri) {
// TODO: Implement this to handle requests for the MIME type of the data
// at the given URI.
throw new UnsupportedOperationException("Not yet implemented");
} @Override
public Uri insert(Uri uri, ContentValues values) {
//检查传过来的Uri是否是正确的,若不正确,则抛出异常
if (uriMatcher.match(uri) != DB_TABLE_FRIENDS){
throw new IllegalArgumentException("Unknown URI:" + uri);
}
Long rawId = db.insert(DB_TABLE,null,values);
Uri returnUri = ContentUris.withAppendedId(CONTENT_URI,rawId);
getContext().getContentResolver().notifyChange(returnUri,null);
return returnUri;
} @Override
public boolean onCreate() {
helper = new MySQLiteOpenHelper(getContext(),DB_FILE,null,1);
db = helper.getWritableDatabase();
String sql = "CREATE TABLE IF NOT EXISTS " + DB_TABLE +"(" +
"_id primary key," +
"name text," +
"sexId text," +
"address text);";
db.execSQL(sql);
return true;
} @Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
//检查传过来的Uri是否是正确的,若不正确,则抛出异常
if (uriMatcher.match(uri) != DB_TABLE_FRIENDS){
throw new IllegalArgumentException("Unknown URI:" + uri);
}
Cursor cursor = db.query(true,DB_TABLE,projection,selection,selectionArgs,null,null,sortOrder,null);
cursor.setNotificationUri(getContext().getContentResolver(),uri);
return cursor;
} @Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO: Implement this to handle requests to update one or more rows.
throw new UnsupportedOperationException("Not yet implemented");
}
}
其实,ContentProvider里面重写的方法也是封装了SQLiteDataBase的方法的操作,只不过他需要一个具体的Uri去指向我们具体的资源。
ContentProvider开发完成后,我在主函数里面调用了我们写的这个ContentProvider里面的方法,布局什么的都很简单。
我只是插入了数据,查询数据
下面是主函数:
package com.example.fanlei.mycontentproviderdemo; import android.annotation.TargetApi;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import provider.MyContentProvider; public class MainActivity2 extends ActionBarActivity { private ContentResolver contentResolver;
private Uri uri; private EditText et_1,et_2,et_3;
private Button btn_1,btn_2; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_activity2);
contentResolver = getContentResolver();
uri = MyContentProvider.CONTENT_URI; et_1 = (EditText) findViewById(R.id.et_1);
et_2 = (EditText) findViewById(R.id.et_2);
et_3 = (EditText) findViewById(R.id.et_3); btn_1 = (Button) findViewById(R.id.btn_1);
btn_2 = (Button) findViewById(R.id.btn_2);
//加入
btn_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ContentValues cv = new ContentValues();//键值 就是 列名
cv.put("name",et_1.getText().toString());
cv.put("sexId",et_2.getText().toString());
cv.put("address",et_3.getText().toString()); contentResolver.insert(uri,cv);
Toast.makeText(MainActivity2.this,"加入成功",Toast.LENGTH_SHORT).show();
}
});
//查询
btn_2.setOnClickListener(new View.OnClickListener() {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onClick(View v) {
Cursor cursor = contentResolver.query(uri,null,"name like ?",new String[]{"%23%"},null,null);
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String sexId = cursor.getString(cursor.getColumnIndex("sexId"));
String address = cursor.getString(cursor.getColumnIndex("address")); Log.d("asdasd",name+"^^"+sexId+"^^"+address); }
}
});
}
}
====================================以上是简单的开发=======================================
下面是使用我们上面的工程创建的ContentProvider
先看工程结构:

我这里建立了一个工具类去存放上一个工程Uri。
布局什么的都很简单,就一个TextView和Button,就不放了。
下面是主函数的代码
package com.example.fanlei.textmycontentproviderdemo; import android.content.ContentResolver;
import android.database.ContentObserver;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; import provider.PeopleInfoProvider; public class MainActivity extends ActionBarActivity { private TextView tv_show;
private Button button; private ContentResolver contentResolver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contentResolver = getContentResolver(); tv_show = (TextView) findViewById(R.id.tv_show);
button = (Button) findViewById(R.id.btn); button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Cursor cursor = contentResolver.query(PeopleInfoProvider.CONTENT_URI,null,null,null,null);
StringBuilder sb = new StringBuilder();
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String sexId = cursor.getString(cursor.getColumnIndex("sexId"));
String address = cursor.getString(cursor.getColumnIndex("address"));
sb.append(name).append(sexId).append(address);
}
tv_show.setText(sb.toString());
}
}); contentResolver.registerContentObserver(PeopleInfoProvider.CONTENT_URI,true,new MyObserver(new Handler()));
} private class MyObserver extends ContentObserver{
/**
* Creates a content observer.
* @param handler The handler to run {@link #onChange} on, or null if none.
*/
public MyObserver(Handler handler) {
super(handler);
} @Override
public void onChange(boolean selfChange) {
super.onChange(selfChange); Cursor cursor = contentResolver.query(PeopleInfoProvider.CONTENT_URI,null,null,null,null);
StringBuilder sb = new StringBuilder();
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String sexId = cursor.getString(cursor.getColumnIndex("sexId"));
String address = cursor.getString(cursor.getColumnIndex("address"));
sb.append(name).append(sexId).append(address);
Log.d("-----update----",sb.toString());
}
tv_show.setText(sb.toString());
}
}
}
对了,这里我写了一个内部类去继承了ContentObserver这个类,它的作用就是当共享的数据发生改变时,就会触发这个方法。
Android--简单开发和使用ContentProvider数据共享的更多相关文章
- Android简单开发的画画板
Android开发画画板要考虑得几个问题如下: 1 屏幕画板.画笔如何绘制问题 2 用户手指触摸屏幕画板监听事件,以及对应的几种状态处理问题 3 保存图片到SD卡,以及在系统相册打开时自动加载刚才的 ...
- Android简单开发之 通用Adapter ViewHolder
我们寻常使用Adapter的方式 public class BusbaseSearchApadter extends SimpleBaseApadter { private List<Busba ...
- Android项目开发全程(二)--Afinal用法简单介绍
本篇博文接上篇的<Android项目开发全程(一)--创建工程>,主要介绍一下在本项目中用到的一个很重要的框架-Afinal,由于本系列博文重点是项目开发全程,所以在这里就先介绍一下本项目 ...
- Android艺术开发探索——第二章:IPC机制(下)
Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvi ...
- Android软件安全开发实践(下)
Android开发是当前最火的话题之一,但很少有人讨论这个领域的安全问题.本系列将分两期,探讨Android开发中常见的安全隐患和解决方案.第一期将从数据存储.网络通信.密码和认证策略这三个角度,带你 ...
- 转——Android应用开发性能优化完全分析
[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...
- Android 应用开发性能优化完全分析
1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...
- 【转】Android应用开发性能优化完全分析
http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关 ...
- Android应用开发性能优化完全分析
1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...
随机推荐
- QTP 场景恢复– 函数调用
创建自动化测试是为了实现无人值守下运行,但也给开发人员带来一些问题.假如你离开办公室前启动测试,想要让它通宵运行.然而,由于不可预见的错误,您的测试会在某一点停止,中断了测试结果.因此QTP中引入场景 ...
- Solum入门知识(编辑中)
概要 参考:https://wiki.openstack.org/wiki/Solum An OpenStack project designed to make cloud services eas ...
- PostMessage与SendMessage的区别(二)
在做基于窗口的Windows程序的时候,我们避免不了要向窗口发送消息,有两种方式,一种是PostMessage,另外一种是SendMessage.关于这两个宏,我是通过狠狠的看MSDN才搞明白的,那里 ...
- AX 利用windows粘贴板功能实现批量数据快速导出EXCEL
static void test(Args _args) { int lineNum; int titleLines; SysExcelApplication excel; SysExcelWorkb ...
- SPSS时间序列:频谱分析
一.频谱分析(分析-预测-频谱分析) “频谱图”过程用于标识时间序列中的周期行为.它不需要分析一个时间点与下一个时间点之间的变异,只要按不同频率的周期性成分分析整体序列的变异.平滑序列在低频率具有更强 ...
- Landsat 8 OLI_TIRS 卫星数字产品
产品描述 2013 年2月11日,美国航空航天局(NASA) 成功发射Landsat-8卫星.Landsat-8卫星上携带两个传感器,分别是OLI陆地成像仪(Operation ...
- Linq to XML---网站地图和RSS Feed(ASP.NET的SEO)
本系列目录网站地图的作用是让搜索引擎尽快的,更多的收录网站的各个网页. 这里我们首先要明白一个基本的原理,搜索引擎的爬行方式.整个互联网就像一张纵横交错的"网":网的各个节点 ...
- Windows phone 8 学习笔记(8) 定位地图导航(转)
Windows phone 8 已经不使用自家的bing地图,新地图控件可以指定制图模式.视图等.bing地图的定位误差比较大,在模拟器中测试新地图貌似比较理想.本节主要讲解下位置服务以及新地图控件的 ...
- webstorm & phpstorm破解
webstorm: http://idea.qinxi1992.cn/ http://idea.goxz.gq http://v2mc.net:1017 http://idea.imsxm.com h ...
- sqlserver分区表实践:对时间分区表自动进行管理
项目问题:有一张日志表,插入和查询为主,每天记录数据为200多万,大小为2G-4G之间.一开始开发人员使用delete语句手动删除,保留7天数据,经常造成阻塞和性能瓶颈.但是如果不删除数据随着表越来越 ...