所以基本上我两次查询数据库。我不明白这个错误究竟来自哪里,因为我没有在任何地方关闭数据库。返回错误的代码就是这样运行的。我查了一下,我刚看到像我这样的案子。
BeaconHandler pullAllDB = new BeaconHandler(this);
try {
List<Beacon> beaconsShown = pullAllDB.getAllBeacons();
for (final Beacon bn : beaconsShown) {
try {
int messageCount = pullAllDB.getMessageCount();
Log.d("Message", messageCount + " Messages Found");
if (messageCount > 0) {
//Do Something
} else {
// Do Nothing
}
}
catch (Exception e) {
e.getStackTrace();
Log.e("Message", e.getMessage());
}
}
}
执行查询的代码......
public int getBeaconsCount() {
String countQuery = "SELECT * FROM " + TABLE_BASIC_BEACON;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
cursor.close();
// return count
return cursor.getCount();
}
public int getMessageCount() {
String mcountQuery = "SELECT * FROM " + MESSAGE_BEACON;
SQLiteDatabase mdb = this.getReadableDatabase();
Cursor mcursor = mdb.rawQuery(mcountQuery, null);
mcursor.close();
// return count
return mcursor.getCount();
}
答案 0 :(得分:19)
如果收到错误,您应该发布一个logcat。它有助于查看导致问题的行。
来自Android文档。
关闭()
关闭Cursor,释放所有资源并制作 它完全无效。
关闭后,您对mcursor.getCount()
的来电可能会导致错误
也许尝试这样的事情。
int count = mcursor.getCount();
mcursor.close();
// return count
return count ;
答案 1 :(得分:1)
我假设pullAllDB
是您的数据库对象,其中包含执行查询的代码。在这种情况下,在行List<Beacon> beaconsShown = pullAllDB.getAllBeacons();
之前,您应该执行pullAllDB.open();
之类的操作,并在完成查询后执行pullAllDB.close();
。
总而言之,你的功能看起来像......
try {
//open the database class here
pullAllDB.open();
List<Beacon> beaconsShown = pullAllDB.getAllBeacons();
for (final Beacon bn : beaconsShown) {
try {
int messageCount = pullAllDB.getMessageCount();
Log.d("Message", messageCount + " Messages Found");
if (messageCount > 0) {
//Do Something
} else {
// Do Nothing
}
}
catch (Exception e) {
e.getStackTrace();
Log.e("Message", e.getMessage());
}
//close the database here
pullAllDB.close();
}
}