自定义ContentProvider

package com.ckcs.android;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.PhoneLookup;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class HelloAndroid extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    private TextView messageLabel;
    private EditText messageField;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // 初始化试图
        Button sendButton = (Button) findViewById(R.id.sendMessageButton);
        sendButton.setOnClickListener(this);

        messageLabel = (TextView) findViewById(R.id.messageLabel);
        messageField = (EditText) findViewById(R.id.messageField);

        // 初始化联系人列表
        listContacts();
    }

    private void listContacts() {
        // 得到ContentResolver对象
        ContentResolver cr = getContentResolver();
        // 取得电话本中开始一项的光标
        Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
                null, null, null);
        StringBuilder sb = new StringBuilder();
        String singleLine = "";
        while (cursor.moveToNext()) {
            // 取得联系人名字
            int nameFieldColumnIndex = cursor
                    .getColumnIndex(PhoneLookup.DISPLAY_NAME);
            String name = cursor.getString(nameFieldColumnIndex);
            singleLine += name + " : ";

            // 取得联系人ID
            String contactId = cursor.getString(cursor
                    .getColumnIndex(ContactsContract.Contacts._ID));
            Cursor phone = cr.query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = "
                            + contactId, null, null);

            // 取得电话号码(可能存在多个号码)
            while (phone.moveToNext()) {
                String strPhoneNumber = phone
                        .getString(phone
                                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                singleLine += (strPhoneNumber + " : ");
            }           
            phone.close();
            singleLine += "/n";
            sb.append(singleLine);
            singleLine = "";
        }
        cursor.close();
        TextView contactInfoLabel = (TextView) findViewById(R.id.contactInfoLabel);
        contactInfoLabel.setText(sb.toString());
    }

    /*
     * (non-Javadoc)
     *
     * @see android.view.View.OnClickListeneronClick(android.view.View)
     */
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.sendMessageButton:
            doSaveMessage();
            break;
        default:
            break;
        }
    }

    //
    private void doSaveMessage() {
        messageLabel.setText(messageField.getText());
    }
}

 

//-------------------------------------------------------------------------------------------------

package com.ckcs.android.provider;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;

/**
 * @author ckcs
 *
 */
public class BooksProvider extends ContentProvider {

    public static final String TAG = "BooksProvider";
    public static final String PROVIDER_NAME = "com.ckcs.android.provider.BooksProvider";

    public static final Uri CONTENT_URI = Uri.parse("content://"
            + PROVIDER_NAME + "/books");

    public static final String _ID = "_id";
    public static final String TITLE = "title";
    public static final String ISBN = "isbn";
    private static final int BOOKS = 1;
    private static final int BOOK_ID = 2;
    private static final UriMatcher uriMatcher;

    static {
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(PROVIDER_NAME, "books", BOOKS);
        uriMatcher.addURI(PROVIDER_NAME, "books/", BOOK_ID);
    }

    // ---for database use---
    private SQLiteDatabase booksDB;
    private static final String DATABASE_NAME = "Books";
    private static final String DATABASE_TABLE = "titles";
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_CREATE = "create table "
            + DATABASE_TABLE + " (_id integer primary key autoincrement, "
            + "title text not null, isbn text not null);";

    @Override
    public boolean onCreate() {
       
        Context context = getContext();
        DatabaseHelper dbHelper = new DatabaseHelper(context);
        booksDB = dbHelper.getWritableDatabase();
        return (booksDB == null) ? false : true;
    }

    private static class DatabaseHelper extends SQLiteOpenHelper {
        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

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

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w("Content provider database",
                    "Upgrading database from version " + oldVersion + " to "
                            + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS titles");
            onCreate(db);
        }
    }

    @Override
    public String getType(Uri uri) {
        switch (uriMatcher.match(uri)) {
        // ---get all books---
        case BOOKS:
            return "vnd.android.cursor.dir/vnd.learn2develop.books ";
            // ---get a particular book---
        case BOOK_ID:
            return "vnd.android.cursor.item/vnd.learn2develop.books ";
        default:
            throw new IllegalArgumentException("Unsupported URI: " + uri);
        }
    }

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

        SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();
        sqlBuilder.setTables(DATABASE_TABLE);

        if (uriMatcher.match(uri) == BOOK_ID)
            // ---if getting a particular book---
            sqlBuilder.appendWhere(_ID + " = " + uri.getPathSegments().get(1));

        if (sortOrder == null || sortOrder == "")
            sortOrder = TITLE;

        Cursor c = sqlBuilder.query(booksDB, projection, selection,
                selectionArgs, null, null, sortOrder);

        // ---register to watch a content URI for changes---
        c.setNotificationUri(getContext().getContentResolver(), uri);
        return c;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // ---add a new book---
        long rowID = booksDB.insert(DATABASE_TABLE, "", values);

        // ---if added successfully---
        if (rowID > 0) {
            Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);
            getContext().getContentResolver().notifyChange(_uri, null);
            return _uri;
        }

        throw new SQLException("Failed to insert row into " + uri);
    }

    @Override
    public int delete(Uri arg0, String arg1, String[] arg2) {
        // arg0 = uri
        // arg1 = selection
        // arg2 = selectionArgs

        int count = 0;
        switch (uriMatcher.match(arg0)) {
        case BOOKS:
            count = booksDB.delete(DATABASE_TABLE, arg1, arg2);
            break;

        case BOOK_ID:
            String id = arg0.getPathSegments().get(1);
            count = booksDB.delete(DATABASE_TABLE, _ID + " = " + id
                    + (!TextUtils.isEmpty(arg1) ? " AND (" + arg1 + ')' : ""),
                    arg2);
            break;

        default:
            throw new IllegalArgumentException("Unknown URI " + arg0);
        }

        getContext().getContentResolver().notifyChange(arg0, null);
        return count;

    }

    @Override
    public int update(Uri uri, ContentValues values,
    String selection, String[] selectionArgs)
    {
        int count = 0;
        switch (uriMatcher.match(uri)) {
        case BOOKS:
            count = booksDB.update(
            DATABASE_TABLE,
            values,
            selection,
            selectionArgs);
            break;

        case BOOK_ID:
            count = booksDB.update(DATABASE_TABLE, values, _ID
                    + " = "
                    + uri.getPathSegments().get(1)
                    + (!TextUtils.isEmpty(selection) ? " AND (" + selection
                            + ')' : ""), selectionArgs);
            break;

        default:
            throw new IllegalArgumentException("Unknown URI " + uri);
        }
       
        getContext().getContentResolver().notifyChange(uri, null);
        return count;
    }
}

 

//-------------------------------------------------------------------------------------------------------------------

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <EditText android:id="@+id/messageField" android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <TextView android:id="@+id/messageLabel" android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:text="@string/hello" />
    <Button android:id="@+id/sendMessageButton"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:text="@string/send_message" />
    <TextView android:id="@+id/contactInfoLabel"
        android:layout_width="fill_parent" android:layout_height="wrap_content" />
</LinearLayout>

 

//-------------------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">s..............</string>
    <string name="app_name">HelloAndroid</string>
    <string name="send_message">Send</string>
</resources>

//-------------------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ckcs.android" android:versionCode="1" android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".HelloAndroid" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <provider android:name=".provider.BooksProvider"
            android:authorities="com.ckcs.android.provider.BooksProvider"></provider>
    </application>
    <uses-permission android:name="android.permission.READ_CONTACTS">
    </uses-permission>
    <uses-sdk android:minSdkVersion="8" />

</manifest>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值