您的位置:首页 > 移动开发 > Android开发

Android四大基本组件之Content Provider

2012-11-24 20:36 585 查看
            数据在Android当中是私有的,这些数据包括文件数据和数据库数据以及一些其他类型的数据。一个ContentProvider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此ContentProvider的各种数据类型。即:ContentProvider是存储和获取数据提供的统一接口,它可以使不同的应用程序之间共享数据。
       外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当中通过getContentResolver()可以得到当前应用的ContentResolver实例。
        在ContentProvider和ContentResolver当中用到了Uri的形式通常有两种:一种是指定全部数据,另一种是指定某个ID的数据。举例如下:
              content://contacts/people/    这个Uri指定的就是全部的联系人数据
              content://contacts/people/1  这个Uri指定的是ID为1的联系人的数据 
       SQliteOpenHelper是一个抽象类,用来管理数据的创建和版本的管理。
       在关于ContentProvider的编程中我们主要关心三个类的实例:Activity类、ContentProvider类以及SQLiteOpenHelper类。他们之间的关系图如下:
                                              Activity类                   
                      (用户层)
                                                         |
                                                         |  ContentResolver类
                                                         |
                                              ContentProvider类                                 (逻辑层)
                                                   | 
                                                         |
                                                         |
                                            SQLiteOpenHelper类                              (持久层)
      SQLiteOpenHelper类直接与数据库打交道,我们称之为持久层;ContentProvider对持久层的数据进行逻辑的处理,所以属于逻辑层;而Activity类就是展示给用户的数据,所以可称之为用户层。
      下面以一个Android实例加深对上面概念的理解,工程名为ContentProviderExample。
        
         DataBaseHelper.java
packagecom.android.provider;
 
importandroid.content.Context;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;
 
publicclass DataBaseHelper extends SQLiteOpenHelper{
       
       private static final StringDATABASE_NAME = "stu_database";
       private static final int VERSION = 1;
       
       public DataBaseHelper(Context context){
              super(context, DATABASE_NAME,null, VERSION);
       }
 
       @Override
       public void onCreate(SQLiteDatabase db){
              // TODO Auto-generated methodstub
              db.execSQL("CREATE TABLEstudents (stu_no TEXT, stu_name TEXT)");
              String sql1 = "insert intostudents(stu_no, stu_name)values('S1001', 'Tom')";
              String sql2 = "insert intostudents(stu_no, stu_name)values('S1002', 'John')";
              String sql3 = "insert intostudents(stu_no, stu_name)values('S1003', 'Jack')";
              try{
                      db.execSQL(sql1);
                      db.execSQL(sql2);
                      db.execSQL(sql3);
              }catch(Exception e){
                      e.printStackTrace();
              }
       }
 
       @Override
       public void onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion) {
              // TODO Auto-generated methodstub
              
       }
 
}

 
DataProvider.java
packagecom.android.provider;
 
importandroid.content.ContentProvider;
importandroid.content.ContentValues;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.net.Uri;
 
publicclass DataProvider extends ContentProvider{
 
       private DataBaseHelper helper;
       
 
       @Override
       public int delete(Uri uri, Stringselection, String[] selectionArgs) {
              // TODO Auto-generated methodstub
              return 0;
       }
 
       @Override
       public String getType(Uri uri) {
              // TODO Auto-generated methodstub
              return null;
       }
 
       @Override
       public Uri insert(Uri uri, ContentValuesvalues) {
              // TODO Auto-generated methodstub
              return null;
       }
 
       @Override
       public boolean onCreate() {
              helper = newDataBaseHelper(getContext());
              return true;
       }
 
       @Override
       public Cursor query(Uri uri, String[]projection, String selection,
                      String[] selectionArgs,String sortOrder) {
              SQLiteDatabase db =helper.getReadableDatabase();
              Cursor c =db.query("students", projection, selection, selectionArgs, null,null, null);        
              return c;
       }
 
       @Override
       public int update(Uri uri, ContentValuesvalues, String selection,
                      String[] selectionArgs) {
              // TODO Auto-generated methodstub
              return 0;
       }
 
}

MainActivity.java
packagecom.android.provider;
 
importandroid.app.Activity;
importandroid.database.Cursor;
importandroid.net.Uri;
importandroid.os.Bundle;
importandroid.widget.TextView;
 
publicclass MainActivity extends Activity {
   private static final Uri CONTENT_URI =Uri.parse("content://com.android.provider/students");
       private static final String[] PROJECTION= new String[]{"stu_no", "stu_name"};
 
       /** Called when the activity is firstcreated. */
   @Override
   public void onCreate(BundlesavedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       
       TextView tv = (TextView)findViewById(R.id.showOne);
       Cursor c =getContentResolver().query(CONTENT_URI, PROJECTION,
                      "stu_no= ?", new String[]{"S1001"}, null);
       c.moveToFirst();
       tv.setText(c.getString(1));
   }
}
 
main.xml
<?xmlversion="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   >
<TextView 
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="@string/hello"
   />
 
<TextView
       android:text="TextView"
       android:id="@+id/showOne"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content">
</TextView>
</LinearLayout>

AndroidManifest.xml
<?xmlversion="1.0" encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.provider"
     android:versionCode="1"
     android:versionName="1.0">
   <uses-sdkandroid:minSdkVersion="1" />
 
   <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
       <activityandroid:name=".MainActivity"
                 android:label="@string/app_name">
           <intent-filter>
               <actionandroid:name="android.intent.action.MAIN" />
               <categoryandroid:name="android.intent.category.LAUNCHER" />
           </intent-filter>
       </activity>
              <providerandroid:name="DataProvider"
                      android:authorities="com.android.provider">
              </provider>
   </application>
</manifest>
 
      
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息