• Android内容提供者使用及创建


    先介绍一下,ContentProvider可以进行应用间的数据交换,即向其他应用暴露自己想暴露的数据。

    实际应用中大多数情况下应该是使用Android系统自带的内容提供者来向Android自带的数据库(短信,联系人,通话记录等等)进行操作。

    (一)先给大家介绍一个简单的内容提供者的实现及使用。

    1 需要建立一自己的Provider 继承ContentProvider

    下面是自己的一个AccountProviderr的实现:

    只实现了一个查询的方法

    package com.example.day09_pracontentprovider;
    
    import android.content.ContentProvider;
    import android.content.ContentValues;
    import android.content.UriMatcher;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.net.Uri;
    
    public class AccountProviderr extends ContentProvider{
        private MyOpenHelper myOpenHelper;   //自定义的数据库
        private static final int QUERYSUCCESS = 0; //定义的常量用来匹配要进行的操作
    
        // 1 路径匹配器
        private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        // 2 静态代码块 添加匹配规则
        static{
            
    //        url      http://www.baidu.com
    //        uri:         com.zyf.provider/query
            sURIMatcher.addURI("com.zyf.provider", "query", QUERYSUCCESS);
        }
        
        @Override
        public boolean onCreate() {
            myOpenHelper=new MyOpenHelper(getContext());
            return false;
        }
        @Override
        public int delete(Uri arg0, String arg1, String[] arg2) {
            // TODO Auto-generated method stub
            return 0;
        }
    
        @Override
        public String getType(Uri arg0) {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        public Uri insert(Uri arg0, ContentValues arg1) {
            // TODO Auto-generated method stub
            return null;
        }
    
       public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
          int code=sURIMatcher.match(uri);   //获取Uri的匹配码
            if (code == QUERYSUCCESS) {       //如果匹配 进行查询 返回 查询结果cursor
                SQLiteDatabase db=myOpenHelper.getReadableDatabase();
                Cursor cursor = db.query("info", null, null,null,null, null, null);
                System.out.println("我是内容提供者的");
                return cursor;//Returns:A Cursor object, which is positioned before the first entry.
            } else{                          // 不匹配 返回null
                return null;
            }
        }
    
        @Override
        public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
            // TODO Auto-generated method stub
            return 0;
        }
    
    }

    这里要注意在清单文件中声明自己创建的内容提供者时要将android:exported="true"

    <provider android:name="com.example.day09_pracontentprovider.AccountProviderr"
           android:authorities="com.zyf.provider"
              android:exported="true">

    下面是一个MyOpenHelper类

    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class MyOpenHelper extends SQLiteOpenHelper{
    
        public MyOpenHelper(Context context) {
            super(context, "info.db", null, 1);
        }
    
        @Override
        public void onCreate(SQLiteDatabase arg0) {
            arg0.execSQL("create table info (_id integer primary key autoincrement,name varchar(20)," +
                    "phone varchar(20),number varchar(20))");
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
            
        }
    
    }

    在另一个应用中使用上面建立的内容提供者

    import android.net.Uri;
    import android.os.Bundle;
    import android.app.Activity;
    import android.database.Cursor;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            Uri uri=Uri.parse("content://com.zyf.provider/query");
            Cursor cursor=getContentResolver().query(uri, null, null,null, null);
            
            if(cursor !=null && cursor.getCount()>0){
                while(cursor.moveToNext()){
                    String name=cursor.getString(1);
                    String phone=cursor.getString(2);
                    System.out.println("-----name"+name+"------"+phone);
                }
            }
        }
    }

    (二)使用Android系统自带的Provider

    使用Android自带的内容提供者其实相当的简单

                    Uri uri=Uri.parse("content://sms");    //uri在Android的源码中可以查看
    ContentValues values=new ContentValues(); values.put("address", "132454854"); values.put("date", System.currentTimeMillis()); values.put("body", "I am message body"); getContentResolver().insert(uri, values);//获取内容提供者并插入

    这样几行代码便实现了向你的手机中添加一条信息。

    内容有问题请大家告知我,我会在第一时间内进行更改哦

  • 相关阅读:
    GetForegroundWindow 与 GetActiveWindow 的区别 回复 "delphier" 的问题
    给 TStringGrid 添加鼠标拖动功能 回复 "dxx" 的问题
    Delphi 的编译指令(3): 常用的预定义条件标识符
    Delphi 的编译指令(1): $DEFINE、$UNDEF、$IFDEF、$ELSE、$ENDIF
    用多媒体库 Bass.dll 播放 mp3 [17] : 如何从内存流播放 回复 "小李子子" 的问题
    Delphi 的编译指令(4): 编译指令全表(未完)
    窗口跟随 回复 "heyongan" 的问题
    字符串转换到指定格式的宽字符 回复 "厨师" 的问题
    Dll 使用 PChar 参数的小例子 回复 "linximf" 的问题
    上周热点回顾(5.286.3)
  • 原文地址:https://www.cnblogs.com/zzl521/p/8846448.html
Copyright © 2020-2023  润新知