android组件之Content Provider

来源:互联网 发布:imagesloaded.min.js 编辑:程序博客网 时间:2024/05/18 00:45

Android程序的主要4部分

1、Activity:

    一个activity代表着手机屏幕的一屏,一般一个android应用是由多个Activity组成的。Activity是由Android系统进行维护的,他有自己的生命周期:产生、运行、销毁。

2、Broadcast Intent Receiver:

     可以使用BroadcastReceiver来让应用对一个外部的事件作出响应。

3、Service

    Service是一种程序,他可以运行很长的时间,但是他没有用户界面。不可自己运行,其他对象(Activity/Context)启动后于后台服务。

4、Content Provider

    android中的数据是程序私有的,一个Conten Provider类实现了一组标准的方法接口,从而能够让其他的应用程序保存或读取此Content Provider的各种数据类型。

下面列举一些常用的接口:

1、query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder):通过Uri进行查询,返回一个Cursor.

2、insert(Uri uri,ContentValues values):将一组数据插入到Uri指定的地方。

3、update(Uri uri,ContentValues values,String where,String[] selectionArgs):更新Uri指定位置的数据。

4、deleteUri uri,String where,String[] selectionArgs:删除指定Uri并且符合一定条件的数据。

5、ContentResolver

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

1query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder):通过Uri进行查询,返回一个Cursor.

2insert(Uri uri,ContentValues values):将一组数据插入到Uri指定的地方。

3update(Uri uri,ContentValues values,String where,String[] selectionArgs):更新Uri指定位置的数据。

4deleteUri uri,String where,String[] selectionArgs:删除指定Uri并且符合一定条件的数据。

 

一个很简单的列子:

Manifest.xml中的代码:
01 <application android:icon="@drawable/icon" android:label="@string/app_name">
02                 <activity android:name=".TestWebviewDemo" android:label="@string/app_name">
03                         <intent-filter> 
04                                 <action android:name="android.intent.action.MAIN" />
05                                 <category android:name="android.intent.category.LAUNCHER" />
06                         </intent-filter> 
07                         <intent-filter> 
08                                 <data android:mimeType="vnd.android.cursor.dir/vnd.ruixin.login" />
09                         </intent-filter> 
10                         <intent-filter> 
11                                 <data android:mimeType="vnd.android.cursor.item/vnd.ruixin.login" />
12                         </intent-filter> 
13                           
14                 </activity> 
15                 <provider android:name="MyProvider" android:authorities="com.ruixin.login" />
16         </application>
 
需要在<application></application>中为provider进行注册!!!!
首先定义一个数据库的工具类:
01 public class RuiXin { 
02   
03         public static final String DBNAME = "ruixinonlinedb";  
04         public static final String TNAME = "ruixinonline"; 
05         public static final int VERSION = 3; 
06           
07         public static String TID = "tid"; 
08         public static final String EMAIL = "email"; 
09         public static final String USERNAME = "username"; 
10         public static final String DATE = "date"; 
11         public static final String SEX = "sex"; 
12           
13           
14         public static final String AUTOHORITY = "com.ruixin.login"; 
15         public static final int ITEM = 1; 
16         public static final int ITEM_ID = 2; 
17           
18         public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.ruixin.login";
19         public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.ruixin.login";
20           
21         public static final Uri CONTENT_URI = Uri.parse("content://" + AUTOHORITY + "/ruixinonline");
22 }
 
