Android 讲解:数据共享

Adnroid 中只有当前程序在运行时才能访问当前程序的SQLite 数据库,当一个程序的SQLite 需要让别的程序访问时应该怎么办?

创建ContentResolver 的子类进行本程序的数据共享。
使用ContentResolver 的对象进行其他程序数据访问。

如何访问通讯录


在AndroidManifest.xml的manifest标签内添加
<uses-permission android:name="android.permission.READ_CONTACTS"/>
给予程序读取通讯录权限。

通讯录程序也是使用了ContentResolver 的子类进行数据共享。

MainActivity.java


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

        ContentResolver cr = getContentResolver();
        Cursor cursor = cr.query(Phone.CONTENT_URI, null, null, null, null);

        Log.i(tag, Phone.CONTENT_URI.toString());

        while (cursor.moveToNext()) {

            String name = cursor.getString(cursor
                    .getColumnIndex(Phone.DISPLAY_NAME));
            String number = cursor.getString(cursor
                    .getColumnIndex(Phone.NUMBER));

            Log.i(tag, name + ":\t" + number);
        }

    }

getContentResolver(); 返回值用来增删改查。

query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

Paraminfo
uri这是一个Uri对象,使用ContentResolver 对象操作其他程序的数据必须要一个Uri对象,Uri 对象描述了操作那个程序,那个表的数据。Uri.parse("content://cn.met0.androidtest/tableName"); 返回的是一个Uri对象,其中cn.met0.androidtest 为共享数据的程序包名,而tableName 为操作的表名。
projection查询的列数组
selection查询的条件
selectionArgs查询条件的占位符值
sortOrder查询排序

共享自己程序的数据


共享自己的程序数据需要写一个类,这个类继承ContentProvider可以供其他程序调用。(这个类在共享数据的程序内)
DatabaseProvider.java

package cn.met0.android.chapter2;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;

public class DatabaseProvider extends ContentProvider {

    private static String tag = "DatabaseProvider";
    private DBHelper msql;



    @Override
    public boolean onCreate() {                     
        msql = new DBHelper(getContext(), "chapter2.db", null, 1);
        return true;
    }

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

        return msql.getWritableDatabase().query("user", null, null, null, null, null, null);
    }

    @Override
    public String getType(Uri uri) {
        Log.i(tag, "getType");
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Log.i(tag, "insert");
        return null;
    }

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

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

}

这个类虽然比较长,但是非常简单,就是继承ContentProviter 类,重写它的方法。

最主要的是OnCreate 方法,这个方法获取一个SQLite 数据库的操作对象。只要有了这个操作对象,就能操作数据库了,在增删改查的方法里面,可以判断共享的url 是否符合规则。

在AndroidManifest.xml 的application 标签添加

<provider  android:exported="true" android:name="cn.met0.android.chapter2.DatabaseProvider" android:authorities="cn.met0.android.chapter2"/>

android:exported="true" 其他程序访问
android:name 共享的ContentProviter 子类,这个类是让其他程序通过android:authorities 进行访问。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值