17 一个ContentProvider的例子
服务端(ContentProvider)
目录结构图:
MainActivity.java:
package com.qf.day17_contentprovider_words_demo2; import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter; import com.qf.day17_contentprovider_words_demo2.db.MyOpenHelper; public class MainActivity extends Activity { private EditText etWord,etChina;
private ListView lv; private MyOpenHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); etWord = (EditText) findViewById(R.id.et_word);
etChina = (EditText) findViewById(R.id.et_china);
lv = (ListView) findViewById(R.id.lv); helper = new MyOpenHelper(MainActivity.this); getData();
} //点击事件 提交按钮
public void MyClick(View v){ String strWord = etWord.getText().toString().trim();
String strChina= etChina.getText().toString().trim();
String sql = "insert into tb_words(word,detail)values(?,?)";
helper.execData(sql, new String[]{strWord,strChina}); getData(); } public void getData(){ String sql = "select * from tb_words";
Cursor cursor = helper.queryData(sql, null); SimpleCursorAdapter adapter = new SimpleCursorAdapter(MainActivity.this,
R.layout.item, cursor,
new String[]{"word","detail"},
new int[]{R.id.tv_word,R.id.tv_china}, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); lv.setAdapter(adapter);
} }
MyOpenHelper.java(数据库类):
package com.qf.day17_contentprovider_words_demo2.db; import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper; public class MyOpenHelper extends SQLiteOpenHelper { private static final String NAME = "db_words.db";
private static final int VERSION = 1; private SQLiteDatabase db; public MyOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
public MyOpenHelper(Context context) {
super(context, NAME, null, VERSION);
// TODO Auto-generated constructor stub
db = getReadableDatabase();
} /**
* 查询
* @param sql
* @param selectionArgs
* @return
*/
public Cursor queryData(String sql, String[] selectionArgs){ Cursor cursor = db.rawQuery(sql, selectionArgs);
return cursor; } /**
* 增加 修改 删除
* @param sql
* @param bindArgs
*/
public boolean execData(String sql,Object[] bindArgs){
try {
if(bindArgs ==null){
db.execSQL(sql);
}else{
db.execSQL(sql, bindArgs);
} return true; } catch (Exception e) {
// TODO: handle exception
}
return false;
} @Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sql ="create table if not exists tb_words(_id integer primary key autoincrement,word,detail)";
//此表无作用只作为一个示范
String sql1 ="create table if not exists tb_newwords(_id integer primary key autoincrement,word,detail)";
db.execSQL(sql);
db.execSQL(sql1); } @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub } }
MyContentProvider
package com.qf.day17_contentprovider_words_demo2; import com.qf.day17_contentprovider_words_demo2.db.MyOpenHelper; 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; public class MyContentProvider extends ContentProvider{ private MyOpenHelper helper;
private SQLiteDatabase db; //com.qf.contentprovider_words.mycontentprovider 用于匹配意图的uri
private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); static{ /**第一个参数 :意图 和清单文件中的authorities 相同
* 第二个参数 :路径
* 第三个参数:对应uri对应编码
* 通配符 : * 任意文本 #数字
*
* 例子uriMatcher.addURI("aa.bb","cc/#",1)
* 例子uriMatcher.addURI("aa.bb","cc/*",2)
*
* 如果 在ContentResolver 的意图uri为 aa.bb.cc/3 那么跳转uriMatcher.addURI("aa.bb","cc/#",1)
*
*/
//在内容解析器中只需要 填写 uri即可 例子 : com.qf.contentprovider_words.mycontentprovider/words/123
//content://com.qf.contentprovider_words.mycontentprovider/words/h
uriMatcher.addURI("com.qf.contentprovider_words.mycontentprovider", "words", 1);
uriMatcher.addURI("com.qf.contentprovider_words.mycontentprovider", "newwords", 2);
uriMatcher.addURI("com.qf.contentprovider_words.mycontentprovider", "words/*", 3);//*匹配任意文本
uriMatcher.addURI("com.qf.contentprovider_words.mycontentprovider", "words_id/#", 4);//*匹配任意数字
uriMatcher.addURI("com.qf.contentprovider_words.mycontentprovider", "words_zh/*", 5);//*匹配任意中文 } @Override
public boolean onCreate() {
// TODO Auto-generated method stub
helper = new MyOpenHelper(getContext());
db = helper.getReadableDatabase();
return false;
} @Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
} @Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub Cursor cursor =null; switch (uriMatcher.match(uri)) {
case 1:
//tb_words表中所有数据
cursor = db.query("tb_words", projection, selection, selectionArgs, null, null, sortOrder); break;
case 2:
//tb_newwords表中所有数据
cursor = db.query("tb_newwords", projection, selection, selectionArgs, null, null, sortOrder); break;
case 3:
//tb_words表中符合条件 word
String data = uri.getLastPathSegment();//获取Uri最后的参数
cursor = db.query("tb_words", projection, "word like ?", new String[]{data+"%"}, null, null, sortOrder); break;
case 4:
//tb_words表中符合条件 _id
String data1 = uri.getLastPathSegment();//获取Uri最后的参数
cursor = db.query("tb_words", projection, "_id = ?", new String[]{data1+""}, null, null, sortOrder); break;
case 5: //tb_words表中符合条件 detail
String data2 = uri.getLastPathSegment();//获取Uri最后的参数
cursor = db.query("tb_words", projection, "detail like ?", new String[]{data2+"%"}, null, null, sortOrder); break; default:
break;
} return cursor;
} @Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub Uri resultUri = null;
switch (uriMatcher.match(uri)) {
case 1: long l = db.insert("tb_words", null, values);
/**
* 两种皆可返回正确id
*/
// resultUri = Uri.parse("content://com.qf.contentprovider_words.mycontentprovider/words/"+l);
resultUri = ContentUris.withAppendedId(uri, l);
break;
case 2:
long l1 = db.insert("tb_newwords", null, values);
/**
* 两种皆可返回正确id
*/
// resultUri = Uri.parse("content://com.qf.contentprovider_words.mycontentprovider/newwords/"+l1);
resultUri = ContentUris.withAppendedId(uri, l1);
break; default:
break;
}
return resultUri;
} @Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
int num =0;
switch (uriMatcher.match(uri)) {
case 1:
num = db.update("tb_words", values, selection, selectionArgs);
break;
case 2:
num = db.update("tb_newwords", values, selection, selectionArgs);
break; default:
break;
}
return num;
} @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
int num =0;
switch (uriMatcher.match(uri)) {
case 1:
num = db.delete("tb_words", selection, selectionArgs);
break;
case 2:
num = db.delete("tb_newwords", selection, selectionArgs);
break; default:
break;
}
return num;
} }
layout布局文件:
item<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/tv_word"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#f00"
android:textSize="20sp"
android:text="hello"
/>
<TextView
android:id="@+id/tv_china"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#00f"
android:textSize="16sp"
android:text="word"
/> </LinearLayout>
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <EditText
android:id="@+id/et_word"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入英文单词" />
<EditText
android:id="@+id/et_china"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入对应的意思" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="提交"
android:onClick="MyClick"
/> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#999900"
android:text="以下显示单词列表"
/> <ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#f00"
android:dividerHeight="1dp"
></ListView> </LinearLayout>
客户端
结构目录:
MainActivity.java:
package com.qf.day17_contentprovider_wordc_demo2; import java.util.regex.Pattern; import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter; public class MainActivity extends Activity { // //content://com.qf.contentprovider_words.mycontentprovider/words/
// uriMatcher.addURI("com.qf.contentprovider_words.mycontentprovider",
// "words", 1);
// uriMatcher.addURI("com.qf.contentprovider_words.mycontentprovider",
// "newwords", 2);
// uriMatcher.addURI("com.qf.contentprovider_words.mycontentprovider",
// "words/*", 3);//*匹配任意文本
// uriMatcher.addURI("com.qf.contentprovider_words.mycontentprovider",
// "words_id/#", 4);//*匹配任意数字
// uriMatcher.addURI("com.qf.contentprovider_words.mycontentprovider",
// "words_zh/*", 5);//*匹配任意中文
// private EditText etSearch;
private ListView lv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etSearch = (EditText) findViewById(R.id.et_search);
lv = (ListView) findViewById(R.id.lv);
} public void MyClick(View v) {
// 根据输入文本进行查询
String strdata = etSearch.getText().toString().trim(); getData(strdata); } // 查询方法
public void getData(String strdata) { ContentResolver resolver = getContentResolver();
Uri uriWords = Uri.parse("content://com.qf.contentprovider_words.mycontentprovider/words");
Uri uriWordsId = Uri.parse("content://com.qf.contentprovider_words.mycontentprovider/words_id");
Uri uriWordsZh = Uri.parse("content://com.qf.contentprovider_words.mycontentprovider/words_zh");
Cursor cursor = null;
if (TextUtils.isEmpty(strdata)) {// 什么也没输入 直接查询所有
cursor = resolver.query(uriWords, null, null, null, null);
} else {
if (isNumber(strdata)) {// 输入的数据 是否是数值
// content://com.qf.contentprovider_words.mycontentprovider/words_id/45
// 拼接id 123
uriWordsId = ContentUris.withAppendedId(uriWordsId, Long.parseLong(strdata));
cursor = resolver.query(uriWordsId, null, null, null, null);
} else {
if (isChina(strdata)) {// 是否是汉字
// 拼接中文 张
uriWordsZh = Uri.withAppendedPath(uriWordsZh, strdata);
cursor = resolver.query(uriWordsZh, null, null, null, null);
} else {
// 拼接英文字符串
uriWords = Uri.withAppendedPath(uriWords, strdata);
cursor = resolver.query(uriWords, null, null, null, null);
} }
} SimpleCursorAdapter adapter = new SimpleCursorAdapter(MainActivity.this, R.layout.item, cursor,
new String[] { "word", "detail" }, new int[] { R.id.tv_word, R.id.tv_china },
SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); lv.setAdapter(adapter); } // 判断是否是数字
public boolean isNumber(String data) {
Pattern pattern = Pattern.compile("[0-9]+");
return pattern.matcher(data).matches(); } // 判断是否是中文
public boolean isChina(String data) {
Pattern pattern = Pattern.compile("[\u4e00-\u9fa5]+");
return pattern.matcher(data).matches(); } }
layout布局:
activity_main.xml:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <EditText
android:id="@+id/et_search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入查询内容" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="提交"
android:onClick="MyClick"
/> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="以下展示查询内容"
android:background="#999900"
/>
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
></ListView> </LinearLayout>
item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/tv_word"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#f00"
android:textSize="20sp"
android:text="hello"
/>
<TextView
android:id="@+id/tv_china"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#00f"
android:textSize="16sp"
android:text="word"
/> </LinearLayout>
17 一个ContentProvider的例子的更多相关文章
- Spring-Context之一:一个简单的例子
很久之前就想系统的学习和掌握Spring框架,但是拖了很久都没有行动.现在趁着在外出差杂事不多,就花时间来由浅入深的研究下Spring框架.Spring框架这几年来已经发展成为一个巨无霸产品.从最初的 ...
- 高仿“点触验证码”做的一个静态Html例子
先上源码: <html> <head> <title>TouClick - Designed By MrChu</title> <meta htt ...
- 一个UWSGI的例子
摘要:uwsgi执行顺序:启动master进程,执行python脚本的公共代码(import同一层).然后生成worker进程,uwsgi.post_fork_hook=init_functions, ...
- Android 属性动画监听事件与一个菜单的例子
简单监听事件 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3 ...
- 《Java从入门到失业》第四章:类和对象(4.3):一个完整的例子带你深入类和对象
4.3一个完整的例子带你深入类和对象 到此为止,我们基本掌握了类和对象的基础知识,并且还学会了String类的基本使用,下面我想用一个实际的小例子,逐步来讨论类和对象的一些其他知识点. 4.3.1需求 ...
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
- 关于apriori算法的一个简单的例子
apriori算法是关联规则挖掘中很基础也很经典的一个算法,我认为很多教程出现大堆的公式不是很适合一个初学者理解.因此,本文列举一个简单的例子来演示下apriori算法的整个步骤. 下面这个表格是代表 ...
- 扩展Python模块系列(二)----一个简单的例子
本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...
- fitnesse - 一个简单的例子(slim)
fitnesse - 一个简单的例子(slim) 2017-09-30 目录1 编写测试代码(Fixture code)2 编写wiki page并运行 2.1 新建wikiPage 2.2 运行 ...
随机推荐
- [SDOI2010]古代猪文
题目背景 “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边海的那边的某片 ...
- sdut 2878 圆圈
[ 题目描述]现在有一个圆圈, 顺时针标号分别从 0 到 n-1, 每次等概率顺时针走一步或者逆时针走一步,即如果你在 i 号点,你有 1/2 概率走到((i-1)mod n)号点,1/2 概率走到( ...
- 51nod 1179 最大的最大公约数
1179 最大的最大公约数 题目来源: SGU 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给出N个正整数,找出N个数两两之间最大公约数的最大值.例如:N = ...
- hdu 3065 AC自动机(各子串出现的次数)
病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- [usaco6.1.1Postal Vans]
来自FallDream的博客,未经允许,请勿转载,谢谢. 给你一个4*n的棋盘,问从(1,1)出发恰好经过所有格子一次的走法数量.(n<=1000) 插头dp,用f[i][j][k]表示转移到第 ...
- bzoj 1217: [HNOI2003]消防局的设立
Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了 ...
- NFC Spy:基于Android 4.4及以上手机的非接智能卡跟踪仪
NFC Spy 用来查看读卡器和智能卡之间的指令.数据的交互传输过程,以便 NFC/HCE 开发者分析研究底层通讯协议,定位错误指令. 本程序要使用两部带有 NFC 硬件的 Android 手机,并且 ...
- Arduino抢答器
0.部分需要掌握的知识点和注意事项 (1)面包板的结构 (2)按键的结构:按键按下时,左右两侧连通:按键松开后,左右两侧断开,但1号与2号相连,3号与4号相连,即按键松开时,同侧不相连,相连不同侧. ...
- linux安装mysql数据库
安装mysql 1.下载MySQL的安装文件 安装MySQL需要下面两个文件: MySQL-server-4.0.23-0.i386.rpm MySQL-client-4.0.23-0.i386.rp ...
- java.lang.UnsatisfiedLinkError: D:\Tomcat\apache-tomcat-7.0.67\bin\tcnative-1.dll:
Can't load IA 32-bit .dll on a AMD 64-bit platform 错误原因 由错误提示可知,tcnative-1.dll是一个32位文件,但是运行在64位系统上 解 ...