安卓 内容提供者

ContentProvider(内容提供者)是安卓四大组件之一,用来共享应用程序内的数据,当你需要把你的应用程序的数据共享给其他应用程序的时候,才需要用它该组件对外提供了其他应用可以直接访问的增删改查方法。

一般像底层做法就是:一是先需要内容提供者。写一个提供者的类继承 ContentProvider,重写这个类的增删改查的方法。进而就可以进行你先要的操作。其代码如下:

package com.example.an_sqlite.provider;

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

import com.example.an_sqlite.db.DbHelper;

/**
 * Created by Administrator on 2017/2/16.
 */

public class MyProvider extends ContentProvider {

    private DbHelper dbHelper;
    private SQLiteDatabase db;
    private UriMatcher uriMatcher;
    private Cursor c;
    private static final int PERSONS = 1;
    private static final int PERSON = 2;

    @Override
    public boolean onCreate() {

        Log.i("test", "onCreate");
        dbHelper = new DbHelper(getContext(), "questions.db", null, 2);
        db = dbHelper.getReadableDatabase();

        //实例化URI匹配器
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        //给匹配器中添加匹配规则

        uriMatcher.addURI("com.example.an_sqlite.person", "persons", MyProvider.PERSONS);

        uriMatcher.addURI("com.example.an_sqlite.person", "persons/#", MyProvider.PERSON);

        return false;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

        Log.i("test", "query");
         return db.query(true,"person",projection,selection,selectionArgs,null,null, sortOrder,null);

        //开始匹配
//        int code = uriMatcher.match(uri);
//        switch (code) {
//            case MyProvider.PERSONS:
//                //查询所有
//                c = db.query(true, "person", projection, selection, selectionArgs, null, null, sortOrder, null);
//                Log.i("test", "所有");
//                return c;
//             case MyProvider.PERSON:
//                //得到#的值
//                long id = ContentUris.parseId(uri);
//                Log.i("test", "单个");
//                //查询单个:
//                c = db.rawQuery("select * from person where _id=?",new String[]{id+""});
//                 return c;
//        }

//        return null;

    }


    @Nullable
    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }
}

其次便是内容的访问者,先获取内容的访问者,在进行接下来的操作,博主进行的是查询的操作。其代码如下:

package com.example.an_contentresolver;

import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

private EditText et_main_id;
private ContentResolver cr;
private Uri uri;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    et_main_id = (EditText) findViewById(R.id.et_main_id);
 //获取内容访问者
    cr = getContentResolver();
}

 public void getData(View view) {
 //路径
  Uri uri=Uri.parse("content://com.example.an_sqlite.data");
     uri = Uri.parse("content://com.example.an_sqlite.person/persons");

// if (TextUtils.isEmpty(et_main_id.getText())) {
// uri = Uri.parse(“content://com.example.an_sqlite.person/persons”);
//
// } else {
// String id = et_main_id.getText().toString();
// uri = Uri.parse(“content://com.example.an_sqlite.person/persons/” + id);
// }
// Cursor cursor = cr.query(uri, null, null, null, null);
//
//
// while (cursor.moveToNext()) {
// int id = cursor.getInt(cursor.getColumnIndex(“_id”));
// String name = cursor.getString(cursor.getColumnIndex(“pname”));
// int age = cursor.getInt(cursor.getColumnIndex(“page”));
// Log.i(“test”, id + “” + name + “” + age);
}
}
当然别忘了配置内容提供者的清单文件,其代码如下:


        <provider
            android:authorities="com.example.an_sqlite.data"
            android:name=".provider.MyProvider"
            android:exported="true"
            >
        </provider>

虽然现在一般都是只需拿数据,不需要去提供了,但是了解一些底层的做法也是好的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值