服务端(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的例子的更多相关文章

  1. Spring-Context之一:一个简单的例子

    很久之前就想系统的学习和掌握Spring框架,但是拖了很久都没有行动.现在趁着在外出差杂事不多,就花时间来由浅入深的研究下Spring框架.Spring框架这几年来已经发展成为一个巨无霸产品.从最初的 ...

  2. 高仿“点触验证码”做的一个静态Html例子

    先上源码: <html> <head> <title>TouClick - Designed By MrChu</title> <meta htt ...

  3. 一个UWSGI的例子

    摘要:uwsgi执行顺序:启动master进程,执行python脚本的公共代码(import同一层).然后生成worker进程,uwsgi.post_fork_hook=init_functions, ...

  4. 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 ...

  5. 《Java从入门到失业》第四章:类和对象(4.3):一个完整的例子带你深入类和对象

    4.3一个完整的例子带你深入类和对象 到此为止,我们基本掌握了类和对象的基础知识,并且还学会了String类的基本使用,下面我想用一个实际的小例子,逐步来讨论类和对象的一些其他知识点. 4.3.1需求 ...

  6. 用一个简单的例子来理解python高阶函数

    ============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...

  7. 关于apriori算法的一个简单的例子

    apriori算法是关联规则挖掘中很基础也很经典的一个算法,我认为很多教程出现大堆的公式不是很适合一个初学者理解.因此,本文列举一个简单的例子来演示下apriori算法的整个步骤. 下面这个表格是代表 ...

  8. 扩展Python模块系列(二)----一个简单的例子

    本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...

  9. fitnesse - 一个简单的例子(slim)

    fitnesse - 一个简单的例子(slim) 2017-09-30 目录1 编写测试代码(Fixture code)2 编写wiki page并运行  2.1 新建wikiPage  2.2 运行 ...

随机推荐

  1. 【bzoj4444 scoi2015】国旗计划

    题目描述 A 国正在开展一项伟大的计划 —— 国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了 NN 名优秀的边防 ...

  2. [UOJ UR #4追击圣诞老人]

    来自FallDream的博客,未经允许,请勿转载, 谢谢. 传送门 考虑直接维护一个堆,然后往里面丢链,并且取出k个堆顶就行了. 然后就需要分类讨论啥的,给你的三个点变成两条链,每次取出一条链之后选择 ...

  3. poj 3693 后缀数组 重复次数最多的连续重复子串

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8669   Acc ...

  4. NOIWC颓废记

    NOIWC大概就干了3件事情:吃.睡.浪. 吃: 目测绍兴一中的饭比二中的好吃多了,每天都有挺多的肉菜,还有一些甜品,而且是自助,不错的,但是一个不好的是排队时间太长了,于是我这么珍惜时间急着回宿舍的 ...

  5. JVM指令集介绍

    转载自:http://glutinit.iteye.com/blog/1263446 延伸参考 JVM接收参数和方法调用 void spin() {    int   i;    for (i = 0 ...

  6. Spring AOP @Around @Before @After 区别

    此段小代码演示了spring aop中@Around @Before @After三个注解的区别@Before是在所拦截方法执行之前执行一段逻辑.@After 是在所拦截方法执行之后执行一段逻辑.@A ...

  7. Vue.js + Webpack

    vue.js Vue.js是一个构建数据驱动的 web 界面的库.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件 以上是Vue.js官方定义,故名思议,以数据驱动视 ...

  8. Linux下安装 mysql 5.7

    安装环境:系统是 centos6.5 1.下载 下载地址:https://dev.mysql.com/downloads/file/?id=467556 下载版本:我这里选择的57.17,通用版,li ...

  9. 使用CSS让多出来的字变为省略号

    <style> .text1 { width:200px; overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellips ...

  10. Codeforces Round #417 (Div. 2)-A. Sagheer and Crossroad

    [题意概述] 在一个十字路口 ,给定红绿灯的情况, 按逆时针方向一次给出各个路口的左转,直行,右转,以及行人车道,判断汽车是否有可能撞到行人 [题目分析] 需要在逻辑上清晰,只需要把所有情况列出来即可 ...