自定义ContentProvider内容提供者

一、自定义的内容提供者


1. 继承 ContentProvider


2. 实现 增 删 改 查 方法 以及 onCreate 方法


3. 制定 Uri 的网址规则,形成特定的功能


4. 四大组件都需要在清单文件注册,来确认内容提供者是否可以被 其他程序访问


5. 内部需要进行数据的操作,增 删 改 查


    5.1 确认使用哪种数据类型:SQLite, File, SharedPreferences


    5.2 onCreate 方法,需要初始化 通常 DbHelper


    5.3 每一个操作的方法,第一个参数都代表了 需要操作的哪一张表。通过Uri来标示;


    5.4 使用  UriMatcher 类对象,来进行网址匹配,判断访问那个表




关于 Uri 与 authorities 说明


Uri 就是一个网址


    规则:  content://<authority>/path


    authority 代表的就是 Android 系统中内容提供者的唯一标示,就像服务器的IP地址


    清单文件里面声明内容提供者的authority


    http://www.baidu.com/images

    http://www.baidu.com/news

二、创建自定义内容提供者

public class MyProvider extends ContentProvider {

    private MyDbHelper mMyDbHelper;
    public static final int CODES_CODE = 1;
    public static final UriMatcher uriMatcher;
    static {
        uriMatcher = new UriMatcher(0);
        uriMatcher.addURI("*","codes",CODES_CODE);
    }
    public MyProvider() {
    }

    @Override
    public boolean onCreate() {
        mMyDbHelper = new MyDbHelper(getContext());
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        Cursor ret = null;
        SQLiteDatabase database = mMyDbHelper.getWritableDatabase();
        int code = uriMatcher.match(uri);
        switch (code) {
            case CODES_CODE:
                ret = database.query("codes",projection,selection,selectionArgs,null,null,sortOrder);
                break;
        }

        return ret;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int index = 0;
        SQLiteDatabase database = mMyDbHelper.getWritableDatabase();
        int code = uriMatcher.match(uri);
        switch (code) {
            case CODES_CODE:
                index = database.delete("codes",selection,selectionArgs);
                break;
        }
        database.close();
        return index;
    }

    @Override
    public String getType(Uri uri) {
        // TODO: Implement this to handle requests for the MIME type of the data
        // at the given URI.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
       Uri ret = null;
        SQLiteDatabase database = mMyDbHelper.getWritableDatabase();
        int codes = uriMatcher.match(uri);
        switch (codes) {
            case CODES_CODE:
                long index = database.insert("codes", null, values);
                ret = ContentUris.withAppendedId(uri,index);
                break;
        }
        database.close();
        return ret;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
       int index = 0;
        SQLiteDatabase database = mMyDbHelper.getWritableDatabase();
        int code = uriMatcher.match(uri);
        switch (code) {
            case CODES_CODE:
                index = database.update("codes", values, selection, selectionArgs);
                break;
        }
        database.close();
        return index;
    }
}

2.创建数据库

MyDbHelper.java

public class MyDbHelper extends SQLiteOpenHelper {
    public static final String CODE_MANGER ="create table codes (" +
            "_id integer primary key autoincrement," +
            "title varchar," +
            "webView varchar," +
            "user varchar," +
            "pass varchar," +
            "remark long," +
            "update_t long)";
    public MyDbHelper(Context context){
        super(context,"manger",null,1);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
                db.execSQL(CODE_MANGER);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //db.execSQL("alter table income add column type integer default 0");
        if (newVersion ==2){
            db.execSQL("alter table codes add column update_t long default 0");
        }

    }

}

3.Activity调用数据库的数据

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemLongClickListener, AdapterView.OnItemClickListener {

    private TextView mTitle;
    private TextView mUser;
    private SimpleCursorAdapter mAdapter;
    private ListView mListView;
    private Cursor cursor;
    private SQLiteDatabase mDatabase;
    private ContentResolver mResolver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        MyDbHelper helper = new MyDbHelper(this);
//        mDatabase = helper.getWritableDatabase();
        mTitle = (TextView) findViewById(R.id.db_title);
        mUser = (TextView) findViewById(R.id.db_username);
        mResolver = getContentResolver();
        Uri uri = Uri.parse("content://abc/codes");
        cursor = mResolver.query(uri, null, null, null, "remark desc");
        if (cursor != null){
            mAdapter = new SimpleCursorAdapter(this,
                    R.layout.db_item,cursor,
                    new String[]{"title","user"},
                    new int[]{R.id.db_title,R.id.db_username},
                    CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
            mListView = (ListView) findViewById(R.id.main_list);
            RequeryData();
            mListView.setAdapter(mAdapter);
            mListView.setOnItemLongClickListener(this);
            mListView.setOnItemClickListener(this);
        }
    }

//    @Override
//    protected void onStart() {
//        super.onStart();
//        RequeryData();
//    }

    @Override
    protected void onResume() {
        super.onResume();
        RequeryData();
    }

    private void RequeryData() {
        Uri uri = Uri.parse("content://abc/codes");
        cursor = mResolver.query(uri, null, null, null, "remark desc");
        mAdapter.changeCursor(cursor);
        //mAdapter.notifyDataSetChanged();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_item,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_edit:
                Toast.makeText(MainActivity.this, "edit被点击", Toast.LENGTH_SHORT).show();
                int id = cursor.getColumnIndex("_id");
                break;

            case R.id.action_add:
                Toast.makeText(MainActivity.this, "add被点击了", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(this, EditActivity.class);
                startActivity(intent);
                break;
        }
        return true;
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        Intent intent = new Intent(this,EditActivity.class);
        intent.putExtra("_id",id);
        startActivity(intent);
        return true;
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Intent intent = new Intent(this, InfoActivity.class);
        intent.putExtra("_id", id);
        startActivity(intent);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值