解决android sqlite 中"close() was never explicitly called on database" 与java线程同步

本文详细阐述了在Eclipse程序开发中遇到的SQLite数据库异常信息close() was never explicitly called on database的问题原因及解决办法。通过实现SQLiteOpenHelper对象的单例模式,确保数据库资源的有效管理,避免潜在的程序错误。同时,文章深入介绍了Java线程同步机制,包括synchronized关键字的应用,以及如何使用同步方法和同步代码块来管理多线程并发访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

          在最近一个程序的开发 中,在eclipse中看到了下面的异常信息,虽然没有引起 程序崩溃,但还是值得重视

          close() was never explicitly called on database

                 网上查了一些资料,主要的原因是因为创建的SQLiteOpenHelper实例化对象,没有显式的关闭,而且我自己在很多方法中都new出了不同的SQLiteOpenHelper实例对象。这样就会有可能出现,前面一个SQLiteOpenHelper对象没有释放出资源,而后面的一个SQLiteOpenHelper对象也同时开始对数据库进行操作了,可能会引起预想不到的bug。


        依然是参考网上的解决方案,比较简单,创建SQLiteOpenHelper对象的单例模式;

	public static synchronized HistorySqilte getHelper(Context context)
    {
        if (mOpenHelper == null)
            mOpenHelper = new HistorySqilte(context);
        return mOpenHelper;
    }
       这样之后,每次需要SQLiteOpenHelper对象时,只需要调用该静态方法就行了,加上方法同步,可以保证在整个应用中只会有这么一个实例。


            在这里顺便提一下java的线程同步,java的线程同步是用的关键字synchronized,synchronized可以用来修饰一个方法,

          如果是synchronized method(){}, 那么某一个类的某一个实例化对象就不可以同时访问这个类中所有的这种方法,只有获得这对象的锁之后才能访问这样的方法,当然如果一个类new出了几个对象,那么这些不同的对象同时访问一个方法是可以的。

        如果是synchronized static method(){}, 这种静态的同步方法,那么这个类的任何对象都不能同时访问这类同步方法。

         synchronized 关键字还能修饰方法中的某一块区域,synchronized(object){/*区域块*/},这里的object就相当于一把锁,一个类中,同时指定这把锁的同步方法不能同时被同一个对象访问。

       

         上面的内容都是关于之前SQLiteOpenHelper异常的一些知识上的延伸,后续还有相关理解,继续补充。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值