Android中使用ContentProvider读取数据的介绍

1.添加布局,相信大家已经习以为常

    主界面添加一个ListView控件,在创建一个xml文件添加相应的布局即可.

注意:LIstView控件中的android:layout_height最好指定为match_parent,不要指定为wrap_content

因为:前者它可以根据屏幕的高和LIstView的高算出一个屏幕可以展示出多少的条目,后者算不出来了,是对ListView的优化

2.要使用ContentProvider暴露数据库,需要创建一个类继承ContentProviter(抽象类),重写 onCreate(),query,getType,insert,delete,update方法;

3.由于ContentProvider是四大组件之一,所以需要在清单文件中配置,如下:

<provider
/*android:authorities:代表了访问本provider的路径(也就是包名)
  android:name:代表继承于ContentProvider类的全路径名称(也就是包名+类名)
*/
   android:authorities="cy.cn.contentprovider"
   android:name="cy.cn.contentprovider.MyProvider">
</provider>

 4.在创建的类定义路径匹配器

 public static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

 5.定义静态代码块,添加匹配规则(只执行一次)

static {
//第一个是android:authorities,第二个是path,可以找到具体的方法,第三个是int类型的匹配码
        uriMatcher.addURI("cy.cn.contentprovider", "path", 1)
}

 6.链接数据库,创建数据库,写一个类继承SqlLiteOpenHelper,重写方法

public class MySqlLiteOpenHelper extends SQLiteOpenHelper {
    private static final String TAG="MySqlLiteOpenHelper";
    
    public MySqlLiteOpenHelper(Context context) {
        super(context, "Person.db", null, 1);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table person(_id integer primary key autoincrement," +
                "name varchar(20),number varchar(20))");
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i(TAG,"版本更新了~~~~~~");
    }
}

 7.MyProvider一加载,就走onCreate()方法,就链接数据库

@Override
public boolean onCreate() {
   MySqlLiteOpenHelper sql = new MySqlLiteOpenHelper(getContext());
   return false;
}

 8.暴露你想暴露的方法(增删改查方法),以暴露query方法为例

@Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        int code = uriMatcher.match(uri);
        if (code==QUERY){
        //说明路径匹配成功,把query方法实现 对数据库进行查询操作,想操作数据库必须或得sqlitedatabase对象
            SQLiteDatabase db = sql.getWritableDatabase();
            /**projection:要查寻得列
             * selection:根据什么条件查询列
             * selectionArgs:查询的参数
             */            
Cursor cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
            //cursor不能关闭
            return cursor;
        }else {
            throw new IllegalArgumentException("你的路径不匹配,请检查路经");
        }
    }

 9.在使用ContentProvider暴露数据之前,首先要保证本地数据库里有数据

public class PersonDao {
    private final MySqlLiteOpenHelper helper;
    //在在构造方法里完成helper的初始化
    public PersonDao(Context context){
        helper = new MySqlLiteOpenHelper(context);
    }
    //添加一条数据
    public long add(String name,String number){
        SQLiteDatabase db = helper.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put("name",name);
        values.put("number",number);
        long id = db.insert("person", null, values);
        db.close();
        return id;
    }
}

 

转载于:https://www.cnblogs.com/cy666/p/7505875.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值