【发布时间】:2017-09-21 15:07:34
【问题描述】:
我有一个 SQLite 数据库来支持 Android 应用程序中的所有内容。
我有一个扩展 SQLiteAssetHelper 的 DatabaseHelper 类。
我的数据库实例过多时遇到问题,然后出现 SQLiteCantOpenDatabaseException。
为了解决这个问题,我更改了我的类以维护 DatabaseHelper 对象的单个实例。
我有以下几点:
private static DatabaseHelper databaseHelper;
public static synchronized DatabaseHelper getInstance(Context context, boolean singleRow, boolean showLoader){
if(databaseHelper == null) {
databaseHelper = new DatabaseHelper(context, singleRow, showLoader);
}
return databaseHelper;
}
public DatabaseHelper(Context context, boolean singleRow, boolean showLoader){
super(context, (new File(DatabaseManager.getDatabasePath(context))).getName(), (new File(DatabaseManager.getDatabasePath(context))).getParentFile().getAbsolutePath(), null, DATABASE_VERSION);
this.context = context;
this.singleRow = singleRow;
this.showLoader = showLoader;
}
然后我调用getInstance静态方法如下:
DatabaseHelper databaseHelper = DatabaseHelper.getInstance(activity.getApplicationContext(), false, false);
在一定数量的数据库活动之后,应用程序仍然因内存原因而崩溃。
然后我得到这个错误:
Error Code : 2062 (SQLITE_CANTOPEN_EMFILE)
Caused By : Application has opened two many files. Maximum of available file descriptors in one process is 1024 in default.
(unable to open database file (code 2062))
采用单例方法后,我有点不明白为什么这仍然会导致内存泄漏。
任何帮助将不胜感激。
【问题讨论】:
-
也许检查一下您是否有未关闭的游标。我确实记得有一个类似的问题,但我不记得它表明 1024 太多了。我会试着找到我发的关于这个的帖子。
-
SQLite unable to open database file (code 14) on frequent “SELECT” query 是帖子。消息不同,但我认为很明显,光标会导致文件被打开。
-
我查看了这个游标问题,发现我有很多打开的游标。还没有全部关闭,看来问题已经解决了。不过,我还没有进行广泛的测试,所以我不能 100% 确定。它肯定让我越过了我以前的障碍点。我可以请您根据光标输入一个信息丰富的答案,以便将其留给其他人查看吗?对于我来说,这个特殊错误是正确的答案!
标签: java android sqlite android-sqlite