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 ));
                }
上面的代码是先进行插入,然后进行查询并打印。就是如此简单,所有的应用如果需要都可以对外方便的提供数据接口,同时其他应用也可以很方便的进行调用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值