`
javacode23
  • 浏览: 29269 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android中ContentProvider和ContentResolver使用入门

阅读更多

在Android中,我们的应用有的时候需要对外提供数据接口,可以有如下几种方法:1)AIDL 2)Broadcast 3)ContentProvider。
使用AIDL需要我们编写AIDL接口以及实现,而且对方也要有相应的接口描述,有点麻烦;使用Broadcast,我们不需要任何接口描述,只要协议文档就可以了,但是有点不好就是,这种方式不直接而且是异步的;使用ContentProvider我们不需要接口描述,只需要知道协议,同时这种方式是同步的,使用方便。下面是ContentProvider实现:
/** *//**
*
*/
package com.backgroundservice;

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

/** *//**
* TODO
*
* @author tianlu
* @version 1.0 Create At : 2010-2-18 下午01:58:39
*/
public class TestContentProvider extends ContentProvider {
    private SQLiteDatabase mDb;
    private DatabaseHelper mDbHelper = null;
    private static final String DATABASE_NAME = "rssitems.db";
    private static final String DATABASE_TABLE_NAME = "rssItems";
    private static final int DB_VERSION = 1;
    private static final int ALL_MESSAGES = 1;
    private static final int SPECIFIC_MESSAGE = 2;

    // Set up our URL matchers to help us determine what an
    // incoming URI parameter is.
    private static final UriMatcher URI_MATCHER;
    static {
        URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
        URI_MATCHER.addURI("test", "item", ALL_MESSAGES);
        URI_MATCHER.addURI("test", "item/#", SPECIFIC_MESSAGE);
    }

    // Here's the public URI used to query for RSS items.
    public static final Uri CONTENT_URI = Uri
            .parse("content://test/item");

    // Here are our column name constants, used to query for field values.
    public static final String ID = "_id";
    public static final String NAME = "NAME";
    public static final String VALUE = "VALUE";
    public static final String DEFAULT_SORT_ORDER = ID + " DESC";

    private static class DatabaseHelper extends AbstractDatabaseHelper {

        @Override
        protected String[] createDBTables() {
            // TODO Auto-generated method stub
            String sql = "CREATE TABLE " + DATABASE_TABLE_NAME + "(" + ID
                    + " INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " TEXT,"
                    + VALUE + " TEXT);";
            return new String[] { sql };
        }

        @Override
        protected String[] dropDBTables() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        protected String getDatabaseName() {
            // TODO Auto-generated method stub
            return DATABASE_NAME;
        }

        @Override
        protected int getDatabaseVersion() {
            // TODO Auto-generated method stub
            return DB_VERSION;
        }

        @Override
        protected String getTag() {
            // TODO Auto-generated method stub
            return TestContentProvider.class.getSimpleName();
        }

    }

    /** *//**
     *
     */
    public TestContentProvider() {
        // TODO Auto-generated constructor stub
       
    }

    /**//*
     * (non-Javadoc)
     *
     * @see android.content.ContentProvider#delete(android.net.Uri,
     * java.lang.String, java.lang.String[])
     */
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // NOTE Argument checking code omitted. Check your parameters!
        int rowCount = mDb.delete(DATABASE_TABLE_NAME, selection, selectionArgs);

        // Notify any listeners and return the deleted row count.
        getContext().getContentResolver().notifyChange(uri, null);
        return rowCount;
    }

    /**//*
     * (non-Javadoc)
     *
     * @see android.content.ContentProvider#getType(android.net.Uri)
     */
    @Override
    public String getType(Uri uri) {
        switch (URI_MATCHER.match(uri)) {
        case ALL_MESSAGES:
            return "vnd.android.cursor.dir/rssitem"; // List of items.
        case SPECIFIC_MESSAGE:
            return "vnd.android.cursor.item/rssitem"; // Specific item.
        default:
            return null;
        }
    }

    /**//*
     * (non-Javadoc)
     *
     * @see android.content.ContentProvider#insert(android.net.Uri,
     * android.content.ContentValues)
     */
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // NOTE Argument checking code omitted. Check your parameters! Check that
        // your row addition request succeeded!

       long rowId = -1;
       rowId = mDb.insert(DATABASE_TABLE_NAME, NAME, values);
       Uri newUri = Uri.withAppendedPath(CONTENT_URI, ""+rowId);
       Log.i("TestContentProvider", "saved a record " + rowId + " " + newUri);
       // Notify any listeners and return the URI of the new row.
       getContext().getContentResolver().notifyChange(CONTENT_URI, null);
       return newUri;
    }

    /**//*
     * (non-Javadoc)
     *
     * @see android.content.ContentProvider#onCreate()
     */
    @Override
    public boolean onCreate() {
        // TODO Auto-generated method stub
        try
        {
            mDbHelper = new DatabaseHelper();
            mDbHelper.open(getContext());
            mDb = mDbHelper.getMDb();
        }catch(Exception e){
            e.printStackTrace();
        }
        return true;
    }

    /**//*
     * (non-Javadoc)
     *
     * @see android.content.ContentProvider#query(android.net.Uri,
     * java.lang.String[], java.lang.String, java.lang.String[],
     * java.lang.String)
     */
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        // We won't bother checking the validity of params here, but you should!

        // SQLiteQueryBuilder is the helper class that creates the
        // proper SQL syntax for us.
        SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder();

        // Set the table we're querying.
        qBuilder.setTables(DATABASE_TABLE_NAME);

        // If the query ends in a specific record number, we're
        // being asked for a specific record, so set the
        // WHERE clause in our query.
        if((URI_MATCHER.match(uri)) == SPECIFIC_MESSAGE){
            qBuilder.appendWhere("_id=" + uri.getLastPathSegment());
            Log.i("TestContentProvider", "_id=" +  uri.getLastPathSegment());
        }


        // Make the query.
        Cursor c = qBuilder.query(mDb,
                projection,
                selection,
                selectionArgs,
                null,
                null,
                sortOrder);
        Log.i("TestContentProvider", "get records");
        c.setNotificationUri(getContext().getContentResolver(), uri);
        return c;
    }

    /**//*
     * (non-Javadoc)
     *
     * @see android.content.ContentProvider#update(android.net.Uri,
     * android.content.ContentValues, java.lang.String, java.lang.String[])
     */
    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        // NOTE Argument checking code omitted. Check your parameters!
        int updateCount = mDb.update(DATABASE_TABLE_NAME, values, selection, selectionArgs);

        // Notify any listeners and return the updated row count.
        getContext().getContentResolver().notifyChange(uri, null);
        return updateCount;
    }

}
配置文件如下:
        <provider android:name="TestContentProvider"
            android:authorities="test">
        </provider>在客户端中可以使用如下方法进行调用:
                ContentValues values = new ContentValues();
                values.put(TestContentProvider.NAME, "testname1");
                values.put(TestContentProvider.VALUE, "testvalu1e");
                Uri newAddUri = TestActivity.this.getContentResolver().insert(TestContentProvider.CONTENT_URI, values);
                Cursor c = TestActivity.this.managedQuery(newAddUri, new String[]{TestContentProvider.NAME}, null, null, null);
                Log.i("TestActivity", "" + c.getCount());
                if(c.moveToNext())
                {
                    Log.i("TestActivity", c.getString(0));
                }上面的代码是先进行插入,然后进行查询并打印。就是如此简单,所有的应用如果需要都可以对外方便的提供数据接口,同时其他应用也可以很方便的进行调用。
分享到:
评论

相关推荐

    ContentProvider与ContentResolver跨进程共享数据实例

    程序例子包含了2个独立的Android程序,其中一个负责提供数据并提供本地操作,另外一个可以跨进程访问提供者提供的数据。...由于没有其他多余的代码,功能针对性很强,是学习Android跨进程数据共享的入门助手。

    Android入门_-_数据库支持(SQLite),_内容提供器(ContentProvider).doc

    当数据需要在应用程序之间共享时,可以在某个程序中使用ContentProvider定义URI(统一资源标识符),这样其他应用程序就可以通过这个URI来访问指定的数据。ContentProvider通过定义一系列的CRUD(创建、读取、更新、...

    android初学者入门项目

    37、ContentProvider、ContentResolver 应用之间共享数据 38、 Service 相当于没有界面的activity 39、Activity与Service运行中通信 40、Service 相当于没有界面的activity 41、AIDL Service android中的跨进程...

    Android基础知识详解【PDF文档】

    Android中控件的使用和布局设计对界面的最终效果有着决定性的影响。例如,按钮(Button)、文本框(TextView)和列表视图(ListView)是用户交互中经常使用的控件。此外,还有一些专门的控件用于显示日期和时间,如...

    android开发入门资料

    13大话企业级Android开发_数据库.pdf涵盖了SQLite数据库在Android中的使用,包括数据存储、查询、更新和删除等操作,以及如何通过ContentResolver进行数据操作。 五、文件操作 12大话企业级Android开发_文件.pdf...

    android入门、增删改查

    6. **ContentProvider**:ContentProvider是Android系统中数据共享的机制,它允许不同应用之间访问和操作数据。在进行增删改查操作时,ContentResolver是与ContentProvider交互的接口。 7. **Cursor**:当查询...

    Notepad android 记事本 源码

    4. **ContentResolver**:在`NoteListActivity`和`NoteEditActivity`中,ContentResolver用于与ContentProvider交互,执行CRUD(创建、读取、更新、删除)操作。例如,`insertNote()`、`updateNote()`和`deleteNote...

    Android第一行代码源码 ContactsTest.rar

    在Android中,访问联系人数据需要使用ContentResolver和ContentProvider这两个核心组件。ContentResolver是应用程序与ContentProvider之间的接口,它允许应用程序查询、插入、更新和删除存储在ContentProvider中的...

    android系统contentprovier和数据库详解

    《SQL基础教程语句汇总》和《SQL语言入门教程》将帮助你巩固SQL知识,《android系统contentprovier和数据库详解》文档将深入讲解二者在Android中的结合,而`ContentProviderDemo.rar`则可能包含了一个实际的...

    Android学习笔记

    - Android SDK:熟悉Android开发环境的搭建,包括SDK Manager的使用和Android Studio的集成开发环境。 - Activity生命周期:详细阐述各个状态(如onCreate(), onStart(), onResume(), onPause(), onStop(), ...

    Android_calendar.rar_Android 小应用_android_android calendar_androi

    4. **ContentResolver**:与ContentProvider通信的桥梁,用于执行查询、插入、更新和删除操作。例如,获取系统所有日历账户,或者创建新的日历事件。 5. **BroadcastReceiver**(可选):可以监听系统时间改变的...

    Android 快速入门

    这篇文档将引导你踏入Android开发的世界,通过一个由韩国专家编写的全面入门PPT,来理解Android应用的基本概念和核心组件。 首先,我们要了解的是Application Fundamentals,这是构建Android应用的基础。它涵盖了...

    Androidkaifajiaocheng.rar_android

    《Android开发教程笔记完全版》是一份专门为Android初学者精心准备的学习资料,涵盖了Android开发的基础到进阶知识,旨在帮助新手快速入门并掌握Android应用开发的核心技能。这份教程全面、详细,是学习Android编程...

    Android开发文件管理器

    一个Android应用通常由多个组件构成,如Activity、Service、BroadcastReceiver和ContentProvider等。对于文件管理器,主要涉及Activity和ContentResolver。Activity是用户界面的核心,而ContentResolver则负责与系统...

    基于Android2.2的联系人的基本操作(带注释)

    ContentResolver是系统服务,用于与内容提供者交互,而ContactsContract则是Android提供的一组常量和类,定义了接触数据的结构和访问方式。 1. **读取联系人**: - 使用ContentResolver的query()方法,传入...

    大话企业级Android开发

    接下来,书中可能深入解析了Android应用程序的基本架构,包括Activity、Service、BroadcastReceiver和ContentProvider四大组件。对于Activity,会讲解生命周期、Intent的使用以及UI设计原则。Service则可能涵盖后台...

    Android基础教程

    在Android基础教程中,我们将深入探讨Android开发的基本概念和技术,为初学者提供一个全面的入门指南。Android是一种广泛使用的开源操作系统,主要用于智能手机和平板电脑,同时也应用于智能电视、汽车导航系统和...

    android文件管理器源代码

    这些操作需要实现对Android的ContentResolver和File类的调用。 3. 多种视图模式:如列表视图、网格视图、详细信息视图等,以满足不同用户的浏览习惯。 4. 浏览历史:保存用户最近访问过的路径,方便快速返回。 5. ...

Global site tag (gtag.js) - Google Analytics