ContentData类,提供数据常量:

  1. /**
  2. * 提供ContentProvider对外的各种常量,当外部数据需要访问的时候,就可以参考这些常量操作数据。
  3. * @author HB
  4. *
  5. */
  6. public class ContentData {
  7. public static final String AUTHORITY = "hb.android.contentProvider";
  8. public static final String DATABASE_NAME = "teacher.db";
  9. //创建 数据库的时候,都必须加上版本信息;并且必须大于4
  10. public static final int DATABASE_VERSION = ;
  11. public static final String USERS_TABLE_NAME = "teacher";
  12.  
  13. public static final class UserTableData implements BaseColumns {
  14. public static final String TABLE_NAME = "teacher";
  15. //Uri,外部程序需要访问就是通过这个Uri访问的,这个Uri必须的唯一的。
  16. public static final Uri CONTENT_URI = Uri.parse("content://"+ AUTHORITY + "/teacher");
  17. // 数据集的MIME类型字符串则应该以vnd.android.cursor.dir/开头
  18. public static final String CONTENT_TYPE = "vnd.android.cursor.dir/hb.android.teachers";
  19. // 单一数据的MIME类型字符串应该以vnd.android.cursor.item/开头
  20. public static final String CONTENT_TYPE_ITME = "vnd.android.cursor.item/hb.android.teacher";
  21. /* 自定义匹配码 */
  22. public static final int TEACHERS = ;
  23. /* 自定义匹配码 */
  24. public static final int TEACHER = ;
  25.  
  26. public static final String TITLE = "title";
  27. public static final String NAME = "name";
  28. public static final String DATE_ADDED = "date_added";
  29. public static final String SEX = "SEX";
  30. public static final String DEFAULT_SORT_ORDER = "_id desc";
  31.  
  32. public static final UriMatcher uriMatcher;
  33. static {
  34. // 常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
  35. uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  36. // 如果match()方法匹配content://hb.android.teacherProvider/teachern路径,返回匹配码为TEACHERS
  37. uriMatcher.addURI(ContentData.AUTHORITY, "teacher", TEACHERS);
  38. // 如果match()方法匹配content://hb.android.teacherProvider/teacher/230,路径,返回匹配码为TEACHER
  39. uriMatcher.addURI(ContentData.AUTHORITY, "teacher/#", TEACHER);
  40. }
  41. }
  42. }

SQLite操作类DBOpenHelper

  1. /**
  2. * 这个类继承SQLiteOpenHelper抽象类,用于创建数据库和表。创建数据库是调用它的父类构造方法创建。
  3. * @author HB
  4. */
  5. public class DBOpenHelper extends SQLiteOpenHelper {
  6.  
  7. // 在SQLiteOepnHelper的子类当中,必须有该构造函数,用来创建一个数据库;
  8. public DBOpenHelper(Context context, String name, CursorFactory factory,
  9. int version) {
  10. // 必须通过super调用父类当中的构造函数
  11. super(context, name, factory, version);
  12. // TODO Auto-generated constructor stub
  13. }
  14.  
  15. // public DBOpenHelper(Context context, String name) {
  16. // this(context, name, VERSION);
  17. // }
  18.  
  19. public DBOpenHelper(Context context, String name, int version) {
  20. this(context, name, null, version);
  21. }
  22.  
  23. /**
  24. * 只有当数据库执行创建 的时候,才会执行这个方法。如果更改表名,也不会创建,只有当创建数据库的时候,才会创建改表名之后 的数据表
  25. */
  26. @Override
  27. public void onCreate(SQLiteDatabase db) {
  28. System.out.println("create table");
  29. db.execSQL("create table " + ContentData.UserTableData.TABLE_NAME
  30. + "(" + ContentData.UserTableData._ID
  31. + " INTEGER PRIMARY KEY autoincrement,"
  32. + ContentData.UserTableData.NAME + " varchar(20),"
  33. + ContentData.UserTableData.TITLE + " varchar(20),"
  34. + ContentData.UserTableData.DATE_ADDED + " long,"
  35. + ContentData.UserTableData.SEX + " boolean)" + ";");
  36. }
  37.  
  38. @Override
  39. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  40.  
  41. }
  42.  
  43. }

