自定义ContentProvider

来源:互联网 发布:掌上阅读软件下载 编辑:程序博客网 时间:2024/05/16 03:33

 转载请注明:http://blog.csdn.net/richway2010/article/details/6600835



    Content Provider 属于Android应用程序的组件之一,作为应用程序之间唯一的共享数据的途径,Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的借口。 

    Android 系统为一些常见的数据类型(如音乐、视频、图像、手机通信录联系人信息等)内置了一系列的 Content Provider, 这些都位于android.provider包下。持有特定的许可,可以在自己开发的应用程序中访问这些Content Provider。 

   让自己的数据和其他应用程序共享有两种方式:创建自己的Content Provier(即继承自ContentProvider的子类)  或者是将自己的数据添加到已有的Content Provider中去,后者需要保证现有的Content Provider和自己的数据类型相同且具有该 Content Provider的写入权限。对于Content Provider,最重要的就是数据模型(data model) 和 URI。

   创建自己的Content Provier主要分为以下几步:

1、创建Content Provier并应用SQLite存储系统

[java] view plaincopyprint?
  1. package org.guocheng.act;  
  2.   
  3. import android.content.ContentProvider;  
  4. import android.content.ContentUris;  
  5. import android.content.ContentValues;  
  6. import android.content.Context;  
  7. import android.database.Cursor;  
  8. import android.database.SQLException;  
  9. import android.database.sqlite.SQLiteDatabase;  
  10. import android.database.sqlite.SQLiteOpenHelper;  
  11. import android.database.sqlite.SQLiteQueryBuilder;  
  12. import android.net.Uri;  
  13.   
  14. public class MyContentProvider extends ContentProvider {  
  15.   
  16.     private SQLiteDatabase     sqlDB;  
  17.     private DatabaseHelper    dbHelper;  
  18.     private static final String  DATABASE_NAME     = "Users.db";  
  19.     private static final int        DATABASE_VERSION         = 1;  
  20.     private static final String TABLE_NAME   = "User";  
  21.     private static final String TAG = "MyContentProvider";  
  22.   
  23.     private static class DatabaseHelper extends SQLiteOpenHelper {  
  24.         DatabaseHelper(Context context) {  
  25.             super(context, DATABASE_NAME, null, DATABASE_VERSION);  
  26.         }  
  27.   
  28.         @Override  
  29.         public void onCreate(SQLiteDatabase db) {  
  30.             //创建用于存储数据的表  
  31.         db.execSQL("Create table " + TABLE_NAME + "( _id INTEGER PRIMARY KEY AUTOINCREMENT, USER_NAME TEXT);");  
  32.         }  
  33.   
  34.         @Override  
  35.         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  36.             db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);  
  37.             onCreate(db);  
  38.         }  
  39.     }  
  40.   
  41.     @Override  
  42.     public int delete(Uri uri, String s, String[] as) {  
  43.         return 0;  
  44.     }  
  45.   
  46.     @Override  
  47.     public String getType(Uri uri) {  
  48.         return null;  
  49.     }  
  50.   
  51.     @Override  
  52.     public Uri insert(Uri uri, ContentValues contentvalues) {  
  53.         sqlDB = dbHelper.getWritableDatabase();  
  54.         long rowId = sqlDB.insert(TABLE_NAME, "", contentvalues);  
  55.         if (rowId > 0) {  
  56.             Uri rowUri = ContentUris.appendId(MyUsers.User.CONTENT_URI.buildUpon(), rowId).build();  
  57.             getContext().getContentResolver().notifyChange(rowUri, null);  
  58.             return rowUri;  
  59.         }  
  60.         throw new SQLException("Failed to insert row into " + uri);  
  61.     }  
  62.   
  63.     @Override  
  64.     public boolean onCreate() {  
  65.         dbHelper = new DatabaseHelper(getContext());  
  66.         return (dbHelper == null) ? false : true;  
  67.     }  
  68.   
  69.     @Override  
  70.     public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {  
  71.         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();  
  72.         SQLiteDatabase db = dbHelper.getReadableDatabase();  
  73.         qb.setTables(TABLE_NAME);  
  74.         Cursor c = qb.query(db, projection, selection, nullnullnull, sortOrder);  
  75.         c.setNotificationUri(getContext().getContentResolver(), uri);  
  76.         return c;  
  77.     }  
  78.   
  79.     @Override  
  80.     public int update(Uri uri, ContentValues contentvalues, String s, String[] as) {  
  81.         return 0;  
  82.     }  
  83. }  
