今天学习的时候学到了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数据共享的更多相关文章

  1. Android简单开发的画画板

    Android开发画画板要考虑得几个问题如下: 1 屏幕画板.画笔如何绘制问题 2 用户手指触摸屏幕画板监听事件,以及对应的几种状态处理问题 3  保存图片到SD卡,以及在系统相册打开时自动加载刚才的 ...

  2. Android简单开发之 通用Adapter ViewHolder

    我们寻常使用Adapter的方式 public class BusbaseSearchApadter extends SimpleBaseApadter { private List<Busba ...

  3. Android项目开发全程(二)--Afinal用法简单介绍

    本篇博文接上篇的<Android项目开发全程(一)--创建工程>,主要介绍一下在本项目中用到的一个很重要的框架-Afinal,由于本系列博文重点是项目开发全程,所以在这里就先介绍一下本项目 ...

  4. Android艺术开发探索——第二章:IPC机制(下)

    Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvi ...

  5. Android软件安全开发实践(下)

    Android开发是当前最火的话题之一,但很少有人讨论这个领域的安全问题.本系列将分两期,探讨Android开发中常见的安全隐患和解决方案.第一期将从数据存储.网络通信.密码和认证策略这三个角度,带你 ...

  6. 转——Android应用开发性能优化完全分析

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...

  7. Android 应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  8. 【转】Android应用开发性能优化完全分析

    http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关 ...

  9. Android应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

随机推荐

  1. Flex 三态复选框

    在周末挤出了一点时间,写了一个三态复选框的组件,单独使用没有价值,不过集成到树之中可以很好的实现三态树,今天上午便把三态树组件也完成了,Flex自定义组件基本无所不能,此组件基于最新的Flex4.6( ...

  2. 【PL/SQL练习】基本的PL/SQL语句

    1.无变量匿名快 begin dbms_output.put_line('Hello World'); end; 2.有变量的匿名块,定义变量: declare v_ename ); v_sal ,) ...

  3. 启动obiee

    启动obiee:1.启动数据库第一步:打开Oracle监听$ lsnrctl start第二步:使用sysdab角色登录sqlplussqlplus / as sysdba第三步:启动数据库SQL&g ...

  4. java.lang.Exception: Socket bind failed: [730013] An attempt was made to acc

    在CMD命令行中启动运行startup.bat,启运程序总是闪退,查看日志发现如下错误: 26-Jan-2016 18:12:34.463 SEVERE [main] org.apache.coyot ...

  5. c++回调

    c++回调包含类函数回调和非类函数回调. 类函数回调,函数指针指向函数名称,需要带类作用域,调用时需要用到类指针. 如qt里面定义一个返回值为qbytearray的函数指针, typedef QByt ...

  6. WWF3入门<第一篇>

    工作流是什么东西?暂时还不是很弄得清除. 工作流是用来解决什么问题的?暂时只是形成了一个很模糊的概念,还没办法用语言描述出来. 一.入门范例 以VS2008为例,先来创建一个WWF程序. 在工具箱中, ...

  7. Atom markdown .md 编写格式技巧

    使用Atom预览markdown 1.打开任意.md文件(markdown源文件) 菜单栏File->Open file...(ctrl+o)打开文件: 2.windows下使用快捷键 ctrl ...

  8. hbase日常操作及维护

    一,基本命令: 建表:create 'testtable','coulmn1','coulmn2' 也可以建表时加coulmn的属性如:create 'testtable',{NAME => ' ...

  9. phalcon框架学习之view

    phalcon框架的view分多级:全局-控制器视图-动作视图.视图由上到下,按层级嵌套. 全局视图 默认全局视图为Views/index.html,所有的页面展示时,默认调用此页面,在这个页面中必须 ...

  10. CentOS Linux下一个tomcat起停,查看日志的shell script

    CentOS 的tomcat安装目录:/usr/local/tomcat vi MyTomcatUitl.sh          创建文件chmod u+x MyTomcatUtil.sh   赋执行 ...