资讯专栏INFORMATION COLUMN

DbUtils应用在Android6.0中为什么会崩溃

ixlei / 936人阅读

摘要:找到了问题所在,那么解决起来就相对简单了,只要选择第一种构造方法,指定上下文,其他属性根据系统自动适配就可以了。

序言

最近研究了一个手机开门的功能,在Android4.X/5.X测试都通过了,后来在Android6.0上测试崩溃了,适配出现了问题,到底是什么原因呢?

分析

Logcat里面的报错信息是这样的
java.lang.NullPointerException: Attempt to invoke virtual method "int android.database.sqlite.SQLiteDatabase.getVersion()" on a null object reference
初始化数据库出现了问题,获取不到数据库的版本号,刚开始以为是开门的jar包不兼容,导致创建数据库失败,但是经过查找资料和反复调试,发现问题出在DbUtils上,到底是什么问题呢?

首先了解一下DbUtils的框架结构,总体来看分为7个部分:
1、create instance(创建实例)
2、operations(操作部分)
3、config(配置)
4、private operations with out transaction(无业务的操作)
5、tools(工具)
6、exec sql(sql执行)
7、temp cache(临时缓存)

其中在创建数据库的时候提供了5种构造方法

(1)通过传入上下文创建DB,这种情况下使用的是系统默认的配置

dbName = xUtils.db, dbVersion = 1;    
  public static DbUtils create(Context context) {
        DaoConfig config = new DaoConfig(context);
        return getInstance(config);
    }

(2)通过传入上下文和dbName,根据用户指定的dbName生成数据库

public static DbUtils create(Context context, String dbName) {
    DaoConfig config = new DaoConfig(context);
    config.setDbName(dbName);
    return getInstance(config);
}

(3) 通过传入上下文 、dbDir、dbName,根据用户指定的dbName在dbDir位置生成数据库
public static DbUtils create(Context context, String dbDir, String dbName) {

    DaoConfig config = new DaoConfig(context);
    config.setDbDir(dbDir);
    config.setDbName(dbName);
    return getInstance(config);
}

(4) 通过传入上下文 、dbName,dbVersion、dbUpgradeListener根据用户指定的dbName生成dbVersion版 的数据库
public static DbUtils create(Context context, String dbName, int dbVersion, DbUpgradeListener dbUpgradeListener) {

    DaoConfig config = new DaoConfig(context);
    config.setDbName(dbName);
    config.setDbVersion(dbVersion);
    config.setDbUpgradeListener(dbUpgradeListener);
    return getInstance(config);
}

(5) 通过传入上下文 、dbName,dbVersion、dbUpgradeListener,根据用户指定的dbName生成dbVersion的数据库 ,指定监听器
public static DbUtils create(Context context, String dbDir, String dbName, int dbVersion, DbUpgradeListener dbUpgradeListener) {

    DaoConfig config = new DaoConfig(context);
    config.setDbDir(dbDir);
    config.setDbName(dbName);
    config.setDbVersion(dbVersion);
    config.setDbUpgradeListener(dbUpgradeListener);
    return getInstance(config);
}
 

5种方法怎么选择呢?我们看下用于配置数据库的5个属性

private Context context; //上下文
private String dbDir;//数据库存储路径
private String dbName = “xUtils.db”; // 数据库名称 
private int dbVersion = 1; //版本号
private DbUpgradeListener dbUpgradeListener;//监听器

为了方便我们后期查找,一般会选择第三种构造方法,指定上下文,指定数据库的名称,指定数据库存储路径,大多数情况这是没有问题的,但是Android6.0和以前的版本相比,对存储路径做了修改,所以根据Android4.X/5.X给出的指定存储路径不适用于6.0版本,创建数据库失败,就出现的文章开头的错误,获取数据库版本号失败。

找到了问题所在,那么解决起来就相对简单了,只要选择第一种构造方法,指定上下文,其他属性根据系统自动适配就可以了。

