android四大组件:activity,receivor,service,provider。
个人觉得provider自己开发用的比较少,不过查看其他程序的内容倒是挺多,因此难免忘的比较快,本文只提供简单的提示,主要为了方便查看。
安卓自身集成了了一个ContentProvider类,开发的程序若要实现内容提供的功能,就得继承这个类,然后重写各个操作数据库的方法。具体代码如下:
DiaryContentProvider.java文件
public class DiaryContentProvider extends ContentProvider {
//自己定义的类,继承ContentProvider,重写外面应用查询数据库的方法
static String AUTHORITY="com.diary.provider";
//权限,在AndroidManifest中声明,name中写入具体类全名,authority写入权限(就是个字符串)。
static int QUERY=0;
static int QUERYITEM=1;
static UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
static {
matcher.addURI(AUTHORITY,"diary",QUERY);
matcher.addURI(AUTHORITY,"diary/#",QUERYITEM);
}
//uri只有与上面两种匹配,才可以进行数据操作。
SQLiteDatabase db;
public DiaryContentProvider() {
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// Implement this to handle requests to delete one or more rows.
throw new UnsupportedOperationException("Not yet implemented");
}//重写delete方法,外部应用进行删除操作时会调用该方法。
@Override
public String getType(Uri uri) {
// TODO: Implement this to handle requests for the MIME type of the data
// at the given URI.
if(matcher.match(uri)==QUERY){
return "vnd.android.cursor.dir/vnd.com.example.app.provider.diary";
}else if(matcher.match(uri)==QUERYITEM){
return "vnd.android.cursor.item/vnd.com.example.app.provider.diary";
}else{
throw new UnsupportedOperationException("Not yet implemented");
}
}//获取返回MIME类型字符串,这个方法需要重写,返回格式为vnd.android.cursor.dir(或者item)+"/vnd."+权限+"."+路径。
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO: Implement this to handle requests to insert a new row.
throw new UnsupportedOperationException("Not yet implemented");
}//重写insert方法
@Override
public boolean onCreate() {
// TODO: Implement this to initialize your content provider on startup.
db=new MySQLOpenHelper(getContext(),"diary",null,1).getWritableDatabase();
//要操作数据库必须得新建类继承SQLOpenHelper,重写其中的onCreate等方法,表示第一次调用数据库时采取的操作。通过getWritableDatebase可以获取一个可以操作数据库的对象db。
return true;
}//当有外部应用调用该provider获取内容时会调用onCreate,这里主要是与数据库连接起来,用以操作数据。
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO: Implement this to handle query requests from clients.
Cursor cursor=null;
if(matcher.match(uri)==QUERYITEM){
//match返回值是一个int型,即在开始addURI时第二个参数。
cursor=db.query("diary",null,"id=?",new String[]{uri.getPathSegments().get(1)},null,null,null,null);
// Uri 对象的getPathSegments()方法,它会将内容 URI 权限之后的部分以“/”符号进行分割,并把分割后的结果放入到一个字符串列表中,那这个列表的第 0 个位置存放的就是路径,第 1 个位置存放的就是id
}else if(matcher.match(uri)==QUERY){
cursor=db.query("diary",null,null,null,null,null,null,null);
}
return cursor;
}//重写query方法。
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO: Implement this to handle requests to update one or more rows.
throw new UnsupportedOperationException("Not yet implemented");
}//重写update方法
}
AndroidManifest.xml中配置
<provider
android:authorities="com.diary.provider"
android:name="com.diary.DiaryContentProvider"/>
//name中为具体类名
MySQLOpenHelper.java文件
public class MySQLOpenHelper extends SQLiteOpenHelper {
final String CREATE_DIARY="create table diary(" +
"id integer primary key autoincrement," +
"date text," +
"time text," +
"title text," +
"information text," +
"authority integer)";
public MySQLOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_DIARY);
//对象第一次调用getWritableDatabase()时若是没有对应数据库,则会先调用onCreate。
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//数据库更新时调用
}
}