内容提供者类

  1. /**
  2. * 这个类给外部程序提供访问内部数据的一个接口
  3. * @author HB
  4. *
  5. */
  6. public class TeacherContentProvider extends ContentProvider {
  7.  
  8. private DBOpenHelper dbOpenHelper = null;
  9. // UriMatcher类用来匹配Uri,使用match()方法匹配路径时返回匹配码
  10. private static final UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
  11.  
  12. /**
  13. * 是一个回调函数,在ContentProvider创建的时候,就会运行,第二个参数为指定数据库名称,如果不指定,就会找不到数据库;
  14. * 如果数据库存在的情况下是不会再创建一个数据库的。(当然首次调用 在这里也不会生成数据库必须调用SQLiteDatabase的 getWritableDatabase,getReadableDatabase两个方法中的一个才会创建数据库)
  15. */
  16. @Override
  17. public boolean onCreate() {
  18. //这里会调用 DBOpenHelper的构造函数创建一个数据库;
  19. dbOpenHelper = new DBOpenHelper(this.getContext(), ContentData.DATABASE_NAME, ContentData.DATABASE_VERSION);
  20. return true;
  21. }
  22. /**
  23. * 当执行这个方法的时候,如果没有数据库,他会创建,同时也会创建表,但是如果没有表,下面在执行insert的时候就会出错
  24. * 这里的插入数据也完全可以用sql语句书写,然后调用 db.execSQL(sql)执行。
  25. */
  26. @Override
  27. public Uri insert(Uri uri, ContentValues values){
  28. //获得一个可写的数据库引用,如果数据库不存在,则根据onCreate的方法里创建;
  29. SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  30. long id = ;
  31.  
  32. switch (uriMatcher.match(uri)) {
  33. case TEACHERS:
  34. id = db.insert("teacher", null, values); // 返回的是记录的行号,主键为int,实际上就是主键值
  35. return ContentUris.withAppendedId(uri, id);
  36. case TEACHER:
  37. id = db.insert("teacher", null, values);
  38. String path = uri.toString();
  39. return Uri.parse(path.substring(, path.lastIndexOf("/"))+id); // 替换掉id
  40. default:
  41. throw new IllegalArgumentException("Unknown URI " + uri);
  42. }
  43. }
  44.  
  45. @Override
  46. public int delete(Uri uri, String selection, String[] selectionArgs) {
  47. SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  48. int count = ;
  49. switch (uriMatcher.match(uri)) {
  50. case TEACHERS:
  51. count = db.delete("teacher", selection, selectionArgs);
  52. break;
  53. case TEACHER:
  54. // 下面的方法用于从URI中解析出id,对这样的路径content://hb.android.teacherProvider/teacher/10
  55. // 进行解析,返回值为10
  56. long personid = ContentUris.parseId(uri);
  57. String where = "_ID=" + personid; // 删除指定id的记录
  58. where += !TextUtils.isEmpty(selection) ? " and (" + selection + ")" : ""; // 把其它条件附加上
  59. count = db.delete("teacher", where, selectionArgs);
  60. break;
  61. default:
  62. throw new IllegalArgumentException("Unknown URI " + uri);
  63. }
  64. db.close();
  65. return count;
  66. }
  67.  
  68. @Override
  69. public int update(Uri uri, ContentValues values, String selection,
  70. String[] selectionArgs) {
  71. SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  72. int count = ;
  73. switch (uriMatcher.match(uri)) {
  74. case TEACHERS:
  75. count = db.update("teacher", values, selection, selectionArgs);
  76. break;
  77. case TEACHER:
  78. // 下面的方法用于从URI中解析出id,对这样的路径content://com.ljq.provider.personprovider/person/10
  79. // 进行解析,返回值为10
  80. long personid = ContentUris.parseId(uri);
  81. String where = "_ID=" + personid;// 获取指定id的记录
  82. where += !TextUtils.isEmpty(selection) ? " and (" + selection + ")" : "";// 把其它条件附加上
  83. count = db.update("teacher", values, where, selectionArgs);
  84. break;
  85. default:
  86. throw new IllegalArgumentException("Unknown URI " + uri);
  87. }
  88. db.close();
  89. return count;
  90. }
  91.  
  92. @Override
  93. public String getType(Uri uri) {
  94. switch (uriMatcher.match(uri)) {
  95. case TEACHERS:
  96. return CONTENT_TYPE;
  97. case TEACHER:
  98. return CONTENT_TYPE_ITME;
  99. default:
  100. throw new IllegalArgumentException("Unknown URI " + uri);
  101. }
  102. }
  103.  
  104. @Override
  105. public Cursor query(Uri uri, String[] projection, String selection,
  106. String[] selectionArgs, String sortOrder) {
  107. SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
  108. switch (uriMatcher.match(uri)) {
  109. case TEACHERS:
  110. return db.query("teacher", projection, selection, selectionArgs, null, null, sortOrder);
  111. case TEACHER:
  112. // 进行解析,返回值为10
  113. long personid = ContentUris.parseId(uri);
  114. String where = "_ID=" + personid;// 获取指定id的记录
  115. where += !TextUtils.isEmpty(selection) ? " and (" + selection + ")" : "";// 把其它条件附加上
  116. return db.query("teacher", projection, where, selectionArgs, null, null, sortOrder);
  117. default:
  118. throw new IllegalArgumentException("Unknown URI " + uri);
  119. }
  120. }
  121. }

