Android学习之自定义ContentProvider类的使用.

前天学习ContentProvider时做了一个查询手机通讯录的Demo:http://blog.csdn.net/u010979495/article/details/40394977当时还不怎么理解,所以昨天和今天开始研究自定义ContentProvider类,通过自定义ContentProvider对SQLite的操作来加深理解。

对ContentProvider练习中的一些总结:

1.创建MyProvider类(继承自ContentProvider类),然后重写里面的各种方法(例如onCreate(),onInsert()...),该类的作用是接收ContentResolver传来的Uri,进行判断,对不同的Uri做不同的处理。

2.需要在Manifest里面配置对应的Provider节点(采用authorities进行唯一标识)。然后在启动该程序时,会自动调用Provider的onCreate()方法。

3.自定义一个数据库管理类MyDBManager(继承自SQLiteOpenHelper),该类的作用是创建数据库(MyProvider_dlc.db)以及更新。

4.在Provider的onCreate()方法里面调用MyDBManager里面的onCreate()注意:在调getReadableDatabase或getWritableDatabase时,会判断指定的数据库是否存在,不存在则调SQLiteDatabase.create创建, onCreate只在数据库第一次创建时才执行

个人在这遇到的问题:一直提示表格错误,原因是第一次创建了一个错误的表格,而没有删除对应的数据库,导致之后就误以为数据库已经存在对应的表格,所以不会继续创建,导致了报错。

解决方法:在应用程序里面将改程序的数据删除,重新部署。这样下一次就会生成一个正确的数据库了。

5.创建一个常量管理类MyContentProviderMetaData(里面管理各种常量,如自定义ContentProvider的URI,数据库的名字,表名等等)

6.创建一个测试类MyContentProviderActivity(通过ContentResolver对象给自定义的ContentProvider发送Uri和操作请求(如删除,查询等),之后ContentProvider对象在进行判断,对不同的Uri和操作做不同的处理)

总结ContentProvider与ContentResolver:

1.外界程序通过ContentResolver访问ContentProvider提供的数据

2.ContentResolver和ContentProvider的关系大概是类似于观察者模式里面的,ContentProvider是watched,ContentResolver是watcher。。。ContentResolver里面提供有notifyChange()接口,当数据改变时发通知其他的ContentObserver(非原创)

Uri的格式:content:://+域名(authorities)+/路径(比如需要操作testTable表,则路径为/testTable)

总结下在这过程中遇到的错误以及解决方法:

1.在使用构造SQL查询语句的辅助类QLiteQueryBuilder qb时,忘记创建对象出来(犯了这个错,log了一大堆东西才找出来)

2.以前有一个老版本的数据库,里面的表创建错了。所以改了代码以后不会重新创建(OnCreate()只会创建一次,如果存在数据库就不会在创建了)
解决方法:把该程序的数据清空(可以直接在手机上操作,也可以通过代码)

3.创建SQL语句时每个变量之间忘了加空格(sql基础)。。。

学习总结:

1.实践检验真知。。。刚开始对这一块十分模糊,慢慢的通过敲代码编程练习,解决各种问题,最终理解就会越来越深刻

2.养成良好的编程习惯很重要。。。代码多了后要在管理代码上做点功夫,比如,常用常量最好放在类里面做静态数据,这样更改起来方便

3.继续努力吧,现在懂得还是太少了!

附录(关键代码):

1.数据库管理类:MyDBManager

/**创建一个数据库帮助类,用来操作数据库*/
public class MyDBManager extends SQLiteOpenHelper{
	private static final String TAG="MyDBManager";
	//重写构造函数
	public MyDBManager(Context context) {
		//context,数据库名,CursorFactory,版本号
		super(context, MyContentProviderMetaData.DATABASE_NAME,null,
MyContentProviderMetaData.DATABASE_VERSION);
	}
	//第一次运行时执行,只要有数据库就不会在运行
	@Override
	public void onCreate(SQLiteDatabase db) {
		//静态内部类也是直接可以访问静态成员的
		//创建表的sql语句
		//注意里面的空格,语法不能出错
		//拼接sql语句的时候引用变量的两端要加上空格
		String sql="CREATE TABLE "
				+TestTableMetaData.TABLE_NAME
				+" ("
				+MyContentProviderMetaData.TestTableMetaData._ID+" INTEGER PRIMARY KEY, "
				+TestTableMetaData.PERSON_NAME+" TEXT, "
				+TestTableMetaData.PERSON_NUMBER+" TEXT"
				+");";
		Log.i(TAG,"创建表:"+db.getPath());
		db.execSQL(sql);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		Log.i(TAG,"更新数据库,从"+oldVersion+"到"
				+newVersion+",以前的数据会被销毁");
		//销毁的sql语句
		String sql="DROP TABLE IF EXISTS"+TestTableMetaData.TABLE_NAME;
		//执行
		db.execSQL(sql);
		//重新创建db
		onCreate(db);
	}
}
2.自定义ContentProvider类MyProvider(仿照Android程序设计基础书本上的代码)

/**创建一个MyProvider类,该类继承ContentProvider,实现其抽象方法来操作数据库,
 * 该类引用MyDBManager类来获得数据库实例*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值