然后创建一个数据库:
01 public class DBlite extends SQLiteOpenHelper { 
02         public DBlite(Context context) { 
03                 super(context, RuiXin.DBNAME, null, RuiXin.VERSION); 
04                 // TODO Auto-generated constructor stub 
05         } 
06         @Override
07         public void onCreate(SQLiteDatabase db) { 
08                 // TODO Auto-generated method stub 
09                         db.execSQL("create table "+RuiXin.TNAME+"(" + 
10                                 RuiXin.TID+" integer primary key autoincrement not null,"+
11                                 RuiXin.EMAIL+" text not null," + 
12                                 RuiXin.USERNAME+" text not null," + 
13                                 RuiXin.DATE+" interger not null,"+ 
14                                 RuiXin.SEX+" text not null);"); 
15         } 
16         @Override
17         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
18                 // TODO Auto-generated method stub 
19         } 
20         public void add(String email,String username,String date,String sex){
21                 SQLiteDatabase db = getWritableDatabase(); 
22                 ContentValues values = new ContentValues(); 
23                 values.put(RuiXin.EMAIL, email); 
24                 values.put(RuiXin.USERNAME, username); 
25                 values.put(RuiXin.DATE, date); 
26                 values.put(RuiXin.SEX, sex); 
27                 db.insert(RuiXin.TNAME,"",values); 
28         } 
29 }
接着创建一个Myprovider.java对数据库的接口进行包装:
001 public class MyProvider extends ContentProvider{ 
002   
003         DBlite dBlite; 
004         SQLiteDatabase db; 
005           
006         private static final UriMatcher sMatcher; 
007         static{ 
008                 sMatcher = new UriMatcher(UriMatcher.NO_MATCH); 
009                 sMatcher.addURI(RuiXin.AUTOHORITY,RuiXin.TNAME, RuiXin.ITEM);
010                 sMatcher.addURI(RuiXin.AUTOHORITY, RuiXin.TNAME+"/#", RuiXin.ITEM_ID);
011   
012         } 
013         @Override
014         public int delete(Uri uri, String selection, String[] selectionArgs) {
015                 // TODO Auto-generated method stub 
016                 db = dBlite.getWritableDatabase(); 
017                 int count = 0; 
018                 switch (sMatcher.match(uri)) { 
019                 case RuiXin.ITEM: 
020                         count = db.delete(RuiXin.TNAME,selection, selectionArgs);
021                         break; 
022                 case RuiXin.ITEM_ID: 
023                         String id = uri.getPathSegments().get(1); 
024                         count = db.delete(RuiXin.TID, RuiXin.TID+"="+id+(!TextUtils.isEmpty(RuiXin.TID="?")?"AND("+selection+')':""), selectionArgs);
025                     break; 
026                 default: 
027                         throw new IllegalArgumentException("Unknown URI"+uri);
028                 } 
029                 getContext().getContentResolver().notifyChange(uri, null);
030                 return count; 
031         } 
032   
033         @Override
034         public String getType(Uri uri) { 
035                 // TODO Auto-generated method stub 
036                 switch (sMatcher.match(uri)) { 
037                 case RuiXin.ITEM: 
038                         return RuiXin.CONTENT_TYPE; 
039                 case RuiXin.ITEM_ID: 
040                     return RuiXin.CONTENT_ITEM_TYPE; 
041                 default: 
042                         throw new IllegalArgumentException("Unknown URI"+uri);
043                 } 
044         } 
045   
046         @Override
047         public Uri insert(Uri uri, ContentValues values) { 
048                 // TODO Auto-generated method stub 
049                   
050                 db = dBlite.getWritableDatabase(); 
051                 long rowId; 
052                 if(sMatcher.match(uri)!=RuiXin.ITEM){ 
053                         throw new IllegalArgumentException("Unknown URI"+uri);
054                 } 
055                 rowId = db.insert(RuiXin.TNAME,RuiXin.TID,values); 
056                    if(rowId>0){ 
057                            Uri noteUri=ContentUris.withAppendedId(RuiXin.CONTENT_URI, rowId);
058                            getContext().getContentResolver().notifyChange(noteUri, null);
059                            return noteUri; 
060                    } 
061                    throw new IllegalArgumentException("Unknown URI"+uri);
062         } 
063   
064         @Override
065         public boolean onCreate() { 
066                 // TODO Auto-generated method stub 
067                 this.dBlite = new DBlite(this.getContext()); 
068 //                db = dBlite.getWritableDatabase(); 
069 //                return (db == null)?false:true; 
070                 return true; 
071         } 
072   
073         @Override
074         public Cursor query(Uri uri, String[] projection, String selection,
075                         String[] selectionArgs, String sortOrder) { 
076                 // TODO Auto-generated method stub 
077                 db = dBlite.getWritableDatabase();                 
078                 Cursor c; 
079                 Log.d("-------", String.valueOf(sMatcher.match(uri))); 
080                 switch (sMatcher.match(uri)) { 
081                 case RuiXin.ITEM: 
082                         c = db.query(RuiXin.TNAME, projection, selection, selectionArgs, null, null, null);
083                   
084                         break; 
085                 case RuiXin.ITEM_ID: 
086                         String id = uri.getPathSegments().get(1); 
087                         c = db.query(RuiXin.TNAME, projection, RuiXin.TID+"="+id+(!TextUtils.isEmpty(selection)?"AND("+selection+')':""),selectionArgs, null, null, sortOrder);
088                     break; 
089                 default: 
090                         Log.d("!!!!!!", "Unknown URI"+uri); 
091                         throw new IllegalArgumentException("Unknown URI"+uri);
092                 } 
093                 c.setNotificationUri(getContext().getContentResolver(), uri);
094                 return c; 
095         } 
096         @Override
097         public int update(Uri uri, ContentValues values, String selection,
098                         String[] selectionArgs) { 
099                 // TODO Auto-generated method stub 
100                 return 0; 
101         } 
102 }
 