文件清单:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="hb.android.contentProvider"
  4. android:versionCode=""
  5. android:versionName="1.0">
  6. <uses-sdk android:minSdkVersion="" />
  7.  
  8. <application android:icon="@drawable/icon" android:label="@string/app_name">
  9. <activity android:name=".TeacherActivity"
  10. android:label="@string/app_name">
  11. <intent-filter>
  12. <action android:name="android.intent.action.MAIN" />
  13. <category android:name="android.intent.category.LAUNCHER" />
  14. </intent-filter>
  15. </activity>
  16. <span style="white-space:pre"> </span><provider android:name=".TeacherContentProvider"
  17. <span style="white-space:pre"> </span>android:authorities="hb.android.contentProvider" />
  18. </application>
  19. </manifest>

main.xml文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <Button
  8. android:id="@+id/insert"
  9. android:text="@string/insert"
  10. android:layout_width="fill_parent"
  11. android:layout_height="wrap_content"/>
  12. <Button
  13. android:id="@+id/query"
  14. android:text="@string/query"
  15. android:layout_width="fill_parent"
  16. android:layout_height="wrap_content"/>
  17. <Button
  18. android:id="@+id/querys"
  19. android:text="@string/querys"
  20. android:layout_width="fill_parent"
  21. android:layout_height="wrap_content"/>
  22. <Button
  23. android:id="@+id/update"
  24. android:text="@string/update"
  25. android:layout_width="fill_parent"
  26. android:layout_height="wrap_content"/>
  27. <Button
  28. android:id="@+id/delete"
  29. android:text="@string/delete"
  30. android:layout_width="fill_parent"
  31. android:layout_height="wrap_content"/>
  32. </LinearLayout>

