Android四大基本组件之Content Provider

            数据在Android当中是私有的,这些数据包括文件数据和数据库数据以及一些其他类型的数据。一个ContentProvider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此ContentProvider的各种数据类型。即:ContentProvider是存储和获取数据提供的统一接口,它可以使不同的应用程序之间共享数据。

       外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当中通过getContentResolver()可以得到当前应用的ContentResolver实例。

        ContentProviderContentResolver当中用到了Uri的形式通常有两种:一种是指定全部数据,另一种是指定某个ID的数据。举例如下:

              content://contacts/people/    这个Uri指定的就是全部的联系人数据

              content://contacts/people/1  这个Uri指定的是ID1的联系人的数据 

       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>

 

      

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值