自定义ContentProvider

自定义ContentProvider随时随地阅读更多技术实战干货 获取项目源码 学习资料 请关注源代码社区公众号 ydmsq666 在前面调用系统 ContentProvi 实现了管理联系人和多媒体内容 而有的时候 我们需要自己定义 ContentProvi 供别人使用 下面我们实现一个简单的自定义 ContentProvi 实现对数据

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

自定义ContentProvider

在前面调用系统ContentProvider实现了管理联系人和多媒体内容,而有的时候,我们需要自己定义ContentProvider供别人使用,下面我们实现一个简单的自定义ContentProvider,实现对数据库的增、删、改、查功能,为了方便阅读,数据仍是手动写死的,实际中应该根据业务需求从其他地方动态获取,代码如下:

主界面:

package com.lovo.studentmanagesystem; import com.lovo.provider.Student; import android.app.Activity; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.TextView; public class ContentProviderTest extends Activity { private TextView show; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.content_provider); show = (TextView) findViewById(R.id.content_provider_tv_show); } public void click(View v) { ContentValues values = new ContentValues(); if (v.getId() == R.id.content_provider_btn_add) { // 根据指定学生信息添加学生 values.put(Student.Data.NAME, "张无忌"); values.put(Student.Data.AGE, 23); values.put(Student.Data.SEX, "男"); getContentResolver().insert(Student.Data.CONTENT_URI, values); } else if (v.getId() == R.id.content_provider_btn_del) { // 根据指定ID删除学生 Uri uri = ContentUris.withAppendedId(Student.Data.CONTENT_URI, 3); getContentResolver().delete(uri, null, null); } else if (v.getId() == R.id.content_provider_btn_update) { // 根据指定ID修改学生信息 Uri uri = ContentUris.withAppendedId(Student.Data.CONTENT_URI, 1); values.put(Student.Data.NAME, "元芳"); values.put(Student.Data.AGE, 28); values.put(Student.Data.SEX, "男"); getContentResolver().update(uri, values, null, null); } else if (v.getId() == R.id.content_provider_btn_find) { // 查询所有学生信息 Cursor cursor = this.getContentResolver().query( Student.Data.CONTENT_URI, null, null, null, null); // 根据指定ID查询学生信息 // Uri uri = ContentUris.withAppendedId(Student.Data.CONTENT_URI, // 1); // Cursor cursor = this.getContentResolver().query(uri, null, null, // null, null); StringBuffer sb = new StringBuffer(); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex(Student.Data._ID)); String name = cursor.getString(cursor .getColumnIndex(Student.Data.NAME)); String sex = cursor.getString(cursor .getColumnIndex(Student.Data.SEX)); int age = cursor .getInt(cursor.getColumnIndex(Student.Data.AGE)); sb.append("此学生ID是:" + id + " " + "姓名是:" + name + " " + "性别是:" + sex + " " + "年龄是:" + age + "\n"); } show.setText(sb.toString()); } } } 
package com.lovo.provider; import com.lovo.dao.DBUtil; 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 StudentContentProvider extends ContentProvider { private UriMatcher uriMatcher; private SQLiteDatabase db; @Override public boolean onCreate() { // 创建注册Uri的工具类 uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI( "com.lovo.studentmanagesystem.StudentContentProvider", "student", 1); // 任何uri后面有内容的都会被注册成标示2。比如content://com.lovo.studentmanagesystem/student/1 uriMatcher.addURI( "com.lovo.studentmanagesystem.StudentContentProvider", "student/#", 2); db = DBUtil.getInstance(this.getContext()); return true; } @Override public Uri insert(Uri uri, ContentValues values) { long id = db.insert("t_stu", null, values); // 将id附加到Uri后面 if (id >= 0) { uri = ContentUris.withAppendedId(uri, id); return uri; } return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int row = 0; // 解析传过来的uri switch (uriMatcher.match(uri)) { case 1: row = db.delete("t_stu", selection, selectionArgs); break; case 2: long id = ContentUris.parseId(uri); if (selection == null) { selection = Student.Data._ID + "=" + id; } else { selection = selection + " and " + Student.Data._ID + "=" + id; } row = db.delete("t_stu", selection, selectionArgs); break; default: break; } return row; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int row = 0; // 解析传过来的uri switch (uriMatcher.match(uri)) { case 1: row = db.update("t_stu", values, selection, selectionArgs); break; case 2: long id = ContentUris.parseId(uri); if (selection == null) { selection = Student.Data._ID + "=" + id; } else { selection = selection + " and " + Student.Data._ID + "=" + id; } row = db.update("t_stu", values, selection, selectionArgs); break; default: break; } return row; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Cursor cursor = null; // 解析传过来的uri switch (uriMatcher.match(uri)) { case 1: cursor = db.query("t_stu", projection, selection, selectionArgs, null, null, sortOrder); break; case 2: // 从uri中获取id long id = ContentUris.parseId(uri); if (selection == null) { selection = "_id=" + id; } else { selection = selection + " and _id=" + id; } cursor = db.query("t_stu", projection, selection, selectionArgs, null, null, sortOrder); break; default: break; } return cursor; } @Override public String getType(Uri uri) { return null; } } 
package com.lovo.provider; import android.net.Uri; import android.provider.BaseColumns; / * 定义和Student相关的常量值 * * @author Administrator * */ public class Student { public static final String AUTHORITY = "com.lovo.studentmanagesystem.StudentContentProvider"; public static final class Data implements BaseColumns { public static final String NAME = "s_userName"; public static final String AGE = "s_age"; public static final String SEX = "s_sex"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/student"); } } 

SQLiteOpenHelper的子类DBUtil:

package com.lovo.dao; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class DBUtil extends SQLiteOpenHelper { private static DBUtil dbUtil; private DBUtil(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } public static SQLiteDatabase getInstance(Context context) { if (dbUtil == null) { dbUtil = new DBUtil(context, "student", null, 1); } return dbUtil.getReadableDatabase(); } @Override public void onCreate(SQLiteDatabase db) { try { db.execSQL("create table t_stu(_id integer primary key,s_userName text,s_age integer,s_sex text)"); } catch (Exception e) { e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } 

最后不要忘了在清单文件中配置自定义的ContentProvider:

 
   
  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229909.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午3:35
下一篇 2026年3月16日 下午3:35


相关推荐

  • hdu 1142_hdu1001

    hdu 1142_hdu1001【最短路问题】第一道最短路问题+DFS各种WARE还是在参照大神的代码的情况下 http://acm.hdu.edu.cn/showproblem.php?pid=1142只是照搬自己熟悉下过程dijkstra+dfs#include<cstdio>#include<cstring>#defineINF2000000000#defineN101…

    2026年4月20日
    4
  • 记一次mybatis关联映射之两条sql映射到一个resultMap中「建议收藏」

    记一次mybatis关联映射之两条sql映射到一个resultMap中「建议收藏」目标:在一个查询结果中嵌入另一个Sql的结果集ArrayList。用第一条Sql的结果集中的某些字段值为参数传给第二条Sql(其实是传给第二条Sql的Dao接口,传的参数要对应Dao接口中的形参)第一条SQL<selectid=”elsQueryAll”resultMap=”CompanyResultMapDto”>SELECTid,…

    2026年3月11日
    5
  • 【OpenClaw养虾】从零开始部署安装,接入QQ机器人

    【OpenClaw养虾】从零开始部署安装,接入QQ机器人

    2026年3月12日
    2
  • Postfix+dovecot 部署

    Postfix+dovecot 部署nbsp Postfix dovecot 部署 nbsp Postfix 是一个标准的 MTA MailTransfer 服务器 它负责通过 SMTP 协议管理发送到本机的邮件以及由本机发向外界的邮件 在本文中 Postfix 角色 1 作为用户邮件服务 即把邮件的本地投递工作 接受到邮件之后将邮件存档到本地磁盘 交给 Dovecot 的 LMTP 服务 LocalMailTra

    2026年3月19日
    2
  • 什么是数据库外键?

    什么是数据库外键?外键就是一个表中的一个字段引用了另一个表中的主键 引用的表叫做子表 被引用的表叫做主表 外键是一种约束 描述的是表之间的关系

    2026年3月20日
    2
  • pycharm使用pip install安装时速度太慢?更换镜像源

    pycharm使用pip install安装时速度太慢?更换镜像源问题 pycharm 安装依赖包的时候 默认使用国外的镜像源 速度很慢 下面修改镜像源后 速度飞起 windows 系统 1 打开我的电脑 在地址栏中输入 APPDATA 按回车跳转到目标目录 2 在此处新建一个文件夹 pip 打开 pip 文件夹并新建文件 pip ini 内容如下 global timeout 6000index url https pypi douban com simple trusted host pypi douban com 再

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号