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)

Param info
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 進行訪問。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章