今天学习的时候学到了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. GLib基础

    实用功能 GLib中包含了近二十种实用功能,从简单的字符处理到初学者很难理解的XML解析功能,这里介绍两种较简单的:随机数和计时. 下面代码演示如何产生1-100之间的随机整数和演示如何计算30000 ...

  2. 洛谷P2722 总分 Score Inflation

    P2722 总分 Score Inflation 184通过 295提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 关于算法 题目背景 学生在我们USACO的 ...

  3. velocity freemarker比较

    相比较 FreeMarker 而言,Velocity 更加简单.轻量级,但它的功能却没有 FreeMarker 那么强大. 对于大部分的应用来说,使用 FreeMarker 比 Velocity 更简 ...

  4. [python 2.7.5] 实现配置文件的读写

    import ConfigParser config = ConfigParser.RawConfigParser() # When adding sections or items, add the ...

  5. (笔记)angular 单选选项卡

  6. LDAP介绍

    摘自: http://www.blogjava.net/allen-zhe/archive/2007/03/19/104740.html LDAP介绍 原文:http://ldapman.org/ar ...

  7. XML内容作为String字符串读取报错

    解决方案:    1.把头信息<?xml version='1.0' encoding='UTF-8'?>,但是内容会丢失部分: 2.用XmlDocument解析就OK.   正确代码: ...

  8. JAVA编程思想第一题出现错误

    //: object/E01_DefaultInitialization.java public class E01_DefaultInitialization{ int i ; char c ; p ...

  9. DPDK中断机制简析

    DPDK通过在线程中使用epoll模型,监听UIO设备的事件,来模拟操作系统的中断处理. 一.中断初始化 在rte_eal_intr_init()函数中初始化中断.具体如下: 1.首先初始化intr_ ...

  10. html/css 关于脱离文档流的几种情况

    所谓的文档流 顾名思义就是按照顺序流下来,指的是html元素从上往下 从左往右的流式排列, 比如说写了5个Div,正常的文档流是依次显示这5个div块: 脱离文档流就是指它所显示的位置和文档代码就不一 ...