[Android开发]android 跨进程通信之content provider

1、自定义provider 包含两个查询:全名查询和模糊查询

Java代码 复制代码  收藏代码
  1. package com.HelloWorld;   
  2.   
  3. import java.io.File;   
  4. import java.io.FileOutputStream;   
  5. import java.io.IOException;   
  6. import java.io.InputStream;   
  7.   
  8. import android.content.ContentProvider;   
  9. import android.content.ContentValues;   
  10. import android.content.Context;   
  11. import android.content.UriMatcher;   
  12. import android.database.Cursor;   
  13. import android.database.sqlite.SQLiteDatabase;   
  14. import android.net.Uri;   
  15. import android.os.Environment;   
  16.   
  17. public class MyProvider extends ContentProvider {   
  18.   
  19.        
  20.     private final static String DB_DIR = "lp";   
  21.     private final static String DB_NAME = "contacts.db";   
  22.     private final static String TABLE_NAME = "PRMContacts";   
  23.     private Context mContext;   
  24.     private SQLiteDatabase db ;   
  25.     private  static  final  String AUTHORITY = "com.helloword.myprovider" ;   
  26.     private  static  UriMatcher uriMatcher;     
  27.     private  static  final  int  ONE = 1 ;     
  28.     private  static  final  int  MORE = 2 ;     
  29.     static      
  30.     {     
  31.         //  添加访问ContentProvider的Uri      
  32.         uriMatcher = new  UriMatcher(UriMatcher.NO_MATCH);     
  33.         uriMatcher.addURI(AUTHORITY, "one" , ONE);     
  34.         uriMatcher.addURI(AUTHORITY, "more/*" , MORE);     
  35.     }     
  36.        
  37.     @Override  
  38.     public int delete(Uri uri, String selection, String[] selectionArgs) {   
  39.         // TODO Auto-generated method stub   
  40.         return 0;   
  41.     }   
  42.   
  43.     @Override  
  44.     public String getType(Uri uri) {   
  45.         // TODO Auto-generated method stub   
  46.         return null;   
  47.     }   
  48.   
  49.     @Override  
  50.     public Uri insert(Uri uri, ContentValues values) {   
  51.         // TODO Auto-generated method stub   
  52.         return null;   
  53.     }   
  54.   
  55.     @Override  
  56.     public boolean onCreate() {   
  57.         mContext = getContext();   
  58.         db = openDatabase();   
  59.         return true;   
  60.     }   
  61.   
  62.     @Override  
  63.     public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {   
  64.         Cursor cursor = null;   
  65.         System.out.println("query");   
  66.         switch(uriMatcher.match(uri)){   
  67.             case ONE:   
  68.                 cursor = db.query(TABLE_NAME, projection, selection, selectionArgs, nullnull, sortOrder);   
  69.                 break;   
  70.             case MORE:   
  71.                 String word = uri.getPathSegments().get(1);   
  72.                 cursor = db.rawQuery("select * from "+TABLE_NAME+" where displayname like ?"new String[]{word+"%"});   
  73.                 break;   
  74.             default:   
  75.                 throw new IllegalArgumentException("无效参数");   
  76.         }   
  77.         return cursor;   
  78.     }   
  79.   
  80.     @Override  
  81.     public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {   
  82.         // TODO Auto-generated method stub   
  83.         return 0;   
  84.     }   
  85.        
  86.      private SQLiteDatabase openDatabase()   
  87.         {   
  88.             if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){   
  89.                 FileOutputStream fos = null;   
  90.                 InputStream is = null;   
  91.                 try  
  92.                 {   
  93.                     String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/"+DB_DIR;   
  94.                        
  95.                     // 获得dictionary.db文件的绝对路径   
  96.                     String databaseFilename = path + "/" + DB_NAME;   
  97.                     File dir = new File(path);   
  98.                        
  99.                     if(!dir.exists()){   
  100.                         dir.mkdir();   
  101.                     }   
  102.                        
  103.                     File db = new File(databaseFilename);   
  104.                     if(!db.exists()){   
  105.                         fos = new FileOutputStream(db);   
  106.                         is = mContext.getResources().openRawResource(R.raw.contacts);   
  107.                            
  108.                         byte[] buffer = new byte[1024];   
  109.                         int length = 0;   
  110.                         while((length = is.read(buffer))!=-1){   
  111.                             fos.write(buffer, 0, length);   
  112.                         }   
  113.                     }   
  114.                        
  115.                     SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFilename, null);   
  116.                     return database;   
  117.                 }   
  118.                 catch (Exception e){   
  119.                        
  120.                 }finally{   
  121.                     if(fos!=null){   
  122.                         try {   
  123.                             fos.close();   
  124.                         } catch (IOException e) {   
  125.                             // TODO Auto-generated catch block   
  126.                             e.printStackTrace();   
  127.                         }   
  128.                     }   
  129.                     if(is!=null){   
  130.                         try {   
  131.                             is.close();   
  132.                         } catch (IOException e) {   
  133.                             // TODO Auto-generated catch block   
  134.                             e.printStackTrace();   
  135.                         }   
  136.                     }   
  137.                 }   
  138.             }   
  139.                    
  140.             return null;   
  141.         }   
  142.   
  143. }  
