我是SQLite数据库的新手并且学习速度很快,我的应用程序工作正常,即将完成部署,但我想确保我使用的是最佳实践并且没有一些隐藏的内存泄漏或其他会影响应用程序或用户。
所以我有记录在SQLite数据库中的标记,我使用DBHelper并在每次读取或写入之前调用.open()和.close()方法。
public MySpotsDatabase open() throws SQLException {
databaseHelper = new DbHelper(context);
mySpotsDatabase = databaseHelper.getWritableDatabase();
return this;
}
public void close() {
databaseHelper.close();
}
但是对于SQLiteAssetHelper数据库呢?我在一个数据库中有数百个标记,我加载并在地图上显示,并且所有工作正常但我不确定是否需要.open()和.close()方法用于只读数据库。它在另一个线程上被调用,所以那里都很好,但是我找不到关于正确执行打开和关闭数据库的任何信息。
我按照GitHub的说明: https://github.com/jgilfelt/android-sqlite-asset-helper 但我找不到关闭数据库的位置。
根据CL的评论编辑。
我收到如下错误:
09-14 10:37:35.084 13951-13960 / au.com.itmobilesupport.ausreefs W / SQLiteConnectionPool:数据库' +数据+用户+ 0 + au_com_itmobilesupport_ausreefs +数据库+ ReefData_db&的SQLiteConnection对象#39;被泄露了!请修复您的应用程序以正确结束正在进行的事务,并在不再需要时关闭数据库。
下面是我的SQLiteAssetHelper的SQL代码。经过更多检查后,我打开了只读数据库,但问题是我需要关闭它。
public class ReefsDatabase extends SQLiteAssetHelper {
private static final String DATABASE_NAME = "ReefData.db";
private static final int DATABASE_VERSION = 1;
public ReefsDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
setForcedUpgrade();
}
public Cursor getStateData() {
SQLiteDatabase db = getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
String [] sqlSelect = {"0 _id", "state", "iconone" };
String sqlTables = "Reefs";
qb.setTables(sqlTables);
qb.setDistinct(true);
Cursor c = qb.query(db, sqlSelect, null, null, null, null, null);
c.moveToFirst();
return c;
}
public Cursor getRegionData(String whichState) {
SQLiteDatabase db = getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
String [] sqlSelect = {"0 _id", "region", "icontwo" };
String [] theState = { whichState };
String sqlTables = "Reefs";
qb.setTables(sqlTables);
qb.setDistinct(true);
Cursor c = qb.query(db, sqlSelect, "state=?" , theState, null, null, null);
c.moveToFirst();
return c;
}
public Cursor getAreaData(String whichState, String whichRegion) {
SQLiteDatabase db = getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
String [] sqlSelect = {"0 _id", "state", "region", "area", "latitude", "longitude"};
String sqlFilter = "state= '"+whichState+"' AND region= '"+whichRegion+"'";
String [] sqlValues = {""};
String sqlTables = "Reefs";
qb.setTables(sqlTables);
Cursor c = qb.query(db, sqlSelect, sqlFilter, null, null, null, null);
c.moveToFirst();
return c;
}
public Cursor getAllData() {
SQLiteDatabase db = getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
String [] sqlSelect = {"0 _id", "state", "region", "latitude", "longitude"};
String sqlTables = "Reefs";
qb.setTables(sqlTables);
qb.setDistinct(false);
Cursor c = qb.query(db, sqlSelect, null, null, null, null, null);
c.moveToFirst();
return c;
}
}
那我该怎么关闭数据库?
答案 0 :(得分:0)
在CL的评论之后,我已经能够解决这个问题了。我不得不关闭数据库,所以我更改了SQLiteAssetHelper类,以便open()和close()调用来自调用数据库的Activity。
public class ReefsDatabase扩展了SQLiteAssetHelper {
private static final String DATABASE_NAME = "ReefData.db";
private static final int DATABASE_VERSION = 1;
private SQLiteDatabase myReefs;
private DbHelper databaseHelper;
private final Context context;
public ReefsDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
setForcedUpgrade();
}
public Cursor getStateData() {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
String [] sqlSelect = {"0 _id", "state", "iconone" };
String sqlTables = "Reefs";
qb.setTables(sqlTables);
qb.setDistinct(true);
Cursor c = qb.query(myReefs, sqlSelect, null, null, null, null, null);
c.moveToFirst();
return c;
}
private class DbHelper extends SQLiteAssetHelper {
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}
public ReefsDatabase open() throws SQLException {
databaseHelper = new DbHelper(context);
myReefs = databaseHelper.getReadableDatabase();
return this;
}
public void close() {
databaseHelper.close();
}
希望这有助于某人。