ContentProvider实例整理

用到了四个类:

class MainActivity extends Activity;

class DatabaseHelper extends SQLiteOpenHelper;

class MyMetaData;

class MyCP extends ContentProvider;

一、MainActivity:

package com.example.contentprovider;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.example.contentprovider.MyMetaData.UserTableMetaData;

public class MainActivity extends Activity {

    Button insert,query;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        insert = (Button) findViewById(R.id.insert);
        insert.setOnClickListener(new InsertListener());
        query = (Button) findViewById(R.id.query);
        query.setOnClickListener(new QueryListener());
    }

    class InsertListener implements OnClickListener{

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            ContentValues values = new ContentValues();
            values.put(UserTableMetaData.USER_NAME, "michal");
            Uri uri = getContentResolver().insert(
                    UserTableMetaData.CONTENT_URI, values);
            System.out.println("uri--->" + uri.toString());
        }
        
    }
    class QueryListener implements OnClickListener{

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Cursor c = getContentResolver().query(
                      UserTableMetaData.CONTENT_URI, null,
                      null, null, null);
               while (c.moveToNext()) {
                  System.out.println(c.getString(c.getColumnIndex(UserTableMetaData.USER_NAME)));
               }
        }
        
    }
    @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;
    }

}

二、DatabaseHelper extends SQLiteOpenHelper

package com.example.contentprovider;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper{

    
    public DatabaseHelper(Context context) {
        super(context, MyMetaData.DATABASE_NAME, null, MyMetaData.DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        String sql = "CREATE TABLE "+MyMetaData.UserTableMetaData.TABLE_NAME+" (_id INTEGER PRIMARY KEY AUTOINCREMENT, "+MyMetaData.UserTableMetaData.USER_NAME+" VARCHAR)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        
    }
    
}

三、MyMetaData

package com.example.contentprovider;

import android.net.Uri;
import android.provider.BaseColumns;

public class MyMetaData {
    // 继承了contentprovider的类的全名
    public static final String AUTHORITY = "com.example.contentprovider.mycp";
    // 数据库名称
    public static final String DATABASE_NAME = "FirstProvider.db";
    // 数据库的版本
    public static final int DATABASE_VERSION = 1;
    
    // 静态内部类创建一个表
    public static final class UserTableMetaData implements BaseColumns {
        // 表名
        public static final String TABLE_NAME = "users";
        // 访问该ContentProvider的表的URI
        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_NAME);
        //规定
        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.mycp.user";
        public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.mycp.user";
        // 列名,在users表中添加一个名为name的列
        public static final String USER_NAME = "name";
        // 默认排序方式
        public static final String DEFAULT_SORT_ORDER = "_id desc";
    }
}

四、MyCP extends ContentProvider

package com.example.contentprovider;

import java.util.HashMap;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;

import com.example.contentprovider.MyMetaData.UserTableMetaData;

public class MyCP extends ContentProvider {

    public static final UriMatcher uriMatcher;
    // 下面定义两个规则
    public static final int INCOMING_USER_COLLECTION = 1;
    public static final int INCOMING_USER_SINGLE = 2;
    private DatabaseHelper dh;
    static {
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);// 不匹配根目录
        // 多条
        uriMatcher.addURI(MyMetaData.AUTHORITY, "users",INCOMING_USER_COLLECTION);
        // 单条
        uriMatcher.addURI(MyMetaData.AUTHORITY, "users/#", INCOMING_USER_SINGLE);
    }
    // 有点类似于sql里面表的别名,这个也是给列其别名,必须要用
    // 列的别名还是原来的名,没必要修改
    public static HashMap<String, String> userProjectionMap;
    static {
        userProjectionMap = new HashMap<String, String>();
        userProjectionMap.put(UserTableMetaData._ID, UserTableMetaData._ID);
        userProjectionMap.put(UserTableMetaData.USER_NAME,UserTableMetaData.USER_NAME);
    }

    @Override
    public boolean onCreate() {
        // TODO Auto-generated method stub
        //getContext得到当前正在运行着的context
        dh = new DatabaseHelper(getContext());
        System.out.println("on create --> dh = new DatabaseHelper(getContext())");
        return true;
    }

    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        System.out.println("getType-->");
        switch (uriMatcher.match(uri)) {
        case INCOMING_USER_COLLECTION:
            return UserTableMetaData.CONTENT_TYPE;
        case INCOMING_USER_SINGLE:
            return UserTableMetaData.CONTENT_TYPE_ITEM;
        default:
                throw new IllegalArgumentException("Unknown uri" + uri);
        }
    }
    
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        // TODO Auto-generated method stub
        System.out.println("query");
       //创建一个查询的语句
       SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
     //设置查询哪张表
       qb.setTables(UserTableMetaData.TABLE_NAME);
       qb.setProjectionMap(userProjectionMap);
       switch(uriMatcher.match(uri)){
       case INCOMING_USER_COLLECTION:
           break;
       case INCOMING_USER_SINGLE:
           //添加where条件,getPathSegments:得到uri的path部分content:XXX/user/1,get(1)得到1
           qb.appendWhere(UserTableMetaData._ID+"="+uri.getPathSegments().get(1));
           break;
       }
          
       String orderBy;
       if(TextUtils.isEmpty(sortOrder)){
           orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
       }
       else
       {
           orderBy = sortOrder;
       }
       SQLiteDatabase db = dh.getWritableDatabase();
       //下面的query使用qb这个对象
       Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
       //也是通知下
       c.setNotificationUri(getContext().getContentResolver(), uri);
       return c;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO Auto-generated method stub
        System.out.println("insert-->");
        SQLiteDatabase db = dh.getWritableDatabase();
        long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);
         if(rowId>0){
               //将rowId追加到后面
               //contentUris:用来处理Uri的工具类
               Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);
               //通知监听器,数据已经改变
               getContext().getContentResolver().notifyChange(insertedUserUri, null);
               return insertedUserUri;
           }
         throw new SQLException("Failed to insert row into "+uri);
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        // TODO Auto-generated method stub
        return 0;
    }

}

最后记得在AndroidManifest.xml里配置:

<provider 
            android:name="com.example.contentprovider.MyCP"
            android:authorities="com.example.contentprovider.mycp">
</provider>
原文地址:https://www.cnblogs.com/qchy/p/2984473.html