package com.HelloWorld;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Environment;

public class MyProvider extends ContentProvider {

	
	private final static String DB_DIR = "lp";
	private final static String DB_NAME = "contacts.db";
	private final static String TABLE_NAME = "PRMContacts";
	private Context mContext;
	private SQLiteDatabase db ;
	private  static  final  String AUTHORITY = "com.helloword.myprovider" ;
	private  static  UriMatcher uriMatcher;  
	private  static  final  int  ONE = 1 ;  
	private  static  final  int  MORE = 2 ;  
	static   
    {  
        //  添加访问ContentProvider的Uri   
        uriMatcher = new  UriMatcher(UriMatcher.NO_MATCH);  
        uriMatcher.addURI(AUTHORITY, "one" , ONE);  
        uriMatcher.addURI(AUTHORITY, "more/*" , MORE);  
    }  
	
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public String getType(Uri uri) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean onCreate() {
		mContext = getContext();
		db = openDatabase();
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
		Cursor cursor = null;
		System.out.println("query");
		switch(uriMatcher.match(uri)){
			case ONE:
				cursor = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
				break;
			case MORE:
				String word = uri.getPathSegments().get(1);
				cursor = db.rawQuery("select * from "+TABLE_NAME+" where displayname like ?", new String[]{word+"%"});
				break;
			default:
				throw new IllegalArgumentException("无效参数");
		}
		return cursor;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
		// TODO Auto-generated method stub
		return 0;
	}
	
	 private SQLiteDatabase openDatabase()
	    {
        	if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
        		FileOutputStream fos = null;
        		InputStream is = null;
        		try
    	        {
	        		String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/"+DB_DIR;
	        		
	        		// 获得dictionary.db文件的绝对路径
		            String databaseFilename = path + "/" + DB_NAME;
		            File dir = new File(path);
		            
		            if(!dir.exists()){
		            	dir.mkdir();
		            }
		            
		            File db = new File(databaseFilename);
		            if(!db.exists()){
		            	fos = new FileOutputStream(db);
		            	is = mContext.getResources().openRawResource(R.raw.contacts);
		            	
		            	byte[] buffer = new byte[1024];
		            	int length = 0;
		            	while((length = is.read(buffer))!=-1){
		            		fos.write(buffer, 0, length);
		            	}
		            }
		            
		            SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFilename, null);
		            return database;
		        }
		        catch (Exception e){
		        	
		        }finally{
		        	if(fos!=null){
		        		try {
							fos.close();
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
		        	}
		        	if(is!=null){
		        		try {
							is.close();
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
		        	}
		        }
        	}
	            
	        return null;
	    }

}


