Android SQLite 面试题及详细答案(实战版)_第1页
Android SQLite 面试题及详细答案(实战版)_第2页
Android SQLite 面试题及详细答案(实战版)_第3页
Android SQLite 面试题及详细答案(实战版)_第4页
Android SQLite 面试题及详细答案(实战版)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AndroidSQLite面试题及详细答案(实战版)一、基础认知类(入门高频)1、SQLite是什么?有什么特点?为什么移动端首选SQLite?参考答案:SQLite是一款轻量级、嵌入式、无服务端的关系型数据库,专门适用于本地小型数据存储。核心特点:无服务端:不需要单独部署数据库服务,整个数据库就是一个独立文件,直接读写本地文件轻量小巧:占用资源极低,内存、存储消耗小,适配手机低配置设备支持事务:完整支持ACID事务,保证数据安全,支持回滚、提交操作跨平台:适配Android、iOS、Windows、Mac等所有主流平台弱类型数据库:字段存储数据类型灵活,建表指定类型后,也可存入其他类型数据移动端首选原因:手机本地数据量小、无需高并发集群,SQLite无需配置、开箱即用、读写速度快,完美适配APP本地缓存、用户数据、离线数据存储场景。2、Android中操作SQLite的核心类有哪些?各自作用是什么?参考答案:Android原生操作SQLite主要依赖四个核心类:SQLiteOpenHelper:数据库辅助工具类,核心作用是管理数据库的创建、升级、降级,封装了数据库打开、关闭逻辑,是我们自定义数据库工具类的父类SQLiteDatabase:数据库操作核心类,提供原生的增、删、改、查、事务、执行SQL语句等所有数据库操作方法Cursor:游标类,用于接收数据库查询的结果集,遍历读取查询到的数据,使用后必须关闭,避免内存泄漏ContentValues:数据存储容器,以键值对形式存储字段名和对应数据,专门用于插入、更新数据库数据3、SQLiteOpenHelper的onCreate和onUpgrade方法什么时候触发?参考答案:onCreate():仅在数据库文件不存在时触发,全局只执行一次。主要用于初始化数据库、创建数据表、初始化默认数据。onUpgrade():当APP版本升级,新的数据库版本号>本地旧版本号时触发。主要用于数据表新增字段、新增表、修改表结构、数据迁移等升级操作。补充:还有onDowngrade方法,新数据库版本号小于本地版本号时触发,默认会报错,需要重写方法处理降级逻辑。4、SQLite支持的数据类型有哪些?和MySQL有什么区别?参考答案:SQLite核心数据类型只有5种:NULL、INTEGER、REAL、TEXT、BLOB所有字段类型最终都会映射为这5种类型,没有MySQL复杂的varchar、int、double等细分类型。核心区别:SQLite是弱类型:建表字段可指定类型,但插入任意类型数据都能存储,不会报错;MySQL是强类型,类型不匹配直接报错SQLite无长度限制:TEXT、INTEGER无需指定长度;MySQL必须指定字段长度SQLite无服务端,单文件存储;MySQL是服务端数据库,支持高并发、多连接二、数据库操作与实战问题(面试重点)5、Android中SQLite增删改查有两种方式,分别是什么?有什么区别?参考答案:两种操作方式:原生API封装方法、手写原生SQL语句执行封装API:insert()、delete()、update()、query()SQL语句执行:execSQL()、rawQuery()区别:execSQL():可执行增删改、建表、修改表结构等无返回值的SQL语句,不能用于查询rawQuery():专门执行查询SQL,返回Cursor结果集,仅用于查数据系统封装API:无需手写SQL语句,避免SQL注入,代码更安全、简洁,适合常规操作手写SQL:灵活度更高,适合复杂联表查询、复杂条件筛选、特殊表结构操作6、什么是SQL注入?AndroidSQLite如何避免SQL注入?参考答案:SQL注入是恶意用户通过输入特殊SQL关键字、符号,篡改原有SQL语句,实现查询、删除、篡改数据的恶意操作,会导致数据泄露、数据丢失。常见危险写法:直接拼接用户输入的字符串拼接SQL语句。规避方案:优先使用系统封装的增删改查API(insert/delete/update/query),自动参数转义,从根源避免注入手写SQL时,使用占位符?传递参数,不直接拼接字符串禁止将用户输入的原始内容直接拼接进SQL语句7、Cursor使用有哪些注意事项?如何避免Cursor内存泄漏?参考答案:Cursor是数据库查询结果集,属于资源型对象,系统不会自动回收,使用不当极易造成内存泄漏。注意事项:查询完成后必须遍历完毕或关闭Cursor,调用cursor.close()使用Cursor时,先判断cursor!=null&&cursor.moveToFirst(),避免空指针禁止在子线程持有Cursor不关闭,禁止静态引用Cursor对象优先使用try-finally包裹Cursor操作,保证无论正常/异常结束,都会执行关闭逻辑补充:Android3.0之后可使用CursorLoader,系统自动管理Cursor生命周期,无需手动关闭。8、SQLite事务的作用是什么?Android中如何使用事务?参考答案:事务核心作用:保证批量操作原子性,批量增删改数据时,要么全部成功,要么全部失败回滚,避免部分数据操作成功、部分失败导致的数据错乱。除此之外,事务能大幅提升批量数据操作效率:默认情况下,每一次数据库操作都会开启、提交一次事务,批量操作频繁IO;手动开启事务后,仅最后一次提交,极大减少IO次数。Android事务标准使用流程:开启事务:beginTransaction()执行批量数据库操作操作无异常,设置事务成功:setTransactionSuccessful()结束事务:endTransaction()注意:如果不调用setTransactionSuccessful(),endTransaction时会自动回滚所有操作。三、数据库升级与适配(进阶高频)9、SQLite数据库版本升级有哪些场景?常见的升级方案?参考答案:常见升级场景:新增数据表、原有表新增字段、删除字段、修改字段类型、表名修改、数据迁移。两种主流升级方案:增量升级(推荐)

