
try { msqlDBreader = this.getReadableDatabase();} catch (sqlException e) { if (msqlDBreader != null) { msqlDBreader.close(); msqlDBreader = this.getReadableDatabase(); }}msqlDBreader... // NPE 由于以前的开发人员不再可用,我不知道为什么它会被尝试两次,但代码似乎有时会起作用,但往往不行.这个调用返回null的原因是什么?
似乎这只发生在2.3.x设备上,在我的崩溃日志中,所有受影响的设备都是2.3.5和2.3.6.
解决方法 你有自己创作的线程吗?一些可能通过其他方法重置msqlDBreader的代码.也许该线程在使用之前偶尔会运行并破坏msqlDBreader的值?你有没有在运行2.3.x的模拟器上见过这个?
我看了Google的getReadableDatabase代码,我没有看到它可以返回null的方式.如果您有兴趣,请参阅下面的血腥细节.基于我所看到的,我怀疑你的代码中存在多线程错误,或者是你所测试设备的制造商对androID代码的自定义引入的错误(如果这甚至是合理的话.)
Gory详细信息getReadableDatabase的所有路径在创建后都会在返回对象上调用方法.因此,该点的值不能为null.否则NPE将从内部升起.
以下是getReadableDatabase的2.3.6代码片段.实际来源于grepcode年开始提供.
public synchronized sqliteDatabase getReadableDatabase() { if (mDatabase != null && mDatabase.isopen()) { return mDatabase; // The database is already open for business } if (mIsInitializing) { /* snip throw ISE */ } try { return getWritableDatabase(); } catch (sqliteException e) { // snip : throws or falls through below } sqliteDatabase db = null; try { mIsInitializing = true; String path = mContext.getDatabasePath(mname).getPath(); db = sqliteDatabase.openDatabase(path,mFactory,sqliteDatabase.OPEN_Readonly); // *** next line calls method on db. NPE would be here if db was null at this point. *** if (db.getVersion() != mNewVersion) { // snip throw. } onopen(db); Log.w(TAG,"Opened " + mname + " in read-only mode"); mDatabase = db; return mDatabase; } finally { // snip : not relevant }} 请注意,getReadableDatabase通常只返回getWritableDatabase的结果.他看起来像这样:
public synchronized sqliteDatabase getWritableDatabase() { if (mDatabase != null && mDatabase.isopen() && !mDatabase.isReadonly()) { return mDatabase; // The database is already open for business } if (mIsInitializing) { throw new IllegalStateException("getWritableDatabase called recursively"); } // snip comment about locking boolean success = false; sqliteDatabase db = null; if (mDatabase != null) mDatabase.lock(); try { mIsInitializing = true; if (mname == null) { db = sqliteDatabase.create(null); } else { db = mContext.openorCreateDatabase(mname,mFactory); } int version = db.getVersion(); // ** method called on result! // snip block that has more method calls and never nulls out db onopen(db); success = true; return db; } finally { // snip mDatabase = db; // snip rest of finally block that isn't relevant. }} 最后,重要的是要注意这两个方法以及sqliteOpenHelper的close方法都使用synchronize标记,因此如果有多个线程调用这些方法,则一个方法无法废弃另一个方法的状态同时..
总结以上是内存溢出为你收集整理的android – getReadableDatabase经常,但并不总是返回null全部内容,希望文章能够帮你解决android – getReadableDatabase经常,但并不总是返回null所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)