最后创建测试类:
01 public class Test extends Activity { 
02     /** Called when the activity is first created. */
03    private DBlite dBlite1 = new DBlite(this);; 
04         private ContentResolver contentResolver; 
05                     public void onCreate(Bundle savedInstanceState) { 
06                 super.onCreate(savedInstanceState); 
07                 setContentView(R.layout.main); 
08                 //先对数据库进行添加数据 
09             dBlite1.add(email,username,date,sex); 
10             //通过contentResolver进行查找 
11              contentResolver = TestWebviewDemo.this.getContentResolver(); 
12             Cursor cursor = contentResolver.query( 
13                   RuiXin.CONTENT_URI, new String[] { 
14                   RuiXin.EMAIL, RuiXin.USERNAME, 
15                   RuiXin.DATE,RuiXin.SEX }, null, null, null); 
16                 while (cursor.moveToNext()) { 
17                      Toast.makeText( 
18                     TestWebviewDemo.this, 
19                     cursor.getString(cursor.getColumnIndex(RuiXin.EMAIL)) 
20                             + " "
21                             + cursor.getString(cursor.getColumnIndex(RuiXin.USERNAME))
22                             + " "
23                             + cursor.getString(cursor.getColumnIndex(RuiXin.DATE))
24                             + " "
25                             + cursor.getString(cursor.getColumnIndex(RuiXin.SEX)),
26                            Toast.LENGTH_SHORT).show(); 
27                      } 
28                    startManagingCursor(cursor);  //查找后关闭游标 
29             } 
30         }

注:上面是在一个程序中进行的测试,也可以再新建一个工程来模拟一个新的程序,然后将上面查询的代码加到新的程序当中!这样就模拟了contentprovider的数据共享功能了!
新建个工程:TestProvider
创建一个测试的activity
01 public class Test extends Activity { 
02     /** Called when the activity is first created. */
03         private ContentResolver contentResolver; 
04                     public void onCreate(Bundle savedInstanceState) { 
05                 super.onCreate(savedInstanceState); 
06                 setContentView(R.layout.main); 
07                 
08             //通过contentResolver进行查找 
09               contentResolver = TestWebviewDemo.this.getContentResolver();                     
10              Cursor cursor = contentResolver.query( 
11                 RuiXin.CONTENT_URI, new String[] { 
12                 RuiXin.EMAIL, RuiXin.USERNAME, 
13                 RuiXin.DATE,RuiXin.SEX }, null, null, null); 
14             while (cursor.moveToNext()) { 
15                Toast.makeText(TestWebviewDemo.this, 
16                        cursor.getString(cursor.getColumnIndex(RuiXin.EMAIL))
17                        + " "
18                        + cursor.getString(cursor.getColumnIndex(RuiXin.USERNAME))
19                        + " "
20                        + cursor.getString(cursor.getColumnIndex(RuiXin.DATE))
21                        + " "
22                        + cursor.getString(cursor.getColumnIndex(RuiXin.SEX)),
23                        Toast.LENGTH_SHORT).show(); 
24                    } 
25                    startManagingCursor(cursor);  //查找后关闭游标 
26             } 
27         }
运行此程序就能实现共享数据查询了!
注:新建的程序中的manifest.xml中不需要对provider进行注册,直接运行就行,否则会报错!

原创粉丝点击