安卓四大组件之ContentProvider

直接上代码了,说那么多理论 都没有代码实在

 

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 BankBackDoor extends ContentProvider {
    private int i=0;
    //增删改查 匹配规则
    public static final int QUERY_SUCCESS = 0;

    public static final int UPDATE_SUCCESS = 1;

    public static final int DELETE_SUCCESS = 2;

    public static final int INSERT_SUCCESS = 3;

    // UriMatcher是一个工具类,用于帮助内容提供者匹配URIs
    private static final UriMatcher MURI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);

    // 添加路径匹配规则
    static {
        // 添加一个path(匹配规则),如果匹配成功会返回code值。
        // authority:主机名(我们可以自己定义,随意写,当使用内容解析者时会使用到)
        // path:路径,一般是操作名称
        // code:响应码
        MURI_MATCHER.addURI("你自定义的标识", "insert", INSERT_SUCCESS);
        MURI_MATCHER.addURI("你自定义的标识", "delete", DELETE_SUCCESS);
        MURI_MATCHER.addURI("你自定义的标识r", "update", UPDATE_SUCCESS);
        MURI_MATCHER.addURI("你自定义的标识r", "query", QUERY_SUCCESS);
    }


    private SQLiteDatabase db;
    private static final String ACCOUNT = "account";        //你的数据库表名

    /**
     继承之后,发现有四个6个方法,给我们重写,
     其中query,insert,update,delete就是对应数据库的
     CRUD的方法,同时这个四个方法也对应这内容解析者的query,insert,update,delete,
     内容解析者,通过调用自己的CRUD,就可以操作内容提供者的CRUD,
     内容通过自己的CRUD又可以去操作自己数据库的CRUD,

     所以说:
     有一个核心: 到底修改什么数据,执行什么数据插入, 查询,删除,都不能由我们做主,因为我们只是一个跑腿。 我们不生产数据,我们只是数据的搬运工。
     */
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        int MATCH_CODE = MURI_MATCHER.match(uri);
        // 判断路径是否匹配成功
        if (MATCH_CODE == QUERY_SUCCESS) {
            // 调用SQLiteDatabase中的方法查询私有的数据库
            return db.query(ACCOUNT, projection, selection, selectionArgs, null, null, null);
        }
        return null;

    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        int MATCH_CODE = MURI_MATCHER.match(uri);
        // 判断路径是否匹配成功
        if (MATCH_CODE == INSERT_SUCCESS) {
            long insertResult = db.insert(ACCOUNT, null, values);
            // 此处的Uri可以随意写
            return Uri.parse("measurement.android.com.mya.BankBackDoor:" + insertResult);
        }
        return null;

    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int MATCH_CODE = MURI_MATCHER.match(uri);
        // 判断路径是否匹配成功
        if (MATCH_CODE == DELETE_SUCCESS) {
            return db.delete(ACCOUNT, selection, selectionArgs);
        }
        return i;

    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        int MATCH_CODE = MURI_MATCHER.match(uri);
        // 判断路径是否匹配成功
        if (MATCH_CODE == UPDATE_SUCCESS) {
            return db.update(ACCOUNT, values, selection, selectionArgs);
        }
        return i;

    }

    @Override
    public boolean onCreate() {
        MySQLiteOpenHelper mySQLiteOpenHelper = new MySQLiteOpenHelper(getContext());
        db = mySQLiteOpenHelper.getWritableDatabase();
        return true;

    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

}

一个内容提供者就封装好了

然后要在清单文件注册  四大组件套路

  <provider
            android:name=".BankBackDoor"
            android:exported="true"    //这个属性 相当于一个权限 如果不设置其他应用访问不到
            android:authorities="你自定义的 必须和内容提供者里面的那个一样"
            ><!--设置口令-->
        </provider>

接下来我们就要写数据库了(原先一直以为是文件形式)



import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import java.text.MessageFormat;

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    private SQLiteDatabase db;
    public static  final String ID="_id";
    public static  final String USERCODE="usercode";
    public static  final String USERFAMALY="userfamaly";

    public static  final String SEX="sex";
    public static  final String TABLE_NAME="account";



    public MySQLiteOpenHelper(Context context)
    {
        super(context, "account.db", null, 1);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        this.db=db;
        // 创建数据库,并初始化两条语句
//        db.execSQL("create table  account(_id integer primary key autoincrement,name varchar(20),money varchar(20))");
        db.execSQL("CREATE TABLE "+TABLE_NAME+"("+
                ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"
                +USERCODE+" TEXT NOT NULL,"
                +USERFAMALY+" TEXT NOT NULL,"
                +SEX+" TEXT"+")");


        ContentValues cv =new ContentValues();
        cv.put("usercode","usercode");
        cv.put("userfamaly","userfamaly");
//        cv.put("age",1);
        db.insert(MySQLiteOpenHelper.TABLE_NAME, null, cv);

    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  }

   
    public static final String Sql_StandardFormula_UpdateBusinessType = "update account set name=? where _id=?";
    public void UpDate(SQLiteDatabase dbs,String value)
    {
       
        String sqlstr=MessageFormat.format(Sql_StandardFormula_UpdateBusinessType, value,0);
        dbs.execSQL(sqlstr);
        dbs.close(); // 关闭数据库连接

    }


}

数据库完成  这样一个完整的内容提供者就完成了  命名为A应用(不要忘了查几条数据)

接下来我们搞B应用(二句话)

只需要在你要应用中调用我这工具类你就可以读取到A应用数据库并且可以 完成 增删改查的工作



import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;

public class UserCodeUtlis {
    // 固定写法:content://主机地址/路径
  private static   Uri uri = Uri.parse("content://你自定义的/query");

    public static String getUserCode(Context context){
        // 获取内容解析者
        ContentResolver resolver = context.getContentResolver();
        // 调用内容解析者的查询方法
        Cursor cursor = resolver.query(uri, null, null, null, null);
        String  usercode="";
        String  userfamaly="";
        // 拿出游标中的数据
        if (cursor != null && cursor.getCount() > 0) {

            while (cursor.moveToNext()) {
                 usercode = cursor.getString(1);
                 userfamaly = cursor.getString(2);
                Log.e("WZX","查询数据---数据内容(usercode:" + usercode + ",userfamaly:" + userfamaly + ")");
            }
            // 关闭游标
            cursor.close();
        }

        return usercode;
    }

    public static String getUserFamaly(Context context){
        // 获取内容解析者
        ContentResolver resolver = context.getContentResolver();
        // 调用内容解析者的查询方法
        Cursor cursor = resolver.query(uri, null, null, null, null);
        String  usercode="";
        String  userfamaly="";
        // 拿出游标中的数据
        if (cursor != null && cursor.getCount() > 0) {

            while (cursor.moveToNext()) {
                usercode = cursor.getString(1);
                userfamaly = cursor.getString(2);
                Log.e("WZX","查询数据---数据内容(usercode:" + usercode + ",userfamaly:" + userfamaly + ")");
            }
            // 关闭游标
            cursor.close();
        }

        return userfamaly;
    }
}

完成

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值