zoukankan      html  css  js  c++  java
  • 实现内容提供者步骤

      [1]定义内容提供者 定义一个类继承contentProvider
      [2]在清单文件里面配置一下  学霸 定义一些规则 a呀 d
      [3] 定义一个urimatcher 
      [4]写一个静态代码块 添加匹配规则 
      [5]按照我们添加的匹配规则 暴露想暴露的方法 
      [6]如果你发现如下log日志 就说明内容提供者写的没有问题
    09-11 02:02:31.142: I/ActivityThread(16636): Pub com.itheima.provider: com.itheima.db.AccountProvider
      [7]只要是通过内容提供者暴露出来的数据 其他应用访问的方式都是一样的 就是通过内容解析者 
     
    1_创建一个私有的数据库
    public class AccountProvider extends ContentProvider {
    
        
        
        //[1]定一个一个uri路径匹配器 
        private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        private static final int QUERYSUCESS = 0;  //ctrl+shift+X  变大写   小写加y
        private static final int INSERTSUCESS = 1;
        private static final int UPDATESUCESS = 2;
        private static final int DELETESUCESS = 3;
        private MyOpenHelper myOpenHelper;
        //[2]创建一个静态代码块 在这个里面添加 uri 
        static{
            
            /**
             *                                  http://www.baidu.com 
             * authority 注意: 和清单文件里面定义的一样  com.itheima.provider/query 
             *  
             */
            sURIMatcher.addURI("com.itheima.provider", "query", QUERYSUCESS);
            sURIMatcher.addURI("com.itheima.provider", "insert", INSERTSUCESS);
            sURIMatcher.addURI("com.itheima.provider", "update", UPDATESUCESS);
            sURIMatcher.addURI("com.itheima.provider", "delete", DELETESUCESS);
        }
        
        
        //当内容提供者初始化  会执行此方法 
        @Override
        public boolean onCreate() {
            
            //[3]初始化 myopenHelpler 对象    就可以获取到sqlitedatabases对象 我们就可以操作数据库 
            
            myOpenHelper = new MyOpenHelper(getContext());
            
            return false;
        }
    
        //这个方法对外暴露的 
        @Override
        public Cursor query(Uri uri, String[] projection, String selection,
                String[] selectionArgs, String sortOrder) {
            int code = sURIMatcher.match(uri);
            if (code ==QUERYSUCESS ) {
                //说明路径匹配成功
                SQLiteDatabase db = myOpenHelper.getReadableDatabase();
                //调用query方法
                Cursor cursor = db.query("info", projection, selection, selectionArgs, null, null, sortOrder);
                
                //发送一条消息 说明说明数据库被操作了 
                getContext().getContentResolver().notifyChange(uri, null);
                
                
    //            db.close();
                //小细节 ☆ 这个cursor不能关 
                return cursor;
                
            }else{
                //说明路径不匹配
    //            return null;
                throw new IllegalArgumentException("哥们 :uri路径不匹配 请检测路径");
                
            }
                
            
        }
    
        @Override
        public String getType(Uri uri) {
            return null;
        }
    
        @Override
        public Uri insert(Uri uri, ContentValues values) {
            
            int code = sURIMatcher.match(uri);
            if (code == INSERTSUCESS) {
                //说明路径匹配成功 
                SQLiteDatabase db = myOpenHelper.getReadableDatabase();
                
                long insert = db.insert("info", null, values);
                Uri uri2 = Uri.parse("com.hahaheheheihei/"+insert); 
                
                if (insert>0) {
                    //发送一条消息 说明说明数据库被操作了 
                    getContext().getContentResolver().notifyChange(uri, null);
                }
                
                
                db.close();//关闭数据库
                return uri2;
                
            }else {
                throw new IllegalArgumentException("姐们 :uri路径不匹配 请检测路径");
            }
            
            
        }
    
        @Override
        public int delete(Uri uri, String selection, String[] selectionArgs) {
            
            int code = sURIMatcher.match(uri);
            if (code == DELETESUCESS) {
                //匹配成功 
                SQLiteDatabase db = myOpenHelper.getReadableDatabase();
                
                
                //代表影响的行数
                int delete = db.delete("info", selection, selectionArgs);
                
                if (delete>0) {
                    //发送一条消息 说明说明数据库被操作了 
                    getContext().getContentResolver().notifyChange(uri, null);
                    
                }
                
                return delete;
                
            }
            
            return 0;
        }
    
        @Override
        public int update(Uri uri, ContentValues values, String selection,
                String[] selectionArgs) {
            int code = sURIMatcher.match(uri);
            
            if (code == UPDATESUCESS) {
                //路径匹配成功
                SQLiteDatabase db = myOpenHelper.getWritableDatabase();
                
                //代表影响的行数 
                int update = db.update("info", values, selection, selectionArgs);
                if(update>0){
                    //发送一条消息 说明说明数据库被操作了 
                    getContext().getContentResolver().notifyChange(uri, null);
                    
                }
                
                
                
                return update;
                
                
            }else{
                throw new IllegalArgumentException("大爷:uri路径不匹配 请检测路径");
                
            }
                
            
        }
    
    }
     <!-- 配置内容提供者 -->
            <provider
                android:name="com.itheima.db.AccountProvider"
                android:authorities="com.itheima.provider" >
            </provider>
     </application>
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class MyOpenHelper extends SQLiteOpenHelper {
    
        public MyOpenHelper(Context context) {
            /**
             * name 数据库的名字 
             * factory 游标工厂 
             * version  版本
             */
            super(context, "Account.db", null, 1);
        }
    
        /**
         * Called when the database is created for the first time
         * 当数据库第一次 创建的时候调用 那么这个方法特别适合做 表结构的初始化 
         * 
         */
        @Override
        public void onCreate(SQLiteDatabase db) {
    
            db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),money varchar(20))");
            db.execSQL("insert into info(name,money) values(?,?)", new String[]{"张三","5000"});
            db.execSQL("insert into info(name,money) values(?,?)", new String[]{"李四","3000"});
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    
    }

    2_读取第一个应用数据库的数据

    package com.test.readdb;
    
    import android.net.Uri;
    import android.os.Bundle;
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.content.ContentValues;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.view.Menu;
    import android.view.View;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            
        }
    
        
        //点击按钮 往数据库里面插入一条数据
        public void click1(View v){
            //因为第一个应用里面的私有的数据库 已经通过内容提供者暴露出来了 所以通过内容解析者去获取数据
            Uri uri = Uri.parse("content://com.itheima.provider/insert");
            ContentValues values = new ContentValues(); //实际是map  
            //key:  代表列名  value 对应的值 
            values.put("name", "zhaoliu");
            values.put("money", 1000);
            //插入一条数据
            Uri uri2 = getContentResolver().insert(uri, values);
            
            System.out.println("uri2:"+uri2);
            
            
            
        }
        
        //点击按钮删除 赵六删掉
        public void click2(View v){
            //[1]获取内容的解析者 
            Uri uri = Uri.parse("content://com.itheima.provider/delete");
            //[2]代表影响的函数
            int delete = getContentResolver().delete(uri, "name=?", new String[]{"zhaoliu"});
            Toast.makeText(getApplicationContext(), "删除了"+delete+"行", 1).show();
            
        }
        
        //给赵六多点钱  1000元
        public void click3(View v){
            //[1] 创建uri
            Uri uri = Uri.parse("content://com.itheima.provider/update");
            //[2]获取内容的解析者
            ContentValues values = new ContentValues();
            values.put("money", "10000000");
            int update = getContentResolver().update(uri, values, "name=?",new String[]{"zhaoliu"});
            Toast.makeText(getApplicationContext(), "更新了"+update+"行", 1).show();
            
        }
        
        
        //点击按钮 查询第一个应用里面数据库的信息 
        public void click4(View v){
            // 第二种 查询方式  因为第一个应用里面的私有的数据库 已经通过内容提供者暴露出来了 所以通过内容解析者去获取数据
            Uri uri = Uri.parse("content://com.itheima.provider/query");
            //获取内容解析者获取数据
            Cursor cursor = getContentResolver().query(uri, new String[]{"name","money"}, null, null, null);
             if (cursor!=null) {
                
                while(cursor.moveToNext()){
                    String name = cursor.getString(0);
                    String money = cursor.getString(1);
                    
                    System.out.println("第二个应用:"+name+"---"+money);
                    
                }
             }
            
        }
        
        
    
    }
  • 相关阅读:
    【4N魔方阵】
    【2(2N+1)魔方阵 】
    【二分查找法(折半查找法)】
    【循环搜寻法(使用卫兵)】
    【合并排序法】
    【快速排序法一】
    【快速排序二】
    【快速排序三】
    【数据结构】之 线性表详解
    【计算机网络基础】
  • 原文地址:https://www.cnblogs.com/xufengyuan/p/6024368.html
Copyright © 2011-2022 走看看