mars android开发之九:Content Provider

来源:互联网 发布:程序员空闲 编辑:程序博客网 时间:2024/04/30 17:53

转载:http://blog.csdn.net/bruse1990/article/details/19490343

(一)基本概念


ContentProvider
1.ContentProvider为存储和获取数据提供了统一的接口

2.使用ContentProvider可以在不同的应用程序之间共享数据


URI
1.每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。

2.Android所提供的ContentProvider都存放在android.provider包当中。


ContentProvider所提供的函数
1.query():查询
2.insert():插入
3.update():更新
4.delete():删除
5.getType():得到数据类型

6.onCreate():创建时的回调函数


实现ContentProvider的过程
1.定义一个CONTENT_URI常量
2.定义一个类,继承ContentProvider
3.实现query,insert,update,delete,getType和onCreate方法

4.在AndroidManifest.xml当中进行声明


(二)例子


DBHelper.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.example.contentprovider;  
  2.   
  3. import com.example.contentprovider.FirstProviderMetaData.UserTableMetaData;  
  4.   
  5. import android.content.Context;  
  6. import android.database.sqlite.SQLiteDatabase;  
  7. import android.database.sqlite.SQLiteOpenHelper;  
  8.   
  9. public class DBHelper extends SQLiteOpenHelper{  
  10.       
  11.     public static final String DATABASE_NAME = "FirstProvider.db";  
  12.     public static final int DATABASE_VERSION = 1;  
  13.       
  14.       
  15.   
  16.     public DBHelper(Context context) {  
  17.         super(context, DATABASE_NAME, null, DATABASE_VERSION);  
  18.     }  
  19.   
  20.     @Override  
  21.     public void onCreate(SQLiteDatabase db) {  
  22.         System.out.println("create a Database");  
  23.         String sql = "create table " + UserTableMetaData.TABLE_NAME + "(" + UserTableMetaData._ID + " integer," + UserTableMetaData.USER_NAME + " varchar(20))";  
  24.         db.execSQL(sql);  
  25.     }  
  26.   
  27.     @Override  
  28.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  29.         System.out.println("update a Database");  
  30.     }  
  31.   
  32. }  

FirstProviderMetaData.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.example.contentprovider;  
  2.   
  3. import android.net.Uri;  
  4. import android.provider.BaseColumns;  
  5.   
  6. public class FirstProviderMetaData {  
  7.     public static final String AUTHORIY = "com.example.contentprovider.FirstContentProvider";  
  8.     public static final class UserTableMetaData implements BaseColumns{  
  9.         public static final String TABLE_NAME = "users";  
  10.         public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORIY + "/users");  
  11.         public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.firstprovider.user";  
  12.         public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.firstprovider.user";  
  13.         public static final String USER_NAME = "name";  
  14.         public static final String DEFAULT_SORT_ORDER = "_id desc";  
  15.     }  
  16. }  

FirstContentProvider.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.example.contentprovider;  
  2.   
  3. import java.util.HashMap;  
  4.   
  5. import com.example.contentprovider.FirstProviderMetaData.UserTableMetaData;  
  6.   
  7. import android.content.ContentProvider;  
  8. import android.content.ContentUris;  
  9. import android.content.ContentValues;  
  10. import android.content.UriMatcher;  
  11. import android.database.Cursor;  
  12. import android.database.SQLException;  
  13. import android.database.sqlite.SQLiteDatabase;  
  14. import android.database.sqlite.SQLiteQueryBuilder;  
  15. import android.net.Uri;  
  16. import android.text.TextUtils;  
  17.   
  18. public class FirstContentProvider extends ContentProvider{  
  19.       
  20.     public static final UriMatcher uriMatcher;  
  21.     public static final int INCOMING_USER_COLLECTION = 1;  
  22.     public static final int INCOMING_USER_SINGLE = 2;  
  23.     private DBHelper dh;  
  24.     static{  
  25.         uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);  
  26.         //把繁琐的地址变成一个标识符  
  27.         uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "users", INCOMING_USER_COLLECTION);  
  28.         uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "users/#", INCOMING_USER_SINGLE);  
  29.     }  
  30.       
  31.     public static HashMap<String, String> userProjectMap;  
  32.     static{  
  33.         userProjectMap = new HashMap<String, String>();  
  34.         userProjectMap.put(UserTableMetaData._ID, UserTableMetaData._ID);  
  35.         userProjectMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME);  
  36.     }  
  37.   
  38.     @Override  
  39.     public int delete(Uri arg0, String arg1, String[] arg2) {  
  40.         return 0;  
  41.     }  
  42.   
  43.     @Override  
  44.     public String getType(Uri uri) {  
  45.         System.out.println("getType");  
  46.         switch(uriMatcher.match(uri)){  
  47.         case INCOMING_USER_COLLECTION:  
  48.             return UserTableMetaData.CONTENT_TYPE;  
  49.         case INCOMING_USER_SINGLE:  
  50.             return UserTableMetaData.CONTENT_TYPE_ITEM;  
  51.         default:  
  52.             throw new IllegalArgumentException("Unknown URI" + uri);  
  53.         }  
  54.     }  
  55.   
  56.     @Override  
  57.     public Uri insert(Uri uri, ContentValues values) {  
  58.         System.out.println("insert");  
  59.         SQLiteDatabase db = dh.getWritableDatabase();  
  60.         long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);  
  61.         if(rowId > 0){  
  62.             Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);  
  63.             getContext().getContentResolver().notifyChange(insertedUserUri, null);  
  64.             return insertedUserUri;  
  65.         }  
  66.         throw new SQLException("Failed to insert row into" + uri);  
  67.     }  
  68.   
  69.     @Override  
  70.     public boolean onCreate() {  
  71.         dh = new DBHelper(getContext());  
  72.         System.out.println("onCreate");  
  73.         return false;  
  74.     }  
  75.   
  76.     @Override  
  77.     public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,  
  78.             String sortOrder) {  
  79.         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();  
  80.         switch(uriMatcher.match(uri)){  
  81.         case INCOMING_USER_COLLECTION:  
  82.             qb.setTables(UserTableMetaData.TABLE_NAME);  
  83.             qb.setProjectionMap(userProjectMap);  
  84.             break;  
  85.         case INCOMING_USER_SINGLE:  
  86.             qb.setTables(UserTableMetaData.TABLE_NAME);  
  87.             qb.setProjectionMap(userProjectMap);  
  88.             qb.appendWhere(UserTableMetaData._ID + "=" + uri.getPathSegments().get(1));  
  89.             break;  
  90.         }  
  91.         String orderBy;  
  92.         if(TextUtils.isEmpty(sortOrder)){  
  93.             orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;  
  94.         }else{  
  95.             orderBy = sortOrder;  
  96.         }  
  97.         SQLiteDatabase db = dh.getWritableDatabase();  
  98.         Cursor c = qb.query(db, projection, selection, selectionArgs, nullnull, sortOrder);  
  99.         c.setNotificationUri(getContext().getContentResolver(), uri);  
  100.         System.out.println("query");  
  101.         return c;  
  102.     }  
  103.   
  104.     @Override  
  105.     public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {  
  106.         return 0;  
  107.     }  
  108.       
  109. }  

