内容提供者与 SQlite 使用注意点笔记

ContentProvider 是 Android 四大组件之一,方便我们跨应用(跨应用本身就是跨进程)、跨进程访问与操作数据,之前学过但是早就忘了,故温习一遍,而 SQlite 是 Android 提供的轻量级数据库,自定义 ContentProvider 时也自己提供了数据,所以捎带手回顾了一下 SQlite。

1我们通过 ContentResolver 访问数据,比如增删改查,而这些操作其实是 ContentResolver 底层去调用 ContentProvider 的对应的操作。

2.通过调用 getContentResolver() 去获取 ContentResolver,然后进行操作。

3.做好把对 ContentResolver 的操作再放后台线程,查询时其实还可以使用 CursorLoader 自动异步进行。

4.读写数据前注意权限问题。

5.要防止 SQL 注入。

6.通过继承 ContentProvider 来实现自己的 ContentProvider,并实现onCreate()、query()、update()、insert()、delete()、getType(),除了 onCreate() 运行在主线程,所以不要在 onCreate() 做耗时操作,其他五个方法都运行在都运行在 Binder 线程。

运行截图.png

7.ContentProvider 的 query() 方法只有在出错是才返回 null,否则就算没有数据也会返回一个长度为 0 的 Cursor。

8.ContentProvider 的 insert() 方法一般在成功后返回带有 Id 的 URI,而插入失败返回 null。

9.update()、delete() 返回成功操作的条数。

10.自己在定义 ContentProvider 后,需要在清单文件中声明,声明是一定要声明 android:authorities,这时 ContentProvider 的唯一标识,也是别人访问你的 ContentProvider 使用的值。

11.如果想要声明 ContentProvider 的使用权限要在自己的清单文件中自定义好权限,然后提供给别人使用。对方使用的使用就直接声明好对应权限即可,而自定义权限中的 android:protectionLevel 表示权限级别,这里是普通权限。

别的 App 需要声明 <uses-permission android:name="com.google.jaaaule.gzw"/>

声明权限.png

12.别的 App 中想要使用自己自定义 ContentProvider 还有一点需要注意要在 <provider> 下声明 android:exported="true",这样其他 App 才能正常访问这个ContentProvider。

13.侦听 ContentProvider 数据变化可以使用自定义的 ContentObserver 实现 onChange() 即可,然后在 ContentResolver 中注册侦听器即可,注册时第二参数需要传递一个 boolean 值,该值表示是否可以侦听到子级数据的变化,记得反注册哟。

14.ContentResolver 的 applyBatch() 可以同时向多个表中插入数据,而 insert() 以及 bulkInsert() 只是针对单一 URI 插入,只是 bulkInsert() 向一个表中同时插入多条。

15.SQLiteDatabase 是用于展示管理 SQLite 数据库中的方法,因为 SQLite 本身是用 C 写的,SQLiteDatabase 是 SQLite 在 Java 层分一层封装。

16.SQLiteOpenHelper 是我们对 SQLiteDatabase 进行管理操作的类,SQLiteOpenHelper 本身是抽象类,而我们需要实现自己的 SQLiteOpenHelper,在里面创建或者升级数据库,而我们通过getWritable/ReadaleDatabase() 获取对应的 SQLiteDatabase。

17.我们无需手动调用 SQLiteOpenHelper 的 onCreate(),getWritable/ReadaleDatabase() 会隐式帮我调用 onCreate()。

18.使用 SQLiteDatabase 插入数据时,我们可以使用insert() 或者 insertWithOnConflict(),后者多了一个冲突解决器,例如下面这行代码,冲突解决器为 CONFLICT_REPLACE,这个解决器的效果是如果数据不存在时插入,如果存在则更新数据,与 SQLiteDatabase 的 replace() 效果相同,因为源码中就是调用 insertWithOnConflict(xxx, xxx, xxx, SQLiteDatabase.CONFLICT_REPLACE)。

db.insertWithOnConflict(TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_REPLACE);
SQLiteDatabase 中的 replace() 方法

19.升级数据库时记得不仅要在 onUpgrade() 中写对应的 SQL 执行语句,还需要在 onCreate() 中写入新的字段,因为有些用户是从新版本开始安装的 App。

20.并发访问时,多个线程中同时使用同一个 SQLiteOpenHelper 实例其实是顺序访问,问并发访问需要创建多个 SQLiteOpenHelper 实例。

21.还有一点需要注意,当我们查询时候,应该小心调用 cursor.moveToFirst() 因为正常情况下,最好不要不同调用 cursor.moveToNext() 这样会导致光标连续移动,从而错过第一个位置的数据,所以 cursor.moveToFirst() 配合 do...while 更合适,单纯 cursor.moveToNext() 更适合 while。

这些只是个人学习与使用中一些知识点总结,如需 Demo 请留言。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容