版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android数据库高频面试题(含详细真实面试答案)一、基础概念类(初级必问)1、Android中默认的数据库是什么?有什么特点?详细答案:Android内置的数据库是SQLite,它是一款轻量级、嵌入式的关系型数据库。核心特点:1、无服务器、零配置,不需要单独安装服务,直接集成在APP中,占用资源极小,适合移动端设备;2、基于文件存储,整个数据库就是手机本地的一个文件,复制、备份、迁移都很方便;3、弱类型数据库,建表时可以指定字段类型,但插入数据时不严格校验类型,比如整型字段可以存字符串;4、支持标准SQL语法,增删改查、事务、索引、视图这些常用功能都支持;5、单文件数据库,同一时间只允许一个写入操作,并发写不支持,读操作可以并发。2、SQLite支持的数据类型有哪些?和MySQL有什么区别?详细答案:SQLite核心只保留5种数据类型:NULL、INTEGER、REAL、TEXT、BLOB。平时我们写的VARCHAR、CHAR、INT等,本质都是TEXT或INTEGER的别名,不会严格校验。和MySQL最大区别:1、MySQL是强类型、服务端数据库,需要独立服务支持;SQLite弱类型、嵌入式,无服务;2、MySQL支持高并发读写,SQLite只支持并发读,不支持并发写;3、MySQL适合服务端大数据量,SQLite适合移动端本地小数据持久化;4、SQLite事务更轻量,崩溃自动回滚,适配手机异常场景。3、Android中操作SQLite的常用类有哪些?各自作用?详细答案:1、SQLiteOpenHelper:数据库辅助工具类,核心作用是创建数据库、升级数据库、管理数据库版本,是我们开发中最常用的父类,自定义数据库工具类都要继承它;2、SQLiteDatabase:数据库操作核心类,提供原生的execSQL、rawQuery、insert、update、delete、query等增删改查方法;3、Cursor:游标,用来接收数据库查询的结果集,相当于数据容器,必须手动关闭,否则会造成内存泄漏;4、ContentValues:键值对存储类,专门用于数据库插入、更新数据,替代拼接SQL语句,避免SQL注入。4、SQLiteOpenHelper的onCreate和onUpgrade触发时机?详细答案:1、onCreate():只在数据库文件不存在时触发一次。首次打开APP、数据库文件被删除后重新打开时会调用,主要用来执行建表、初始化默认数据的逻辑,不会重复执行。2、onUpgrade():数据库版本升高时触发。当我们修改自定义的数据库版本号(构造方法第四个参数),且当前手机本地数据库版本低于新版本时,会自动触发,用来执行表新增、字段新增、表修改、数据迁移等升级逻辑。补充:版本号只能升不能降,降级会直接抛异常崩溃。二、实操踩坑与原理(中级高频)5、rawQuery和execSQL区别?开发中怎么选?详细答案:1、rawQuery:专门用来查询数据,执行SELECT语句,返回Cursor结果集,不支持增删改、事务操作;2、execSQL:用来执行无返回值的SQL语句,比如建表、删表、插入、更新、删除、开启事务,不返回Cursor,执行查询会报错。开发规范:简单增删改优先用SQLiteDatabase封装好的insert/delete/update/query方法,防SQL注入;复杂多条件查询用rawQuery;建表、升级、批量操作用execSQL,禁止直接拼接字符串写SQL,必须用占位符。6、Cursor使用不当会有什么问题?怎么正确使用?详细答案:Cursor是资源型对象,持有数据库文件的引用,如果不关闭,会造成内存泄漏、数据库句柄泄露,频繁操作会导致APP卡顿、崩溃、ANR。正确使用流程:1、查询获取Cursor对象;2、循环遍历读取数据;3、必须在finally中调用cursor.close(),保证无论正常结束还是异常崩溃,都会关闭游标;4、禁止在子线程、回调中遗留Cursor,禁止全局持有Cursor。7、什么是SQL注入?如何避免?详细答案:SQL注入就是用户输入恶意字符串,拼接进SQL语句后,篡改原本的执行逻辑。比如用户输入删除语句,导致整表数据被删除、数据泄露。常见避免方式:1、绝对禁止字符串拼接SQL语句;2、使用占位符?替代参数,通过rawQuery(sql,数组参数)传参;3、优先使用系统封装的insert、update、delete方法,用ContentValues传参,系统底层自动防注入。8、SQLite事务是什么?为什么要用事务?详细答案:事务是一组数据库操作的原子性机制,核心特性:要么全部成功,要么全部失败回滚。SQLite默认是自动事务,每执行一条SQL就开启、提交一次事务,效率极低。使用事务的好处:1、大幅提升批量操作效率:批量插入、更新几百上千条数据时,手动开启事务,只需要一次IO读写,速度提升几十倍;2、保证数据一致性:比如批量导入数据,中途异常不会出现部分数据插入成功、部分失败的脏数据;3、减少数据库锁竞争,避免频繁开启关闭事务造成的性能损耗。标准写法:beginTransaction()-执行操作-setTransactionSuccessful()-endTransaction(),异常不标记成功自动回滚。三、性能优化与并发难点(中高级面试)9、SQLite为什么不支持并发写?多线程操作数据库怎么处理?详细答案:SQLite是单写多读模型,数据库文件同一时间只能有一个写入操作,写的时候会加独占锁,其他读写都会阻塞,这是文件级别的锁机制,原生不支持并发写。多线程数据库解决方案(实战常用):1、全局单例SQLiteOpenHelper,保证整个APP只有一个数据库连接,避免多实例多锁冲突;2、所有数据库操作统一放到子线程、协程、RxJava线程池,绝对禁止主线程操作数据库(会ANR);3、批量操作统一加事务,减少IO;4、使用Room框架,内部封装了线程调度、并发处理、事务管理,不用自己手写;5、禁止多线程同时写,通过队列、同步锁控制写入顺序。10、数据库卡顿、查询慢怎么优化?(最全实战优化点)详细答案:1、主线程零数据库操作,所有增删改查异步执行,避免ANR;2、高频查询字段加索引:比如用户ID、订单号、手机号等查询条件字段,索引能避免全表扫描,大幅提升查询速度;但索引不宜过多,会降低写入速度;3、批量操作必开事务,单条循环操作是移动端数据库最大性能坑点;4、分页查询,大数据量不一次性查全表,用limit、offset分页加载;5、及时关闭Cursor、数据库连接,避免资源占用导致卡顿;6、避免select*,按需查询需要的字段,减少数据传输和内存占用;7、定期清理冗余数据,避免单表数据量过大(上万条后查询明显变慢);8、升级数据库采用增量升级,避免全表重建。11、索引的原理?什么场景需要加索引,什么场景不要加?详细答案:索引本质是数据库维护的B+树结构,查询时不用遍历全表,直接通过索引定位数据,提升查询效率。需要加索引:1、经常作为where查询条件的字段;2、经常排序、分组的字段;3、表数据量大、查询频繁的字段。不需要加索引:1、数据量小的表,索引开销大于查询开销;2、频繁修改、删除、插入的字段,索引会同步更新,降低写入性能;3、重复度极高的字段(比如状态字段只有0、1),索引无效。12、数据库版本升级、数据迁移怎么做?详细答案:移动端数据库升级以增量升级为主,不破坏旧数据。1、小版本升级(新增字段、新增表):直接在onUpgrade中执行altertable新增字段、createtable建新表,不影响原有数据;2、大版本升级(字段删除、字段修改、表结构重构):采用临时表迁移方案:新建临时表→复制旧表数据到临时表→删除旧表→重命名临时表为旧表,保证数据不丢失;3、多版本跨版本升级:通过version判断区间,分段执行升级逻辑,避免跳过版本导致结构异常;4、升级过程加事务,升级失败自动回滚,避免数据库损坏。四、Room框架高频面试题(现在面试主流)13、为什么推荐用Room代替原生SQLite?优势是什么?详细答案:原生SQLite手写代码太多、容易出错、坑多,Room是Google官方封装的ORM框架,基于SQLite,解决了原生的所有痛点。核心优势:1、注解式开发,不用写大量重复的建表、CURD模板代码;2、编译期校验SQL语句,写错直接编译报错,避免运行时崩溃;3、自带线程管理,强制数据库操作异步,避免主线程ANR;4、支持LiveData、Flow观察数据变化,自动更新UI,不用自己写数据刷新逻辑;5、内置事务、并发处理、缓存机制,性能更稳定;6、数据库升级、迁移API完善,比原生手写更安全。14、Room的核心组件有哪些?作用分别是什么?详细答案:1、@Entity实体类:对应数据库中的一张表,注解配置表名、字段、主键、索引;2、@Dao数据访问接口:定义所有增删改查方法,不用实现类,Room编译时自动生成代码;3、@Database数据库抽象类:继承RoomDatabase,持有所有Dao,是数据库入口,配置版本、表信息、迁移规则。15、Room可以在主线程操作数据库吗?详细答案:默认不允许,Room主线程操作会直接抛异常,目的是防止主线程耗时IO造成ANR。可以通过allowMainThreadQueries()强制开启,但开发中绝对禁止使用,属于不规范写法。所有Room操作必须通过协程、Flow、RxJava异步执行。16、Room数据刷新原理?LiveData/Flow观察者机制详细答案:当Dao方法返回LiveData或Flow时,Room会自动监听对应数据表的变化,只要表数据发生增删改,就会自动触发回调,返回最新数据。优势是不用手动查询刷新,适合列表页、个人资料页等需要实时同步本地数据的场景,生命周期感知,页面销毁自动解除订阅,无内存泄漏。五、高频面试错题&兜底问答17、数据库文件存储路径在哪里?详细答案:默认私有目录:/data/data/应用包名/databases/目录下。属于应用私有数据,其他APP无法访问,用户卸载APP会自动删除数据库文件,无法直接通过文件管理器查看,需要AS的AppInspection工具查看。18、什么情况下会出现数据库损坏?怎么处理?详细答案:常见原因:多实例操作数据库、并发写冲突、手机断电崩溃、文件被篡改、升级异常。处理方案:1、全局单例数据库辅助类,杜绝多实例;2、所有升级、批量操作加事务兜底;3、捕获数据库异常,异常时删除损坏文件,重建数据库,避免APP闪退;4、重要数据做本地备份。19、SharedPreferences和SQLite数据库怎么选型?详细答案:SP:适合存储少量简单键值对数据,比如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 卫生事业单位招聘考试(护理学)历年参考题库含答案详解(5套)
- 新北师大五年级下学期长方体体积的练习
- 文书档案的归档整.理方法模板
- 2026年四川省公务员录用考试行政职业能力测验终极押题密卷四-参考答案及解析
- 2026年特种设备安全员A证考试练习题及答案
- 2026年烟草招聘考试题及答案
- 2026年中级育婴师试题与参考答案试卷+答案
- XX省专业技术继续教育公需科目考试及答案
- 国家开放大学《城市管理学》形考任务作业参考答案
- 联通实习试题及答案
- 2026年高级考评员职业技能等级认定考试题库含答案
- 【中小学】【学法指导】自习课主题班会-你真的会上自习课?【课件】
- 2026新教材数学 小学数学人教版三年级上2.4混合运算解决问题 教学课件
- 2025年湖南能源集团招聘考试笔试试题(含答案)
- 冀少版八年级上册生物第五单元第一章第三节《芽的发育》教学课件(新教材)
- 2026年云南省政府采购评审专家考试卷附答案
- 合租家具损坏赔偿协议范本二篇
- 2026-2030中国高纯碲化锌市场深度调查与前景预测分析研究报告
- 湖南省2026届高三九校联盟第一次联考化学试卷(含答案解析)
- 产后奶涨的治疗与指导
- 部编人教版语文九年级上册文言文课下注释
评论
0/150
提交评论