其实还有一种相对简单的解决方法,作为手机端,大部分数据都是从服务器获取的,在数据量不是很大的情况下,并不需要去生成数据库,可以在获取数据后,只做一个简单的缓存,保存到集合中,如List,map等,大多数页面现在都是这样实现的。

其实出现这种情况的不光是Android6.0,由于市场上Android手机品牌型号较多,不同品牌,不同型号的手机,为了实现某些个性化功能,或者出于优化内存等方面的考虑,经常会篡改手机的存储路径,之前在做其他功能,比如获取手机本地的视频文件,图片文件等,都遇到了这样的适配问题,下次有时间再分享。

总结

遇到不熟悉的错误信息,可以把错误信息复制出来,通过百度大体了解一下,出现这种错误都有些什么原因,把握好大方向,然后从熟悉的内容入手,分析可能出现错误代码的内部机制,找出可能会产生相关错误的点,逐步排除改进,最后解决问题。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/12702.html

相关文章

  • Android版本介绍 - 收藏集 - 掘金

    摘要:前言整体架构掘金概述该篇文章主要讲解的整体框架和工作流程,不会涉及到具体的实现。产品汪了解安卓的历史版本吗产品掘金最近在看的设计规范,顺便也熟悉下的版本历史。 关于 Android 7.0 适配中 FileProvider 部分的总结 - 掘金由于 Android 7.0 或更高版本的系统在国内手机市场上的占比不是很高,很多 Android 开发人员并没有做 7.0 适配工作,同时测试...

    teren 评论0 收藏0
  • Android6.0权限适配及兼容库的实现

    摘要:普通权限不会泄露用户隐私,同时也不会导致手机安全问题。最后附上及第三方库链接权限兼容库作者看书的小蜗牛原文链接权限适配及兼容库的实现参考文档权限适配之卡写入 从6.0 MarshMallow开始,Android支持动态权限管理,即有些权限需要在使用到的时候动态申请,根据用户的选择需要有不同的处理,具体表现可以看下图: showImg(https://segmentfault.com/i...

    My_Oh_My 评论0 收藏0
  • 萤石云视频EZOpenSDK集成(实现播放,视频放大功能)

    摘要:推荐阅读封装之路学习资源分享合集去年在项目中用到了萤石云视频,它的项目源码很多,找到有用的代码很费时间,所以今天写成文章把集成步骤,预览功能,双击放大,手势放大功能以及注意事项等分享给大家。 推荐阅读:SurfaceView+MediaPlayer封装之路 Android学习资源分享合集(1) 去年在项目中用到了萤石云视频,它的项目源码很多,找到有用的代码很费时间,所以今天写成文章把集...

    BingqiChen 评论0 收藏0
  • 萤石云视频EZOpenSDK集成(实现播放,视频放大功能)

    摘要:推荐阅读封装之路学习资源分享合集去年在项目中用到了萤石云视频,它的项目源码很多,找到有用的代码很费时间,所以今天写成文章把集成步骤,预览功能,双击放大,手势放大功能以及注意事项等分享给大家。 推荐阅读:SurfaceView+MediaPlayer封装之路 Android学习资源分享合集(1) 去年在项目中用到了萤石云视频,它的项目源码很多,找到有用的代码很费时间,所以今天写成文章把集...

    Steven 评论0 收藏0
  • python数据库连接工具DBUtils

    摘要:是一个允许在多线程应用和数据库之间安全及高效连接的模块套件。实现了稳定,线程仿射,持久化的数据库连接。线程结束时该连接会自动关闭。但仍可以请求非线程共享的专用数据库连接。 DBUtils是一个允许在多线程python应用和数据库之间安全及高效连接的python模块套件。 模块 DBUtils套件包含两个模块子集,一个适用于兼容DB-API 2接口的模块,一个适用于PyGreSQL的模块...

    王笑朝 评论0 收藏0

发表评论

0条评论

ixlei

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<