使用ContentProvider实现应用间数据共享

使用ContentProvider实现应用间数据共享

简介

使用ContentProvider可以方便地实现向第三方应用提供本应用数据的增删改查功能。详见官网介绍:
https://developer.android.google.cn/guide/topics/providers/content-providers

代码实现

服务端应用实现

新建一个类,实现ContentProvider的增删改查接口,并定义ContentProvider使用的url:

package com.test.contentproviderserver;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;

public class dataProvider extends ContentProvider
{
    private SQLiteDatabase db;

    //若不匹配采用UriMatcher.NO_MATCH(-1)返回
    private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);

    //匹配码
    private static final int CODE_NAME = 1;
    private static final int CODE_INFO = 2;

    //定义url与匹配码的对应关系
    static
    {
        MATCHER.addURI("com.test.dataProvider", "name", CODE_NAME);
        MATCHER.addURI("com.test.dataProvider", "info", CODE_INFO);
    }

    @Override
    public boolean onCreate()
    {
        DBHelper helper = new DBHelper(getContext());
        //创建数据库
        db = helper.getWritableDatabase();
        return true;
    }

    /**
     * 外部应用向本应用插入数据
     */
    @Override
    public Uri insert(Uri uri, ContentValues values)
    {
        switch (MATCHER.match(uri))
        {
            case CODE_NAME:
                Log.d("dataProvider", "insert name");
                try {
                    db.insert("name_table", null, values);
                } catch(Exception e) {
                    Log.d("dataProvider","insert Exception:" + e);
                }
                break;
            case CODE_INFO:
                Log.d("dataProvider","insert info");
                try {
                    db.insert("info_table", null, values);
                } catch(Exception e) {
                    Log.d("dataProvider","insert Exception:" + e);
                }
                break;
            default:
                break;
        }

        return null;
    }

    /**
     * 外部应用向本应用删除数据
     */
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs)
    {
        switch (MATCHER.match(uri))
        {
            case CODE_NAME:
                Log.d("dataProvider", "delete name");
                try {
                    db.delete("name_table", selection, selectionArgs);
                } catch(Exception e) {
                    Log.d("dataProvider","delete Exception:" + e);
                }
                break;
            case CODE_INFO:
                Log.d("dataProvider","delete info");
                try {
                    db.delete("info_table", selection, selectionArgs);
                } catch(Exception e) {
                    Log.d("dataProvider","delete Exception:" + e);
                }
                break;
            default:
                break;
        }
        return 0;
    }

    /**
     * 外部应用向本应用更新数据
     */
    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
    {
        switch (MATCHER.match(uri))
        {
            case CODE_NAME:
                Log.d("dataProvider", "update name");
                try {
                    db.update("name_table", values, selection, selectionArgs);
                } catch(Exception e) {
                    Log.d("dataProvider","update Exception:" + e);
                }
                break;
            case CODE_INFO:
                Log.d("dataProvider","update info");
                try {
                    db.update("info_table", values, selection, selectionArgs);
                } catch(Exception e) {
                    Log.d("dataProvider","update Exception:" + e);
                }
                break;
            default:
                break;
        }

        return 0;
    }

    /**
     * 返回对应的内容类型
     */
    @Override
    public String getType(Uri uri)
    {
        return null;
    }

    /**
     * 外部应用向本应用查询数据
     */
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
    {
        Cursor cursor = null;
        switch (MATCHER.match(uri))
        {
            case CODE_NAME:
                Log.d("dataProvider","query name");
                try {
                    cursor = db.query("name_table", projection, selection, selectionArgs,
                            null, null, sortOrder);
                } catch (Exception e) {
                    Log.d("dataProvider","query Exception:" + e);
                }
                return cursor;
            case CODE_INFO:
                Log.d("dataProvider","query info");
                try {
                    cursor = db.query("info_table", projection, selection, selectionArgs,
                            null, null, sortOrder);
                } catch (Exception e) {
                    Log.d("dataProvider","query Exception:" + e);
                }
                return cursor;
            default:
                break;
        }
        return null;
    }

}

新建一个类,用于创建用到的数据库和数据表:

package com.test.contentproviderserver;

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

public class DBHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "data.db";
    private static final int DB_VERSION = 1;

    public DBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL("create table if not exists name_table("
                + "id integer primary key,"
                + "name varchar)");

        db.execSQL("create table if not exists info_table("
                + "id integer primary key,"
                + "info varchar)");
    }

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

    }
}

