数据储存(二)及共享

ContentProvider:
ContentProvider的接口充当应用程序之间的桥梁,通过它可以实现应用程序之间的数据共享和改变,首先你需要在AndroidManifest XML文件中设置权限许可,并且可以通过简单的URI模型进行访问,每个内容提供提都有一个唯一的统一的资源标识符(URI),通常其URI可以有ContentProvider的authority和数据表名字组成。
应用程序需要通过ContentResolver实例访问内容提供器,如

ContentResolver crInstance = getContentResolver();
crInstance.query(People.CONTENT_URI,null,null,null,null,);

ContentValues new_values = new ContentValues();
crInstance.insert(People.CONTENT_URI,new_values);
crInstance.delete(People.CONTEN_URI,null,null);

crInstance.update(People_URI,null,null);

先介绍一下Android系统的原生数据库

  1. Browser
  2. CallLog
  3. Contacts
  4. LiveFolders
  5. MediaStore
  6. Setting
  7. SearchRecentSuggestion
  8. SyncStateContact
  9. UserDictionary

要想在其他应用程序中访问数据库,首先你需要创建一个ContentProvider的继承类,然后 继承其方法,当你在另一个应用程序中得到 ContentResolver时,则可以调用这些方法。可以选择性override方法有:

  1. query
  2. insert
  3. update
  4. delete
  5. getType
  6. onCreate

先介绍一个UriMatcher这个类,用来辅助实现在ContentProvider中URI的匹配操作 。首先你可以先定义一些code,这些code可以呈tree装,用于匹配成功时的返回值。

private static final int PEOPLE = 1;
    private static final int PEOPLE_ID = 2;
    private static final int PEOPLE_PHONES = 3;
    private static final int PEOPLE_PHONES_ID = 4;
    private static final int PEOPLE_CONTACTMETHODS = 7;
    private static final int PEOPLE_CONTACTMETHODS_ID = 8;

    private static final int DELETED_PEOPLE = 20;

    private static final int PHONES = 9;
    private static final int PHONES_ID = 10;
    private static final int PHONES_FILTER = 14;

    private static final int CONTACTMETHODS = 18;
    private static final int CONTACTMETHODS_ID = 19;

    private static final int CALLS = 11;
    private static final int CALLS_ID = 12;
    private static final int CALLS_FILTER = 15;

然后定义你的UriMatcher实例。

private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static
    {
        sURIMatcher.addURI("contacts", "people", PEOPLE);
        sURIMatcher.addURI("contacts", "people/#", PEOPLE_ID);
        sURIMatcher.addURI("contacts", "people/#/phones", PEOPLE_PHONES);
        sURIMatcher.addURI("contacts", "people/#/phones/#", PEOPLE_PHONES_ID);
        sURIMatcher.addURI("contacts", "people/#/contact_methods", PEOPLE_CONTACTMETHODS);
        sURIMatcher.addURI("contacts", "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);
        sURIMatcher.addURI("contacts", "deleted_people", DELETED_PEOPLE);
        sURIMatcher.addURI("contacts", "phones", PHONES);
        sURIMatcher.addURI("contacts", "phones/filter/*", PHONES_FILTER);
        sURIMatcher.addURI("contacts", "phones/#", PHONES_ID);
        sURIMatcher.addURI("contacts", "contact_methods", CONTACTMETHODS);
        sURIMatcher.addURI("contacts", "contact_methods/#", CONTACTMETHODS_ID);
        sURIMatcher.addURI("call_log", "calls", CALLS);
        sURIMatcher.addURI("call_log", "calls/filter/*", CALLS_FILTER);
        sURIMatcher.addURI("call_log", "calls/#", CALLS_ID);
    }

这样改UriMather实例就具有了匹配多个URI功能,其中#表示任意number,*表示任意字母。

public void addURI(String authority, String path, int code)将一个Uri添加到该UriMatcher中,并确定成功匹配后的返回值。

public int match(Uri uri)实现匹配功能,返回code。

public class DiaryContentProvider extends ContentProvider {

    private MyDB dba;
    private static final UriMatcher sUriMatcher;
    private static final int DIARIES = 1;
    public static final String AUTHORITY = "com.example.almoliu.mydbtest";

    static {
        sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        sUriMatcher.addURI(AUTHORITY,Constants.TABLE_NAME,DIARIES);
    }

    @Override
    public boolean onCreate() {
        dba = new MyDB(this.getContext());
        dba.openW();
        return false;
    }

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

        Cursor c= null;
     //  dba.openW();
        switch (sUriMatcher.match(uri)) {
            case DIARIES:
                c = dba.getdiaries();
                break;
            default:
                throw new IllegalArgumentException("Unknow URI"+uri);
        }
        c.setNotificationUri(getContext().getContentResolver(),uri);
        return c;
    }

    public DiaryContentProvider() {
        super();
    }

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

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

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

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

在另一个应用程序的activity中:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.output);
          String myUri = "content://com.example.almoliu.mydbtest/diaries";
        Uri CONTENT_URI  = Uri.parse(myUri);
        ContentResolver crInstance = getContentResolver();
        Cursor c = crInstance.query(CONTENT_URI, null, null, null, null);


        StringBuilder sb = new StringBuilder();
        if(c.moveToFirst()) {
            do{
                sb.append(c.getString(1)).append("\n");
            }while(c.moveToNext());
        }
        tv.setText(sb.toString());
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值