在《第一行代码中》数据存储和ContentProvider内容提供器是相邻的两章。花了一天两夜,终于把这两章的知识和理解理顺了。而数据存储和持久化这一章内容较繁杂和难的地方就是SQLite的相关概念和用法,特别是用法,SQLite的语句对我这种没有基础的半吊子选手真像眼前蒙了雾。
理顺之后才理解了 为什么把SQLite的知识放在前面讲,是因为后面自定义内容提供器的具体实现方法其实就是通过SQLiteDatabase的各种方法来复写原本的ContentProvider抽象类的各种方法,方法名基本都是一样的。
不同的是在自定义内容提供器的过程中,冒出来一个uriMatcher的概念,也是比较难懂。我原本以为这么些个方法接收Uri进去不就好了吗,已经可以做出相应的操作,为什么要他妹的matcher~.搞了半天才明白,方法中怎么提取Uri的信息来操作还是要凭开发者自己一行行代码来实现,如果不用uriMatcher来匹配,代码量会变得更加庞大,这是我通过学习自己的理解。
对这两部分知识做个回顾吧~
数据存储和持久化技术
1,持久化技术提供了使数据在瞬时状态和持久状态相互转换的方法,讲了三种方式;
2,文件存储;
2.1-openFileOutput()方法存储文件,
2.2-openFileInput()方法读取文件,
基本就属于java的io流范畴,balabala,有个方法值得注意一下:TextUtils.isEmpty(String text),当传入的为null或者空字符串时,都返回true;
3,SharedPreferences存储,键值对的方式进行存储,存储格式为xml;
3.1-三种方式获取SharedPreferences对象
getSharedPreferences(name,MODE)
getPreferences(MODE)
PreferenceManager.getDefaultSharedPreferences(Context);
使用edit()方法来获得editor对象
添加数据并提交~
4,SQLite数据库:一款轻量级关系型数据库
定义类继承SQLiteOpenHelper对数据库进行创建或升级;adb shell的使用;
升级数据库(drop语句,删了再建:粗糙方式;;
在onupgrade方法中使用switch语句,对应不同版本);
增删改查;
insert(table,null,ContentValues)\\ContentValues封装具体数据,添加进数据库
delete(table,String,String【】)
update(table,values,String,String【】)
查,查是最麻烦的。query(七个参数·)
内容提供器
内容提供器是安卓中不同程序实现数据共享的一种机制。
1,
要想访问数据,必须借助ContentResolver,getContentResolver方法得到对象。ContentResolver不接受表名,只接收uri。
2,创建自己的内容提供器(我自己的误区:ContentResolve并非万事大吉,它本身并不具有共享数据操作的各种方法,只有你的应用程序创建了内容提供器才行)
需要复写的6个方法:
boolean onCreate();
Uri insert(Uri,ContentValues);
int delete(Uri ,String, String[]);
i nt update(Uri,ContentValues,String,String[]);
Cursor query(6个参数);
String getType(Uri);
使用Uri匹配器UriMatcher类,
构造:UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH)
判断:uriMatcher.addURI(权限,路径,自定义常量)
匹配:uriMatcher.match(uri)
声明:记得Manifest里面要加provider的权限声明
android:name
android:authorities
android:exported
想了一晚上的错误,关于数据库表中“”主键“”的概念,总之,前面建表语句中要和后面相应的方法参数相一致,
我的错误就是前面写的是……+“_id integer primary key autoincrement”,后面方法中却成了“id = ?”