android – getReadableDatabase经常,但并不总是返回null

android – getReadableDatabase经常,但并不总是返回null,第1张

概述我在我的 android应用程序的Crashlytics-Logs中看到了这段代码中的NullPointerException: try { mSQLDBreader = this.getReadableDatabase();} catch (SQLException e) { if (mSQLDBreader != null) { mSQLDBreader.cl 我在我的 android应用程序的Crashlytics-Logs中看到了这段代码中的NullPointerException:

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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1125314.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存