2、定义URI及字段

[java] view plaincopyprint?
  1. package org.guocheng.act;  
  2.   
  3. import android.net.Uri;  
  4. import android.provider.BaseColumns;  
  5.   
  6. public class MyUsers {  
  7.     public static final String AUTHORITY  = "org.guocheng.act.MyContentProvider";  
  8.   
  9.      // BaseColumn类中已经包含了 _id字段  
  10.      public static final class User implements BaseColumns {  
  11.          public static final Uri CONTENT_URI  = Uri.parse("content://org.guocheng.act.MyContentProvider");  
  12.          // 表数据列  
  13.          public static final String  USER_NAME  = "USER_NAME";  
  14.     }  
  15. }  
3、建立activity,生成数据,查询数据并以listview展现

[java] view plaincopyprint?
  1. package org.guocheng.act;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6.   
  7. import android.app.Activity;  
  8. import android.content.ContentValues;  
  9. import android.database.Cursor;  
  10. import android.net.Uri;  
  11. import android.os.Bundle;  
  12. import android.widget.ArrayAdapter;  
  13. import android.widget.ListView;  
  14.   
  15. public class ContentProviderTestActivity extends Activity {  
  16.       
  17.     ListView lv ;  
  18.     /** Called when the activity is first created. */  
  19.     @Override  
  20.     public void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.main);  
  23.         insertRecord("MyUsers");  
  24.         displayRecords();  
  25.   
  26.     }  
  27.       
  28.     private void insertRecord(String userName) {  
  29.         ContentValues values = new ContentValues();  
  30.         values.put(MyUsers.User.USER_NAME, userName);  
  31.         getContentResolver().insert(MyUsers.User.CONTENT_URI, values);  
  32.     }  
  33.   
  34.     private void displayRecords() {  
  35.         String columns[] = new String[] { MyUsers.User._ID, MyUsers.User.USER_NAME };  
  36.         Uri myUri = MyUsers.User.CONTENT_URI;  
  37.         Cursor cur = managedQuery(myUri, columns,nullnullnull );  
  38.         List<String> ls = new ArrayList<String>();  
  39.           
  40.         if (cur.moveToFirst()) {  
  41.             for (int i = 0; i < cur.getCount(); i++) {  
  42.                 String name = cur.getString(1);  
  43.                 ls.add(name);  
  44.                 cur.moveToNext();  
  45.             }  
  46.         }  
  47.           
  48.         lv = (ListView)findViewById(R.id.lis);  
  49.           
  50.         lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, ls));  
  51.       
  52.     }    
  53. }  
main.xml

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.   
  6.     <ListView android:id="@+id/lis" android:layout_height="wrap_content"  
  7.         android:layout_width="wrap_content" android:paddingLeft="20px">  
  8.     </ListView>  
  9. </LinearLayout>  

AndroidManifest.xml

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="org.guocheng.act"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <uses-sdk android:minSdkVersion="8" />  
  7.   
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  9.         <activity android:name=".ContentProviderTestActivity"  
  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.           
  17.         <provider android:name="MyContentProvider" android:authorities="org.guocheng.act.MyContentProvider" />  
  18.     </application>  
  19. </manifest>  

所有代码结束。
运行效果图:


OK,这就是自定义的Content Provider.希望对你有所帮助。


此demo是转者自己整理原作者的代码,希望能给看文章的同学节约时间

                                                                            点击进入DEMO下载页面

原创粉丝点击