根据新旧版本号差值,针对性执行升级逻辑,比如1->2新增字段、2->3新增表,按需执行SQL,数据零丢失,性能最优,生产环境首选。重建表升级(兜底方案)

先创建临时表备份原数据,删除旧表,创建新表,将临时表数据迁移回新表,删除临时表。适用于复杂表结构修改(删除字段、修改字段类型),兼容性最强。10、数据库升级时如何保证用户数据不丢失?有哪些坑?参考答案:数据不丢失核心原则:禁止直接DROP数据表,优先使用ALTER语句修改表结构,复杂修改采用临时表迁移数据。常见坑点:直接在onUpgrade中删除重建表,导致用户本地数据全部清空多版本跨级升级未适配,比如用户从版本1直接升级到版本3,遗漏中间版本升级逻辑新增字段未设置默认值,导致旧数据查询时报错升级逻辑未做异常捕获,升级失败导致数据库损坏11、SQLite能不能删除表中某个字段?为什么?如何解决?参考答案:原生SQLite不支持直接删除、修改字段,仅支持新增字段、修改表名。原因:SQLite早期设计的语法限制,没有ALTERTABLEDROPCOLUMN语法。解决方案:采用临时表迁移法创建临时数据表,复制原表需要保留的字段数据删除原数据表创建全新的目标数据表(不含被删除的字段)将临时表数据迁移到新表,删除临时表四、性能优化与坑点总结(进阶面试核心)12、SQLite数据库查询慢、卡顿,有哪些优化方案?参考答案:从索引、查询逻辑、线程、IO四个维度优化:合理建立索引:经常作为查询条件、排序、分组的字段建立索引(如用户ID、手机号);避免过度索引,索引会降低增删改速度、增加数据库体积精准查询字段:禁止select*,只查询需要的字段,减少数据读取量分页查询:数据量大时使用limit分页,避免一次性查询全部数据子线程操作数据库:所有数据库读写操作禁止在主线程执行,避免ANR、界面卡顿批量操作使用事务:批量插入、更新必须开启事务,大幅提升效率及时关闭资源:Cursor、数据库连接用完及时关闭,避免资源占用导致性能下降13、SQLite索引的优缺点?什么场景需要建索引?什么场景不需要?参考答案:优点:大幅提升查询、筛选、排序、分组的速度缺点:索引会占用存储空间,每次增删改数据时需要同步更新索引,降低写入性能适合建索引:高频查询、作为where条件的字段经常用于orderby、groupby的字段表数据量大、查询频繁的字段不适合建索引:数据量小的表,索引优化效果微乎其微频繁增删改的字段,会加剧性能消耗重复度极高的字段(如性别、状态),索引无意义14、Android中SQLite多线程操作会出现什么问题?如何解决?参考答案:多线程并发读写数据库,会触发databaselocked数据库锁异常、数据错乱、程序崩溃。原因:SQLite是文件级锁,同一时间只允许一个线程写入,多个线程可同时读,读写互斥。解决方案:单例数据库帮助类:全局唯一SQLiteOpenHelper实例,避免多个实例抢占数据库文件加锁处理:对所有数据库读写方法加synchronized锁,保证串行执行统一线程调度:使用单线程线程池,所有数据库操作排队执行,杜绝并发冲突15、SQLite数据库损坏的原因及修复方案?参考答案:常见损坏原因:APP异常崩溃、手机断电,导致数据库文件写入不完整多线程并发读写、文件被占用冲突手动修改数据库文件、文件权限异常、存储损坏修复方案:被动修复:捕获数据库异常,损坏后删除旧数据库文件,重新创建新库(会丢失旧数据)主动预防:重要数据定期备份,事务包裹批量操作,保证数据完整性使用SQLite自带的vacuum、reindex语句修复碎片、优化数据库文件五、拓展面试题(中高级必备)16、SQLite支持并发吗?读写机制是什么?参考答案:SQLite支持读并发,不支持写并发,遵循“读写互斥、读读共享、写写互斥”机制。多个线程可以同时读取数据库,无冲突一旦有一个线程写入数据,其他所有读写线程都会被阻塞写入操作优先级高于读取操作因此Android开发中,必须控制数据库写入操作串行执行,避免锁异常。17、说说你对SQLite日志模式(WAL)的理解?开启WAL有什么好处?参考答案:WAL即预写日志模式,是SQLite的一种日志优化模式,Android默认关闭,可手动开启。核心原理:数据写入时,先写入WAL日志文件,再异步同步到主数据库文件,读取数据优先从日志读取最新数据。优势:大幅提升读写并发能力,读和写可以同时进行,不再完全互斥减少磁盘IO次数,提升批量读写性能异常崩溃后可通过日志恢复数据,提升数据安全性开启方式:getWritableDatabase().enableWriteAheadLogging(true);18、原生SQLite和Room对比,各自优缺点?参考答案:原生SQLite优点:无需依赖第

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论