在AndroidManifest.xml中声明实现的ContentProvider:

        <provider android:name=".dataProvider"
            android:authorities="com.test.dataProvider"
            android:exported="true" />

客户端应用实现

客户端通过url调用服务端的增删改查接口,实现操作服务端的数据:

package com.test.contentproviderclient;

import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    private static String nameTableUrl = "content://com.test.dataProvider/name";
    private static String infoTableUrl = "content://com.test.dataProvider/info";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        insertData();
        queryData();

        deleteData();
        queryData();

        updateData();
        queryData();
    }

    //插入数据
    private void insertData() {
        try {
            Log.d("client", "insertData insert name");
            ContentValues nameValues = new ContentValues();
            nameValues.put("name", "小明");
            getContentResolver().insert(Uri.parse(nameTableUrl), nameValues);

            ContentValues nameValues2 = new ContentValues();
            nameValues2.put("name", "小暗");
            getContentResolver().insert(Uri.parse(nameTableUrl), nameValues2);

            ContentValues nameValues3 = new ContentValues();
            nameValues3.put("name", "小红");
            getContentResolver().insert(Uri.parse(nameTableUrl), nameValues3);
        } catch (Exception e) {
            Log.d("client", "insertData e1:" + e);
        }

        try {
            Log.d("client", "insertData insert info");
            ContentValues infoValues = new ContentValues();
            infoValues.put("info", "12345");
            getContentResolver().insert(Uri.parse(infoTableUrl), infoValues);

            ContentValues infoValues2 = new ContentValues();
            infoValues2.put("info", "54321");
            getContentResolver().insert(Uri.parse(infoTableUrl), infoValues2);

            ContentValues infoValues3 = new ContentValues();
            infoValues3.put("info", "00000");
            getContentResolver().insert(Uri.parse(infoTableUrl), infoValues3);
        } catch (Exception e) {
            Log.d("client", "insertData e2:" + e);
        }
    }

    //删除数据
    private void deleteData() {
        try {
            Log.d("client", "deleteData delete name");
            getContentResolver().delete(Uri.parse(nameTableUrl), "id=?", new String[]{"1"});
        } catch (Exception e) {
            Log.d("client", "deleteData e1:" + e);
        }

        try {
            Log.d("client", "deleteData delete info");
            getContentResolver().delete(Uri.parse(infoTableUrl), "info=?", new String[]{"00000"});
        } catch (Exception e) {
            Log.d("client", "deleteData e2:" + e);
        }
    }

    //更新数据
    private void updateData() {
        try {
            Log.d("client", "updateData update name");
            ContentValues nameValues = new ContentValues();
            nameValues.put("name", "小黑");
            getContentResolver().update(Uri.parse(nameTableUrl), nameValues, "name=?", new String[]{"小红"});
        } catch (Exception e) {
            Log.d("client", "updateData e1:" + e);
        }

        try {
            Log.d("client", "updateData update info");
            ContentValues infoValues = new ContentValues();
            infoValues.put("info", "66666");
            getContentResolver().update(Uri.parse(infoTableUrl), infoValues, "id=?", new String[]{"2"});
        } catch (Exception e) {
            Log.d("client", "updateData e2:" + e);
        }
    }

    //查询数据
    private void queryData() {
        try {
            Cursor cursor = getContentResolver().query(Uri.parse(nameTableUrl), null,null, null,null);
            if(cursor != null) {
                if(cursor.getCount() > 0) {
                    int i= 1;
                    while(cursor.moveToNext()) {
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        Log.d("client", "queryData name " + i + ":" + name);
                        i++;
                    }
                } else {
                    Log.d("client", "queryData cursor is empty");
                }
            } else {
                Log.d("client", "queryData cursor is null");
            }
        } catch(Exception e) {
            Log.d("client", "queryData queryData e1:" + e);
        }

        try {
            Cursor cursor = getContentResolver().query(Uri.parse(infoTableUrl), null,null, null,null);
            if(cursor != null) {
                if(cursor.getCount() > 0) {
                    int i= 1;
                    while(cursor.moveToNext()) {
                        String info = cursor.getString(cursor.getColumnIndex("info"));
                        Log.d("client", "queryData info " + i + ":" + info);
                        i++;
                    }
                } else {
                    Log.d("client", "queryData cursor is empty");
                }
            } else {
                Log.d("client", "queryData cursor is null");
            }
        } catch(Exception e) {
            Log.d("client", "queryData e2:" + e);
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值