2011.09.07(4)——— android 跨进程通信之content provider

参考:http://blog.csdn.net/yan8024/article/details/6444368

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

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);      }  @Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubreturn null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO Auto-generated method stubreturn null;}@Overridepublic boolean onCreate() {mContext = getContext();db = openDatabase();return true;}@Overridepublic 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;}@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {// TODO Auto-generated method stubreturn 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 blocke.printStackTrace();}        }        if(is!=null){        try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}        }        }        }                    return null;    }}


xml注册:

<receiver android:name=".MyBroadcast" ><intent-filter><action android:name="com.lp.MyBroadcast"/></intent-filter></receiver><provider android:name=".MyProvider" android:authorities="com.helloword.myprovider" />


权限:

<!-- 在SDCard中创建与删除文件权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 往SDCard写入数据权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>



2、另一个应用调用:

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() {@Overridepublic 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();    }


更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. android 往sd卡中写入文件
  4. Android(安卓)建立文件夹、生成文件并写入文本文件内容
  5. Android打印工具类
  6. android light
  7. Android(安卓)读写文件的N种写法
  8. 关于资源文件:颜色
  9. 收集整理的Android(安卓)color.xml文件的颜色配置

随机推荐

  1. android文件选择、读取、浏览器的实现(音
  2. Super Jumper:一个2DOpenGL ES游戏
  3. android box2d运行小例子,配置eclipse【转
  4. Framework StatusBar添加(wifi,bluetooth,
  5. android 蓝牙小总结
  6. Android(安卓)ViewPager 如何判断当前页
  7. Android与iPhone的对比(水木上看到的,不清
  8. Android(安卓)8.0 以上获取设备序列号, An
  9. Android应用开发笔记(7):构建自己的Androi
  10. android eclipse 混淆jar代码