天天看點

實作内容提供者步驟

  [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) {

    }

}      
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);
                
            }
         }
        
    }
    
    

}