Android ContentProvider简单使用

ContentProvider是允许不同应用进行数据交换的标准的API,ContentProvider以Uri的形式对外提供数据的访问操作接口,而其他应用则通过ContentResolver根据Uri去访问指定的数据。某个应用通过ContentProvider暴露了自己的数据接口,那么不管该应用程序是否启动,其他程序都可以通过该接口来操作自己的数据接口来操作其内部的数据,包括增加数据,删除数据,修改数据,查询数据等。

项目地址:http://download.csdn.net/download/weixin_40391500/10046744

数据使用SQLite存储

/**
 * Created by pc20170521 on 2017-10-25.
 */
public class DataBaseHelper extends SQLiteOpenHelper {
    private final static String name = "test.db";
    private final static int version = 1;

    private String test = "create table test_table(_id integer primary key autoincrement," +
            "phone text)";

    public DataBaseHelper(Context context) {
        super(context, name, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(test);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

操作数据

/** 插入 **/
    public void insert(String phone) {
        DataBaseHelper helper = new DataBaseHelper(mContext);
        SQLiteDatabase db = helper.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        if (phone != null && !phone.isEmpty()){
            contentValues.put("phone", phone);
        }
        db.insert("test_table", null, contentValues);
        db.close();
        helper.close();
    }

    /** 删除 **/
    public void delete(String phone) {
        DataBaseHelper helper = new DataBaseHelper(mContext);
        SQLiteDatabase db = helper.getWritableDatabase();
        db.execSQL("delete from test_table where phone = " + phone);
        db.close();
        helper.close();
    }

    /** 清空表数据 **/
    public void clearTable() {
        DataBaseHelper helper = new DataBaseHelper(mContext);
        SQLiteDatabase db = helper.getWritableDatabase();
        db.execSQL("DELETE FROM test_table");
        db.close();
        helper.close();
    }
    /** 删除表 **/
    public void deleteTable() {
        DataBaseHelper helper = new DataBaseHelper(mContext);
        SQLiteDatabase db = helper.getWritableDatabase();
        db.execSQL("DROP TABLE test_table");
        db.close();
        helper.close();
    }

    /** 修改 **/
    public void update(Map<String,  String> map, String phone) {
        DataBaseHelper helper = new DataBaseHelper(mContext);
        SQLiteDatabase db = helper.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        if (map != null && !map.isEmpty()){
            for (Map.Entry<String, String> entry : map.entrySet()) {
                contentValues.put(entry.getKey(), entry.getValue());
            }
        }
        String whereClause = "phone = ?";
        String[] whereArgs={ phone };
        db.update("test_table", contentValues, whereClause, whereArgs);
        db.close();
        helper.close();
    }

    /** 查询 **/
    public ArrayList<String> selete() {
        DataBaseHelper helper = new DataBaseHelper(mContext);
        ArrayList<String> list = new ArrayList<>();
        SQLiteDatabase db = helper.getWritableDatabase();
        Cursor c = db.query("test_table",null,null,null,null,null,"_id desc");
        while (c.moveToNext()){
            list.add(c.getString(c.getColumnIndex("phone")));
        }
        c.close();
        db.close();
        helper.close();
        return list;
    }

ContentProvider对外提供数据的访问操作接口

/**
 * Created by pc20170521 on 2017-10-25.
 */
public class ContentProviderUtils extends ContentProvider {

    private DataBaseHelper helper = null;
    private UriMatcher matcher = null;

    @Override
    public boolean onCreate() {
        helper = new DataBaseHelper(getContext());
        matcher = new UriMatcher(UriMatcher.NO_MATCH);
        matcher.addURI("com.example.contentprovidertest", "test_table", 1);
        // #匹配所有数字,*匹配所有字符
        matcher.addURI("com.example.contentprovidertest", "test_table/#", 2);
        return false;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        int code = matcher.match(uri);
        Cursor cursor = null;
        SQLiteDatabase db = helper.getWritableDatabase();
        if (code == 1){
            cursor = db.query("test_table", null, null, null, null, null, "_id desc");
        }else if (code == 2){
            long id = ContentUris.parseId(uri);
            cursor = db.query("test_table", null, "_id=?", new String[]{String.valueOf(id)}, null, null, "_id desc");
        }
        return cursor;
    }
    @Nullable
    @Override
    public String getType(Uri uri) {
        int code = matcher.match(uri);
        String type = null;
        if (code == 1){
            type = "vnd.android.cursor.dir/test_table";//代表返回结果为多列数据
        }else if (code == 2){
            type = "vnd.android.cursor.item/test_table";//代表返回结果为单列数据
        }
        return type;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        int code = matcher.match(uri);
        if (code != 1 && code != 2) {
            throw new RuntimeException("地址不能匹配");
        }
        SQLiteDatabase db = helper.getWritableDatabase();
        long id = db.insert("test_table", null, values);
        return ContentUris.withAppendedId(uri, id);// 返回值代表访问新添加数据的uri
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int code = matcher.match(uri);
        if (code == 1) {
            throw new RuntimeException("不能删除所有数据");
        } else if (code == 2) {
            long id = ContentUris.parseId(uri);
            SQLiteDatabase db = helper.getWritableDatabase();
            db.delete("test_table", "_id=?",
                    new String[] { id + "" });
        }
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        int code = matcher.match(uri);
        int row = 0;
        if (code == 2) {
            long id = ContentUris.parseId(uri);
            SQLiteDatabase db = helper.getWritableDatabase();
            row = db.update("test_table", values, "_id=?",
                    new String[] { id + "" });
        }
        return row;
    }
}

插入数据

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PhoneData.getIntance(this).insert("10086");
    }
}

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

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

<provider
    android:name=".utils.ContentProviderUtils"
    android:authorities="com.example.contentprovidertest"
    android:exported="true">
</provider>

另一个应用调用ContentResolver获取数据

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = (TextView) findViewById(R.id.tv);

        Uri uri = Uri.parse("content://com.example.contentprovidertest/test_table");
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);

        String phone = "";
        while (cursor.moveToNext()){
            phone = cursor.getString(cursor.getColumnIndex("phone"));
            Log.e("-----------", phone);
        }
        tv.setText(phone);
    }
}

项目地址:http://download.csdn.net/download/weixin_40391500/10046744

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值