MainActivity.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.example.contentprovider;  
  2.   
  3. import com.example.contentprovider.FirstProviderMetaData.UserTableMetaData;  
  4.   
  5. import android.net.Uri;  
  6. import android.os.Bundle;  
  7. import android.app.Activity;  
  8. import android.content.ContentValues;  
  9. import android.database.Cursor;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13.   
  14. public class MainActivity extends Activity {  
  15.       
  16.     Button insertButton;  
  17.     Button queryButton;  
  18.   
  19.     @Override  
  20.     protected void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.activity_main);  
  23.         insertButton = (Button) findViewById(R.id.insertButton);  
  24.         queryButton = (Button) findViewById(R.id.queryButton);  
  25.         insertButton.setOnClickListener(new OnClickListener() {  
  26.               
  27.             @Override  
  28.             public void onClick(View arg0) {  
  29.                 ContentValues values = new ContentValues();  
  30.                 values.put(UserTableMetaData.USER_NAME, "zhangsan");  
  31.                 Uri uri = getContentResolver().insert(UserTableMetaData.CONTENT_URI, values);  
  32.                 System.out.println("uri--->" + uri.toString());  
  33.             }  
  34.         });  
  35.         queryButton.setOnClickListener(new OnClickListener() {  
  36.               
  37.             @Override  
  38.             public void onClick(View v) {  
  39.                 Cursor c = getContentResolver().query(UserTableMetaData.CONTENT_URI, nullnullnullnull);  
  40.                 while(c.moveToNext()){  
  41.                     System.out.println(c.getString(c.getColumnIndex(UserTableMetaData.USER_NAME)));  
  42.                 }  
  43.             }  
  44.         });  
  45.     }  
  46.   
  47. }  

manifest.xml

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.example.contentprovider"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="10"  
  9.         android:targetSdkVersion="10" />  
  10.   
  11.     <application  
  12.         android:allowBackup="true"  
  13.         android:icon="@drawable/ic_launcher"  
  14.         android:label="@string/app_name"  
  15.         android:theme="@style/AppTheme" >  
  16.         <activity  
  17.             android:name="com.example.contentprovider.MainActivity"  
  18.             android:label="@string/app_name" >  
  19.             <intent-filter>  
  20.                 <action android:name="android.intent.action.MAIN" />  
  21.   
  22.                 <category android:name="android.intent.category.LAUNCHER" />  
  23.             </intent-filter>  
  24.         </activity>  
  25.         <provider   
  26.             android:name="com.example.contentprovider.FirstContentProvider"  
  27.             android:authorities="com.example.contentprovider.FirstContentProvider"/>  
  28.     </application>  
  29.   
  30. </manifest>  

activity_main.xml

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  
  4.     android:orientation="vertical">  
  5.   
  6.     <Button   
  7.         android:id="@+id/insertButton"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="插入"/>  
  11.       
  12.     <Button   
  13.         android:id="@+id/queryButton"  
  14.         android:layout_width="fill_parent"  
  15.         android:layout_height="wrap_content"  
  16.         android:text="查询"/>  
  17.   
  18. </LinearLayout>  

0 0