TeacherActivity内容提供者测试类

  1. package hb.android.contentProvider;
  2.  
  3. import java.util.Date;
  4.  
  5. import android.app.Activity;
  6. import android.content.ContentResolver;
  7. import android.content.ContentValues;
  8. import android.database.Cursor;
  9. import android.net.Uri;
  10. import android.os.Bundle;
  11. import android.view.View;
  12. import android.view.View.OnClickListener;
  13. import android.widget.Button;
  14.  
  15. /**
  16. * 这个类用来测试ContentProvider是否可用。通过 给定的uri访问,数据库;
  17. *
  18. * @author HB
  19. *
  20. */
  21. public class TeacherActivity extends Activity {
  22. Button insert;
  23. Button query;
  24. Button update;
  25. Button delete;
  26. Button querys;
  27. Uri uri = Uri.parse("content://hb.android.contentProvider/teacher");
  28.  
  29. /** Called when the activity is first created. */
  30. @Override
  31. public void onCreate(Bundle savedInstanceState) {
  32. super.onCreate(savedInstanceState);
  33. setContentView(R.layout.main);
  34.  
  35. insert = (Button) findViewById(R.id.insert);
  36. query = (Button) findViewById(R.id.query);
  37. update = (Button) findViewById(R.id.update);
  38. delete = (Button) findViewById(R.id.delete);
  39. querys = (Button) findViewById(R.id.querys);
  40. // 绑定监听器的两种方法一;
  41. insert.setOnClickListener(new InsertListener());
  42. query.setOnClickListener(new QueryListener());
  43. // 方法二
  44. update.setOnClickListener(new OnClickListener() {
  45. public void onClick(View v) {
  46. // TODO Auto-generated method stub
  47. ContentResolver cr = getContentResolver();
  48. ContentValues cv = new ContentValues();
  49. cv.put("name", "huangbiao");
  50. cv.put("date_added", (new Date()).toString());
  51. int uri2 = cr.update(uri, cv, "_ID=?", new String[]{""});
  52. System.out.println("updated"+":"+uri2);
  53. }
  54. });
  55.  
  56. delete.setOnClickListener(new OnClickListener() {
  57.  
  58. public void onClick(View v) {
  59. ContentResolver cr = getContentResolver();
  60. cr.delete(uri, "_ID=?", new String[]{""});
  61. }
  62. });
  63.  
  64. querys.setOnClickListener(new OnClickListener() {
  65.  
  66. public void onClick(View v) {
  67. // TODO Auto-generated method stub
  68. ContentResolver cr = getContentResolver();
  69. // 查找id为1的数据
  70. Cursor c = cr.query(uri, null, null,null, null);
  71. System.out.println(c.getCount());
  72. c.close();
  73. }
  74. });
  75. }
  76.  
  77. class InsertListener implements OnClickListener {
  78.  
  79. public void onClick(View v) {
  80. // TODO Auto-generated method stub
  81. ContentResolver cr = getContentResolver();
  82.  
  83. ContentValues cv = new ContentValues();
  84. cv.put("title", "jiaoshou");
  85. cv.put("name", "jiaoshi");
  86. cv.put("sex", true);
  87. Uri uri2 = cr.insert(uri, cv);
  88. System.out.println(uri2.toString());
  89. }
  90.  
  91. }
  92.  
  93. class QueryListener implements OnClickListener {
  94.  
  95. public void onClick(View v) {
  96. // TODO Auto-generated method stub
  97. ContentResolver cr = getContentResolver();
  98. // 查找id为1的数据
  99. Cursor c = cr.query(uri, null, "_ID=?", new String[] { "" }, null);
  100. //这里必须要调用 c.moveToFirst将游标移动到第一条数据,不然会出现index -1 requested , with a size of 1错误;cr.query返回的是一个结果集。
  101. if (c.moveToFirst() == false) {
  102. // 为空的Cursor
  103. return;
  104. }
  105. int name = c.getColumnIndex("name");
  106. System.out.println(c.getString(name));
  107. c.close();
  108. }
  109. }
  110. }

运行结果为:

