Android程序的主要4部分:
1、Activity:
一个activity代表着手机屏幕的一屏,一般一个android应用是由多个Activity组成的。Activity是由Android系统进行维护的,他有自己的生命周期:产生、运行、销毁。
2、BroadcastIntentReceiver:
可以使用BroadcastReceiver来让应用对一个外部的事件作出响应。
3、Service
Service是一种程序,他可以运行很长的时间,但是他没有用户界面。不可自己运行,其他对象(Activity/Context)启动后于后台服务。
4、ContentProvider
android中的数据是程序私有的,一个Conten Provider类实现了一组标准的方法接口,从而能够让其他的应用程序保存或读取此Content Provider的各种数据类型。
下面列举一些常用的接口:
1、query(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder):通过Uri进行查询,返回一个Cursor.
2、insert(Uriuri,ContentValuesvalues):将一组数据插入到Uri指定的地方。
3、update(Uriuri,ContentValuesvalues,Stringwhere,String[]selectionArgs):更新Uri指定位置的数据。
4、delete(Uriuri,Stringwhere,String[]selectionArgs):删除指定Uri并且符合一定条件的数据。
5、ContentResolver
外界程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当中通过getContentResolver()可以得到当前应用ContentResolver实例。其提供的接口与ContentProvider提供的接口对应:
1、query(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder):通过Uri进行查询,返回一个Cursor.
2、insert(Uriuri,ContentValuesvalues):将一组数据插入到Uri指定的地方。
3、update(Uriuri,ContentValuesvalues,Stringwhere,String[]selectionArgs):更新Uri指定位置的数据。
4、delete(Uriuri,Stringwhere,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进行注册,直接运行就行,否则会报错!