`

编写最简单的Content Provider

阅读更多

来自:http://www.apkbus.com/android-16352-1-1.html

 

在自己的android应用中存储数据,可以用SQLite数据库。不过,如果需要在多个应用中共享数据,在Android中,只有通过Content provider机制。

下面用一个最简单(不完整)的示例来说明Content Provider的创建。在界面中使用这个示例显示的效果:

1.png

 

显示帝王姓名、登基年份和朝代。

 

在这个简单示例中,包括两部分:

  • 创建一个Content Provider;
  • 使用这个Content Provider(目前是在同一个应用中,可以在其他应用中以相同方式调用)。

创建一个简陋的Content Provider

content provider通过抽象一致的接口,供其他开发者使用Content provider,而实现Content provider,既可以用sqlite3这样的android内置数据库,也可以使用文件系统,甚至可以自己写其他的实现,只要实现规定的接口即可。

实现一个Content provider,需要做:

  • 继承ContentProvider,实现该类的几个抽象方法;
  • 在manifest文件中声明这个Content provider。

实现的Content provider代码:

 

  1. package com.easymorse.cp;
  2.  
  3. import android.content.ContentProvider; 
  4. import android.content.ContentValues; 
  5. import android.content.Context; 
  6. import android.database.Cursor; 
  7. import android.database.sqlite.SQLiteDatabase; 
  8. import android.database.sqlite.SQLiteStatement; 
  9. import android.net.Uri;
  10.  
  11. public class MyContentProvider extends ContentProvider {
  12.  
  13.     public static final Uri CONTENT_URI = Uri.parse("content://com.easymorse.cp.mycp");
  14.  
  15.     public static final String _ID = "id";
  16.  
  17.     public static final String NAME = "name";
  18.  
  19.     public static final String DYNASTY = "dynasty";
  20.  
  21.     public static final String START_YEAR = "start_year";
  22.  
  23.     private static SQLiteDatabase database;
  24.  
  25.     private static void createTablesIfNotExists() { 
  26.         database.execSQL("create table if not exists emperors(" 
  27.                 + " id integer primary key autoincrement," + " name text," 
  28.                 + "dynasty text," + "start_year text" + ");");
  29.  
  30.         SQLiteStatement statement = database 
  31.                 .compileStatement("insert into emperors(name,dynasty,start_year) values(?,?,?)"); 
  32.         int index = 1; 
  33.         statement.bindString(index++, "朱元璋"); 
  34.         statement.bindString(index++, "明"); 
  35.         statement.bindString(index++, "1398"); 
  36.         statement.execute();
  37.  
  38.         index = 1; 
  39.         statement.bindString(index++, "玄烨"); 
  40.         statement.bindString(index++, "清"); 
  41.         statement.bindString(index++, "1722"); 
  42.         statement.execute();
  43.  
  44.         statement.close(); 
  45.     }
  46.  
  47.     @Override 
  48.     public int delete(Uri uri, String selection, String[] selectionArgs) { 
  49.         return 0; 
  50.     }
  51.  
  52.     @Override 
  53.     public String getType(Uri uri) { 
  54.         return null; 
  55.     }
  56.  
  57.     @Override 
  58.     public Uri insert(Uri uri, ContentValues contentValues) { 
  59.         // TODO Auto-generated method stub 
  60.         return null; 
  61.     }
  62.  
  63.     @Override 
  64.     public boolean onCreate() { 
  65.         if (database == null) { 
  66.             database = this.getContext().openOrCreateDatabase("emperors", 
  67.                     Context.MODE_PRIVATE, null); 
  68.             createTablesIfNotExists(); 
  69.         } 
  70.         return database != null; 
  71.     }
  72.  
  73.     @Override 
  74.     public Cursor query(Uri uri, String[] projection, String selection, 
  75.             String[] selectionArgs, String sortOrder) { 
  76.         Cursor cursor = database.rawQuery("select * from emperors", null); 
  77.         return cursor; 
  78.     }
  79.  
  80.     @Override 
  81.     public int update(Uri uri, ContentValues contentValues, String selection, 
  82.             String[] selectionArgs) { 
  83.         // TODO Auto-generated method stub 
  84.         return 0; 
  85.     }
  86.  
  87. }
复制代码

需要实现的方法是:

 

 

  1. query() << 
  2. insert() 
  3. update() 
  4. delete() 
  5. getType() 
  6. onCreate()<<
复制代码

在本例中值实现了标注<<的方法。onCreate方法是创建Content provider时,android调用的。创建Content provider时,本例检查是否创建emperors表,没有就创建一个,并且插入了2条记录。query方法实现的很简单,只是返回表的所有结果集。做完这些还不够,还需要声明一些常量:

  1. public static final Uri CONTENT_URI = Uri.parse("content://com.easymorse.cp.mycp");
  2. public static final String _ID = "id";
  3. public static final String NAME = "name";
  4. public static final String DYNASTY = "dynasty";
  5. public static final String START_YEAR = "start_year";
复制代码

CONTENT_URI 是便于Content provider使用者引用的,下面使用Content provider的时候能看到。另外,要有一个_ID常量,值是具体表的id列名称。其他几个常量是表中列的对应名称常量。目前没有真的使用。在manifest文件中的声明:

  1. <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  2.     <activity android:name=".UseContactActivity" android:label="@string/app_name"> 
  3.         <intent-filter> 
  4.             <action android:name="android.intent.action.MAIN" /> 
  5.             <category android:name="android.intent.category.LAUNCHER" /> 
  6.         </intent-filter> 
  7.     </activity> 
  8.    <provider android:name="com.easymorse.cp.MyContentProvider" 
  9.         android:authorities="com.easymorse.cp.mycp"></provider> 
  10. </application>
复制代码

这里的android:name是ContentProvider实现类的类名,android:authorities是CONTENT_URI的值。使用创建的Content Provider代码在一个Activity中,通过TextView显示出emperors表中的数据:

  1. package com.easymorse.cp;
  2. import android.app.Activity; 
  3. import android.database.Cursor; 
  4. import android.os.Bundle; 
  5. import android.widget.TextView;
  6. public class UseContactActivity extends Activity { 
  7.     /** Called when the activity is first created. */ 
  8.     @Override 
  9.     public void onCreate(Bundle savedInstanceState) { 
  10.         super.onCreate(savedInstanceState);
  11.         TextView textView = new TextView(this); 
  12.         textView.setText(getContentProviderValues()); 
  13.         this.setContentView(textView); 
  14.     }
  15.     private String getContentProviderValues() { 
  16.         StringBuilder builder = new StringBuilder();
  17.         Cursor cursor = managedQuery(MyContentProvider.CONTENT_URI, null, null, 
  18.                 null, null); 
  19.         while (cursor.moveToNext()) { 
  20.             builder 
  21.                     .append( 
  22.                             cursor.getString(cursor 
  23.                                     .getColumnIndex(MyContentProvider.NAME))) 
  24.                     .append(" | ") 
  25.                     .append( 
  26.                             cursor 
  27.                                     .getString(cursor 
  28.                                             .getColumnIndex(MyContentProvider.START_YEAR))) 
  29.                     .append(" | ") 
  30.                     .append( 
  31.                             cursor.getString(cursor 
  32.                                     .getColumnIndex(MyContentProvider.DYNASTY))) 
  33.                     .append("\n"); 
  34.         }
  35.         return builder.toString(); 
  36.     } 
  37. }
复制代码

主要方法是getContentProviderValues()。通过managedQuery()方法获取到Cursor对象。在方法调用的参数,只用到了MyContentProvider.CONTENT_URI,通过这个参数,android可定位到具体的ContentProvider并启动它(如果没有启动的话)。后面几个参数类似SQL的SELECT子句、WHERE子句和ORDER BY子句。都不写,将返回全部的结果(其实我这个例子中的Content provider也只实现了返回全部结果的逻辑)。源代码见:
<ignore_js_op style="word-wrap: break-word; "> Content Provider安卓巴士(源代码).rar (48.5 KB, 下载次数: 99)

分享到:
评论

相关推荐

    contentProvider 资料

    接下来,可以尝试自己编写一个简单的Content Provider,最后结合实际项目需求,实践Content Provider的高级用法,如跨进程通信和异步数据处理。 9. **应用场景** Content Provider广泛应用于不同应用间的通讯,如...

    自己编写的Android记事本APP软件

    3. **Content Provider**:为了在不同应用之间共享数据,Android引入了Content Provider机制。虽然"DateNote"可能仅用于个人记事,但Content Provider可以为未来的扩展提供便利,允许其他应用读取或写入记事数据。 ...

    安卓ContentProvider详解例程

    1. **Provider类**:继承自`android.content.ContentProvider`,这是ContentProvider的核心类,你需要在这里实现数据的增删查改方法,如`insert()`, `delete()`, `query()` 和 `update()`。 2. **UriMatcher**:这...

    contentprovider示例

    接下来,我们将创建一个简单的ContentProvider示例: 1. 首先,定义UriMatcher,为不同的操作添加匹配规则,如: ``` UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); matcher.addURI(...

    通过java语言编写的手机Android系统功能

    开发者可以利用Java的类库来创建各种功能丰富的应用,如活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供者(Content Provider)等。 2. UI构建:Android提供了一套基于Java的视图...

    Android系统与应用开发.docx

    11. **Content Provider**:学习如何创建和使用Content Provider来共享数据。 12. **用户界面设计**:包括布局设计、控件使用、动画效果,以及如何响应用户交互。 - **3D动画效果**:如何实现视觉上的增强效果。 ...

    Android 学习笔记

    在Android应用结构中,理解四大组件是关键:Activity(活动)、Service(服务)、Broadcast Receiver(广播接收器)和Content Provider(内容提供者)。Activity是用户界面的主要载体,Service则在后台运行,...

    android入门教程

    在Android中,这通常涉及创建一个新的Android项目,编写一个简单的Activity,显示一个欢迎消息。通过这个过程,你可以了解Android项目的结构,以及XML布局文件和Java代码如何交互。 四、用户界面设计 Android应用的...

    Google+Android开发入门与实践【源代码】

    编写简单的"Hello, World!"程序,了解基本的布局XML文件(如activity_main.xml)和Java或Kotlin代码(如MainActivity.java或MainActivity.kt)。 三、UI设计 Android应用的用户界面主要通过XML文件定义,包括布局、...

    14本经典android开发教程

    Android应用程序的基本结构包括Manifest文件、Activity、Service、Broadcast Receiver、Content Provider等组件。Manifest文件是Android应用的配置文件,包含了应用的元数据;Activity是用户界面的主要组件,负责...

    Android学习资料.rar

    Android应用由四大组件构成:Activity(活动)、Service(服务)、Broadcast Receiver(广播接收器)和Content Provider(内容提供者)。Activity是用户界面的核心,负责与用户交互;Service则在后台运行,执行长...

    安卓Android源码——安卓Android学习——数据存储.rar

    1. **Shared Preferences**:这是最简单且常用的数据存储方式,用于保存键值对,通常用于存储用户设置和轻量级数据。数据以XML格式存储在私有目录下,只能被同一应用访问。 2. **SQLite数据库**:当需要结构化的...

    全网最全Android开发笔记.zip

    4. 应用程序框架:包含各种API,如Activity Manager、Content Provider、Broadcast Receiver等,供开发者构建应用程序。 5. 应用程序:用户直接交互的部分,如系统应用和第三方应用。 二、Android开发环境搭建 首先...

    android 学习教程

    通过动手编写简单的Android应用程序,初学者可以逐步熟悉Android开发的各个方面,包括用户界面设计、事件处理、数据存储等。随着经验的积累,开发者可以尝试编写更复杂的应用程序,如社交媒体应用、游戏或者企业级...

    深入浅出Android

    读者将了解到Android应用程序的基本组成元素,如Activity、Service、Broadcast Receiver和Content Provider,并学习如何创建和管理这些组件。 接下来,进入Android开发环境的搭建,包括安装Android Studio、配置...

    Android基础教程.7z

    4. **Android基础入门PPT**:PPT通常会概述Android开发的关键概念,如Activity生命周期、Intent的使用、服务(Service)、广播接收器(Broadcast Receiver)和内容提供者(Content Provider)。这些是Android框架的...

    android移动应用开发技术教案手机开发技术整理.pdf

    \n\nAndroid应用程序通常由多个组件构成,包括Activity、Broadcast Intent Receiver、Service和Content Provider。Activity是用户界面的主体,负责与用户交互;Broadcast Intent Receiver用于接收和响应系统或应用...

    android初级教程

    学习Android开发,首先要掌握Java语言基础,然后熟悉Android Studio的使用,理解Android的组件模型(Activity、Service、Broadcast Receiver、Content Provider)和Intent机制。通过实践Hello, Android这样的简单...

Global site tag (gtag.js) - Google Analytics