xml注册:

Java代码 复制代码  收藏代码
  1. <receiver android:name=".MyBroadcast" >   
  2.             <intent-filter>   
  3.                 <action android:name="com.lp.MyBroadcast"/>   
  4.             </intent-filter>   
  5.         </receiver>   
  6.         <provider android:name=".MyProvider" android:authorities="com.helloword.myprovider" />  
<receiver android:name=".MyBroadcast" >
			<intent-filter>
				<action android:name="com.lp.MyBroadcast"/>
			</intent-filter>
		</receiver>
		<provider android:name=".MyProvider" android:authorities="com.helloword.myprovider" />


权限:
   
   
Java代码 复制代码  收藏代码
  1. <!-- 在SDCard中创建与删除文件权限 -->   
  2.     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>   
  3.     <!-- 往SDCard写入数据权限 -->   
  4.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
<!-- 在SDCard中创建与删除文件权限 -->
	<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
	<!-- 往SDCard写入数据权限 -->
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>



2、另一个应用调用:

Java代码 复制代码  收藏代码
  1. private Button find;   
  2.     private TextView name;   
  3.     private static final String ONE = "content://com.helloword.myprovider/one" ;   
  4.     private static final String MORE = "content://com.helloword.myprovider/more" ;   
  5. find.setOnClickListener(new OnClickListener() {   
  6.                
  7.             @Override  
  8.             public void onClick(View v) {   
  9.                 String str = name.getText().toString();   
  10.                 if(str!=null){   
  11.                     //findTelByName(str);   
  12.                     findTelsByName(str);   
  13.                 }   
  14.             }   
  15. });   
  16.        
  17.     private void findTelByName(String name){   
  18.         Uri uri = Uri.parse(ONE);   
  19.         Cursor cursor = getContentResolver().query(uri, null"displayname=?"new String[]{name}, null);   
  20.         String result = "没有找到电话";   
  21.         if(cursor!=null){   
  22.             cursor.moveToNext();   
  23.             result = cursor.getString(cursor.getColumnIndex("telnum"));   
  24.         }   
  25.         Toast.makeText(this, result, 1).show();   
  26.     }   
  27.     private void findTelsByName(String name){   
  28.         Uri uri = Uri.parse(MORE+"/"+name);   
  29.         Cursor cursor = getContentResolver().query(uri, nullnullnullnull);   
  30.         String result = "";   
  31.         if(cursor!=null){   
  32.             while(cursor.moveToNext()){   
  33.                 result += cursor.getString(cursor.getColumnIndex("telnum"));   
  34.                 result += ",";   
  35.             }   
  36.                
  37.         }   
  38.         if(!result.equals(""))   
  39.             Toast.makeText(this, result, 1).show();   
  40.     }  
private Button find;
	private TextView name;
	private static final String ONE = "content://com.helloword.myprovider/one" ;
	private static final String MORE = "content://com.helloword.myprovider/more" ;
find.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				String str = name.getText().toString();
				if(str!=null){
					//findTelByName(str);
					findTelsByName(str);
				}
			}
});
    
    private void findTelByName(String name){
    	Uri uri = Uri.parse(ONE);
    	Cursor cursor = getContentResolver().query(uri, null, "displayname=?", new String[]{name}, null);
    	String result = "没有找到电话";
    	if(cursor!=null){
    		cursor.moveToNext();
    		result = cursor.getString(cursor.getColumnIndex("telnum"));
    	}
    	Toast.makeText(this, result, 1).show();
    }
    private void findTelsByName(String name){
    	Uri uri = Uri.parse(MORE+"/"+name);
    	Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    	String result = "";
    	if(cursor!=null){
    		while(cursor.moveToNext()){
    			result += cursor.getString(cursor.getColumnIndex("telnum"));
    			result += ",";
    		}
    		
    	}
    	if(!result.equals(""))
    		Toast.makeText(this, result, 1).show();
    }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值