Android自学笔记-12-ContentProvider简单例子

在编写Android程序的时候,有时候我们会需要将程序中的某些数据暴露给其他的程序访问,这时候我们就可以使用ContentProvider实现该功能。ContentProvider可以通过一定的格式将我们程序中的数据(可能是私有文件中的数据或者数据库中的数据等)暴露给其他程序访问。

在编写ContentProvider的时候我们需要使用如下的步骤:

1 编写一个java类继承ContentProvider类,然后实现里面的方法。

2 在AndroidManifest.xml配置该ContentProvider。

编写完了我们还需要从该ContentProvider获取数据,这时候我们就可以直接实例化一个ContentResolver对象,然后调用其中的方法对数据进行操作。

下面简单列出部分代码:

自定义的ContentProvider代码:

package com.mxy;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;

/**
 * 使用contentProvider的时候 数据库不需要关闭
 * @author mxy
 * 我们在操作该ContentProvider数据的时候,需要根据特定的Uri去操作
 * Uri构造格式如下:content://<AndroidManifest.xml配置的provider的authorities名字>/自定义内容
 */
public class MyProvider extends ContentProvider {
	
	private static int NOMATCH = -1;
	private static int INSERT = 1;
	private static int QUERY = 2;
	private static int UPDATE = 3;
	private static int DELETE = 4;
	
	//为了方便我们操作Google提供了UriMatcher,我们可以通过该类去构造我们能够匹配
	//的Uri,当然我们也可以自己去进行匹配,但是那样容易书写错误
	private static UriMatcher matcher = new UriMatcher(NOMATCH);
	static{
		matcher.addURI("com.mxy.MyProvider", "insert", INSERT);
		matcher.addURI("com.mxy.MyProvider", "query", QUERY);
		matcher.addURI("com.mxy.MyProvider", "update", UPDATE);
		matcher.addURI("com.mxy.MyProvider", "delete", DELETE);
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		Log.i("mxy", "provider  delete" + matcher.match(uri));
		return 0;
	}

	@Override
	public String getType(Uri uri) {
		Log.i("mxy", "provider  getType" + matcher.match(uri));
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		Log.i("mxy", "provider  insert" + matcher.match(uri));
		return null;
	}

	@Override
	public boolean onCreate() {
		Log.i("mxy", "provider  onCreate");
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		Log.i("mxy", "provider  query" + matcher.match(uri));
		if(QUERY == matcher.match(uri)){
			PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext());
			SQLiteDatabase db = helper.getReadableDatabase();
			Cursor cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
			return cursor;
		}else{
			return null;
		}
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		Log.i("mxy", "provider  update" + matcher.match(uri));
		return 0;
	}

}

上面的代码中使用到了Sqlite数据的操作,我没有粘贴出来,可以下载源码工程查看。

AndroidManifest.xml需要配置Provider:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mxy"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.mxy.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <provider
            android:name="com.mxy.MyProvider"
            android:authorities="com.mxy.MyProvider" 
            android:exported="true"><!-- android4.2以上需要添加该选项,表示是否能够被其他应用调用  -->
        </provider>
    </application>

</manifest>

这样我们就可以运行这个工程,这样就可以创建一个ContentProvider了,下面我们需要另一个程序去使用ContentProvider,另外一个程序的主要代码如下:
package com.mxy.contentProviderReader;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
      //读取contentprovider 数据
      ContentResolver resolver = this.getContentResolver();
      
      Uri uri = Uri.parse("content://com.mxy.MyProvider/query");
      Cursor cursor = resolver.query(uri, null,null ,null, null);
      
      Log.i("mxy", cursor + "--------" );
      
      while(cursor != null && cursor.moveToNext()){
      	int id = cursor.getInt(cursor.getColumnIndex("id"));
      	String number = cursor.getString(2);
      	Log.i("mxy", "id:" + id + "  number:" + number);
      }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}

两个程序都没有见面元素,结果都是在logcat中显示的。


例子工程下载地址:http://download.csdn.net/detail/mengxiangyue/7079701

http://download.csdn.net/detail/mengxiangyue/7079717

转载请注明出处:http://blog.csdn.net/mengxiangyu


Android自学笔记-12-ContentProvider简单例子,布布扣,bubuko.com

Android自学笔记-12-ContentProvider简单例子

上一篇:AndroidManifest 属性解析以及 代码动态获取属性值


下一篇:解决ArcGIS for Android新建sample不显示地图或者出错