Android SQLiteOpenHelper GetWritableDatabase()失败,无异常

Android SQLiteOpenHelper GetWritableDatabase()失败,无异常,android,sqlite,sqliteopenhelper,Android,Sqlite,Sqliteopenhelper,我有一个很奇怪的问题。它只能在多个设备上不时显示。似乎无法在我想要的时候复制它,但我拥有它太多次了,我想我知道我从哪里得到它 因此,我有一个通过单例SQLiteOpenHelper连接到sqlite的加载程序: 我的SQLIteOpenHelper如下所示: public class DatabaseHelper extends SQLiteOpenHelper { private static DatabaseHelper mInstance = null; private

我有一个很奇怪的问题。它只能在多个设备上不时显示。似乎无法在我想要的时候复制它,但我拥有它太多次了,我想我知道我从哪里得到它

因此,我有一个通过单例SQLiteOpenHelper连接到sqlite的加载程序:

我的SQLIteOpenHelper如下所示:

public class DatabaseHelper extends SQLiteOpenHelper { 

    private static DatabaseHelper mInstance = null;
    private static Context mCxt;

    public static DatabaseHelper getInstance(Context cxt) {
        //using app context as suggested by CommonsWare
        Log.i("DBHELPER1", "cxt"+mCxt+" / instance: "+mInstance);
        if (mInstance == null) {
            mInstance = new DatabaseHelper(cxt.getApplicationContext());
        }
        Log.i("DBHELPER2", "cxt"+mCxt+" / instance: "+mInstance);
        mCxt = cxt;
        return mInstance;
    }

    //private constructor
    private DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.mCxt = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //some tables created here
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //upgrade code here
    }
}
它在大多数情况下都非常有效。但我不时会收到类似的日志:

06-10 23:49:59.621: I/DBHELPER1(26499): cxtcom.myapp@407152c8 / instance: com.myapp.helpers.DatabaseHelper@40827560
06-10 23:49:59.631: I/DBHELPER2(26499): cxtcom.myapp@407152c8 / instance: com.myapp.helpers.DatabaseHelper@40827560
06-10 23:49:59.631: I/DetailsLoader(26499): Get event details offline / db helper: com.myapp.helpers.DatabaseHelper@40827560
06-10 23:49:59.631: I/DBHELPER1(26499): cxtcom.myapp@407152c8 / instance: com.myapp.helpers.DatabaseHelper@40827560
06-10 23:49:59.651: I/DBHELPER2(26499): cxtcom.myapp@407152c8 / instance: com.myapp.helpers.DatabaseHelper@40827560
此行Log.iTAG,脱机获取详细信息/db:+db;从来没有人打过电话!没有例外,沉默。另外,加载程序的线程不再运行

因此,没有什么超越了界限:

SQLiteDatabase db=DatabaseHelper.getInstance(this.getContext()).getWritableDatabase(); 
被执行


这一行可能会出现什么错误?

uhm,当您无法打开数据库进行写入时,getWritableDatabase会引发错误,当它引发此错误时,请指定closer。对于与用户的交互,这是很奇怪的。正如您在我的代码中看到的,我甚至尝试捕获SQLiteException,这两个异常都应该根据文档和异常抛出。我发布的日志的这一部分-就这样-没有其他显示。。。应用程序已响应,但加载程序线程已死亡可能是内存泄漏。。。这听起来特别有可能,因为您似乎很难始终如一地复制问题。尝试使上下文非静态,并删除行mCxt=cxt;从getInstance方法。。。如果它没有任何帮助,更新你的代码,我可以再看一眼。有趣的是,我这样做了很长一段时间,gc表现正常。从未发现任何泄漏,我不时检查。但是我用普通的cxt更新了代码,今天将尝试重新生成它。如果它真的有效-很好:-真的很难说。我解决了它和其他一些问题,但我真的不知道哪个解决方案对哪个问题有效;我将上下文设置为非静态,从代码中删除了所有sqlite.close,并且还更改了离线/在线加载程序的垃圾概念背后的逻辑。顺便说一句,如果你有时间,你可以看看这个概念在这里-。
SQLiteDatabase db=DatabaseHelper.getInstance(this.getContext()).getWritableDatabase();