Android ContentProvider完整案例的更多相关文章

  1. Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录的实现以及ListView的优化

    Android实训案例(五)--四大组件之一ContentProvider的使用,通讯录的实现 Android四大组件是啥这里就不用多说了,看图吧,他们之间通过intent通讯 我们后续也会一一的为大 ...

  2. Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听

    Android实训案例(六)--四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听 Android中四大组件的使用时重中之重,我这个阶段也不奢望能把他 ...

  3. Android基础 : Android ContentProvider

    Android 应用程序通过ContentProvider实现方式统一的数据共享功能. 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activi ...

  4. JavaEE开发之记事本完整案例(SpringBoot + iOS端)

    上篇博客我们聊了<JavaEE开发之SpringBoot整合MyBatis以及Thymeleaf模板引擎>,并且在之前我们也聊了<Swift3.0服务端开发(五) 记事本的开发(iO ...

  5. Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程

    Android实训案例(九)--答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程 项目也是偷师的,决心研究一下数据库.所以写的还是很详细的,各位看官,耐着性子看完,实现结果不重要 ...

  6. Android实训案例(八)——单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局

    Android实训案例(八)--单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局 阿法狗让围棋突然就被热议了,鸿洋大神也顺势出了篇五子棋单机游戏的视频,我看到了就像膜拜膜拜,就 ...

  7. Android实训案例(四)——关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程!

    Android实训案例(四)--关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程! 关于2048,我看到很多大神,比如医生,郭神,所以我也研究了一段时间,还好是研究 ...

  8. Android实训案例(三)——实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果!

    Android实训案例(三)--实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果! 感叹离春节将至,也同时感叹时间不等人,一年又一年,可是我依然是android道路上的小菜鸟,这篇讲 ...

  9. Android实训案例(二)——Android下的CMD命令之关机重启以及重启recovery

    Android实训案例(二)--Android下的CMD命令之关机重启以及重启recovery Android刚兴起的时候,着实让一些小众软件火了一把,切水果,Tom猫,吹裙子就是其中的代表,当然还有 ...

随机推荐

  1. VS2008 ctrl+shift+F热键冲突

    今天发现有时VS 热键好使,有时,怎么按都没有反应. 后来发现是和输入法有冲突,把输入法快捷键改了就好了.

  2. android获得屏幕高度和宽度

    获取屏幕的宽度与高度有以下几种方法: .WindowManager wm = (WindowManager) getContext()                     .getSystemSe ...

  3. 源码搭建lnmp平台

    lnmp平台是指利用linux操作系统,nginx服务器,mysql数据库和php语言搭建高性能web服务器,负载均衡器和邮件代理服务器. 原理图:‘

  4. Html.RenderPartial和Html.RenderAction的区别

    添加一个PartialController控制器 using System; using System.Collections.Generic; using System.Linq; using Sy ...

  5. maven第三章 maven使用入门

    3.1编写pom groupId 一个项目名称 artifactId 子项目(模块)名称 version 开发中的版本,稳定的版本 name 项目名称,方便信息交流 http://news.cnblo ...

  6. repeater 结合checkbox批量删除

    项目中用到这个,从网上搜了搜相关内容,代码如下 <script type="text/javascript"> function checkAllThis(obj) { ...

  7. html5的Canvas

    Canvas一般是指画布,最近对用html5写游戏比较感兴趣,所以简单的用了一下Canvas. 之前接触Canvas是在silverlight和wpf上用到过他,在silverlight上Canvas ...

  8. VC++6.0 下配置 pthread库2010年12月12日 星期日 13:14VC下的pthread多线程编程 转载

    VC++6.0 下配置 pthread库2010年12月12日 星期日 13:14VC下的pthread多线程编程     转载 #include <stdio.h>#include &l ...

  9. 配置CAS错误No Certificate file specified or invalid file format

    配置tomcat证书 keystore文件后启动一直报错:(tomcat版本:apache-tomcat-6.0.43) tomcat配置: <Connector port="8443 ...

  10. python的hashlib模块

    # -*- coding: utf-8 -*- """python 的MD5 sha1 模块""" import hashlib #md5的 ...