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);//检查传过来的Uristatic {uriMatcher.addURI(AUTHORITY,DB_TABLE,DB_TABLE_FRIENDS);}private MySQLiteOpenHelper helper;private SQLiteDatabase db;public MyContentProvider() {}@Overridepublic 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");}@Overridepublic 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");}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;@Overrideprotected 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() {@Overridepublic 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)@Overridepublic 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;@Overrideprotected 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() {@Overridepublic 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);}@Overridepublic 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这个类,它的作用就是当共享的数据发生改变时,就会触发这个方法。

转载于:https://www.cnblogs.com/819158327fan/p/4939123.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ECharts数据图表系统? 5分钟上手!

目录: 前言简介方法一:模块化单文件引入(推荐)方法二:标签式单文件引入【前言】 最近在捣鼓各种插件各种框架,发现这个ECharts还是比较不错的,文档也挺全的,还是中文的,给大家推荐一下。 这篇文…

Solr-5.3.1安装配置

Solr-5.3.1安装配置官方网站:http://lucene.apache.org/solr/http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlhttp://lucene.apache.org/solr/quickstart.html环境:CentOS6 x64Solr-5.3.1从Solr5.0开始,Solr不再发布为在任何…

EF for Firebird

今天用了Firebird,记录下怎么用,不然下次给忘记了 1.官网下载包 1.DDEXProvider-3.0.1.0.msi 2.FirebirdSql.Data.FirebirdClient-4.6.2.0.msi 备注: 1.发现DDEXProvider 与 FirebirdSql.Data.FirebirdClient安装有先后顺序 1.如果中间出现了…

(接口)银联证书上传被修改的问题和读取证书的绝对路径问题

最近在做对接银联的支付接口。相对于支付宝、微信支付,银联支付接口应该是做的最完美的了。银联支付平台提供了足够详细的接口文档,接口demo,常见问题解决方案。 更人性化的是,个人可以免费注册一个商家账号,提供给你免…

MST:Bad Cowtractors(POJ 2377)

坏的牛圈建筑 题目大意:就是现在农夫又要牛修建牛栏了,但是农夫想不给钱,于是牛就想设计一个最大的花费的牛圈给他,牛圈的修理费用主要是用在连接牛圈上 这一题很简单了,就是找最大生成树,把Kruskal算法改一…

第4章 maven依赖特性

第4章 maven依赖特性 本章详细介绍maven的依赖特性和依赖范围,如何排除依赖。 4.1 什么是依赖传递 举个例子 在非maven项目中,你需要使用spring功能,你会想到导入spring的jar包,那么,srping又需要其他依赖jar包支持&a…

lintcode :Integer to Roman 整数转罗马数字

题目 整数转罗马数字 给定一个整数,将其转换成罗马数字。 返回的结果要求在1-3999的范围内。 样例 4 -> IV 12 -> XII 21 -> XXI 99 -> XCIX 更多案例,请戳 http://literacy.kent.edu/Minigrants/Cinci/romanchart.htm 说明 什么是 罗马数字…

VRRP协议具体解释

转帖:http://blog.chinaunix.net/space.php?uid11654074&doblog&id2857384 Contents Page 文件夹 入木三分学网络…

WPF笔记(1.1 WPF基础)——Hello,WPF!

WPF笔记(1.1 WPF基础)——Hello,WPF! 原文:WPF笔记(1.1 WPF基础)——Hello,WPF!Example 1-1. Minimal C# WPF application//MyApp.csusingSystem;usingSystem.Windows; //the root WPF namespacenamespaceMyFirstAvalonApp { cla…

c#入门系列——类和对象的代码实现

面向对象 说起面向对象,大家因该都听说过,也知道是一个编程的方法,简称oop技术。它将对象的算法和数据结构看作一个整体,而一个程序就是由多个对象结合的整体。这样做可以提高代码的复用率,提高了软件的可维护性。 属性…

安卓TCP通信版本2

PC做服务器,安卓做客户端。 安卓获取输入框的内容并发送,然后等待接收服务器的消息 服务器先行开启,接收到客户端的数据,然后回复消息。 实现了对线程类的封装,通过按钮启动线程发送并接收 服务器代码(java…

简述WebService的使用(一)

环境: vs版本:vs2013 windows版本:win7 IIS版本:IIS7.0 (如果觉得对您有用,请点击右下角【推荐】一下,让更多人看到,谢谢) 配置环境: 主要针对于IIS 首先&…

透过WinDBG的视角看String

摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的. 本文将侧重在通过WinDBG来观察String在进程内的布局, 以此来解释C# String的一些特性. 问题 C# Stri…

ueditor富文本编辑器 修改框宽度和高度的方法

在使用ueditor的时候&#xff0c;用的textarea <textarea name"content" id"myEditor">这里写这条规则的回复内容</textarea> 给它加style"width:300" 属性的时候&#xff0c;发现不起作用。 正确的方法应该是&#xff1a; <scri…

Win32ASM学习[9]: 标志寄存器

TF(Trap Flag)——位8&#xff0c;跟踪标志。置1 则开启单步执行调试模式&#xff0c;置0 则关闭。在单步执行模式下&#xff0c;处理器在每条指令后产生一个调试异常&#xff0c;这样在每条指令执行后都可以查看执行程序的状态。如果程序用POPF、POPFD 或者ET 指令设置TF 标志…

JavaScript消息框

1.警告框 function myTest(){alert("这里的内容会弹出");} 2.确认框 其返回的值是 true 或 false 。 function myTest(){confirm("这里的内容会弹出");} 3.提示框 prompt prompt(参数1&#xff0c;参数2)&#xff1a;其参数1 是显示提示要输入的信息&…

.Net 事务

在分布式应用程序中&#xff0c;不可避免地会经常使用到事务控制。事务有一个开头和一个结尾&#xff0c;它们指定了事务的边界&#xff0c;事务在其边界之内可以跨越进程和计算机。事务边界内的所有资源都参与同一个事务。要维护事务边界内资源间的一致性&#xff0c;事务必须…

Android WifiDisplay分析一:相关Service的启动

网址&#xff1a;http://www.2cto.com/kf/201404/290996.html 最近在学习Android 4.4上面的WifiDisplay(Miracast)相关的模块&#xff0c;这里先从WifiDisplay用到的各个Service讲起&#xff0c;然后再从WifiDisplaySettings里面讲解打开wfd的流程。首先看下面的主要几个Servic…

Cortex-A15 Memory Hierarchy

ARM 平台为实现速度和成本的平衡&#xff0c;使用多个层次的内存架构。对于多核 CPU 组成的 SOC&#xff0c;每个CPU 内部都有一组高速缓存&#xff0c;包含&#xff1a;ICache、DCache 和 TLB。多个 CPU 共享一个更大的 L2 缓存。L2缓存再和 CPU 外部的DDR3 内存交互。ICache …