ExpandableList, SimpleCursorTreeAdapter, Cursor Problem

  • Antworten:2
  • Bentwortet
Fabian K.
  • Forum-Beiträge: 5

02.04.2011, 11:35:47 via Website

Hallo zusammen,

ich verwende in meiner App eine ExpandableList die Daten durch den SimpleCursorTreeAdapter bekommt.

Sobald ich in der Liste eine Gruppe schließe und eine andere öffne bekomm ich im LogCat folgende Warnung:

104-02 11:05:46.063: WARN/SQLiteCompiledSql(692): Releasing statement in a finalizer. Please ensure that you explicitly call close() on your cursor: SELECT v._id AS _id, z.name AS nameZimmer, v.name AS nameVerbraucher, d.power AS power, CASE WHEN d.
204-02 11:05:46.063: WARN/SQLiteCompiledSql(692): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
304-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:62)
404-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:100)
504-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:46)
604-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42)
704-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
804-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1315)
904-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at de.smarthome.gui.HaushaltssteuerungActivity$3.getChildrenCursor(HaushaltssteuerungActivity.java:104)
1004-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.widget.CursorTreeAdapter.getChildrenCursorHelper(CursorTreeAdapter.java:106)
1104-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.widget.CursorTreeAdapter.getChildrenCount(CursorTreeAdapter.java:176)
1204-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.widget.ExpandableListConnector.refreshExpGroupMetadataList(ExpandableListConnector.java:561)
1304-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.widget.ExpandableListConnector.expandGroup(ExpandableListConnector.java:682)
1404-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.widget.ExpandableListView.handleItemClick(ExpandableListView.java:567)
1504-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.widget.ExpandableListView.performItemClick(ExpandableListView.java:527)
1604-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
1704-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.os.Handler.handleCallback(Handler.java:587)
1804-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.os.Handler.dispatchMessage(Handler.java:92)
1904-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.os.Looper.loop(Looper.java:123)
2004-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at android.app.ActivityThread.main(ActivityThread.java:4627)
2104-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at java.lang.reflect.Method.invokeNative(Native Method)
2204-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at java.lang.reflect.Method.invoke(Method.java:521)
2304-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
2404-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
2504-02 11:05:46.063: WARN/SQLiteCompiledSql(692): at dalvik.system.NativeStart.main(Native Method)

Code Zeile 104:
1childCursor = dbConn.rawQuery(sql_child, new String[] { groupCursor.getString(groupCursor.getColumnIndex("nameZimmer")) });

1...
2private Cursor groupCursor;
3 private Cursor childCursor;
4
5 private NetzwerkService.NetzwerkServiceBinder mNetzwerkBinder;
6
7 public void onCreate(Bundle savedInstanceState) {
8 super.onCreate(savedInstanceState);
9 setContentView(R.layout.verbrauch_extended_list);
10 setTitle(getTitle() + " - Haushaltssteuerung");
11 registerForContextMenu(findViewById(android.R.id.list));
12
13
14 }
15
16 private final Handler handler = new Handler() {
17 @Override
18 public void handleMessage(Message msg) {
19 if(msg.what == UPDATE_VIEW) {
20 mAdapter.notifyDataSetChanged(false);
21 }
22 super.handleMessage(msg);
23 }
24 };
25
26 @Override
27 public void onResume() {
28 super.onResume();
29
30 mListView = getExpandableListView();
31
32 String sql_gruppen = "SELECT v._id, zimmer_id AS _id, z.name AS nameZimmer, v.name AS nameVerbraucher, sum(d.power) AS power, v.image AS image " +
33 "FROM zimmer z " +
34 "JOIN verbraucher v ON z._id = v.zimmer_id " +
35 "LEFT OUTER JOIN details d ON v._id = d.verbraucher_id GROUP BY nameZimmer ORDER BY v.zimmer_id";
36
37 db = new SmartHomeDB(this);
38 dbConn = db.getReadableDatabase();
39
40 // DB-Abfrage um die Gruppen darzustellen
41 groupCursor = dbConn.rawQuery(sql_gruppen, null);
42 startManagingCursor(groupCursor);
43
44 // Adapter für ExpandableList erstellen
45 mAdapter = new SimpleCursorTreeAdapter(
46 this,
47 groupCursor,
48 R.layout.verbrauch_extended_list_group_row,
49 new String[] { "nameZimmer" , "power" },
50 new int[] { R.id.groupText1 , R.id.groupText2 },
51 R.layout.haushaltsgeraete_list_row,
52 new String[] { "image" , "nameVerbraucher" , "power" },
53 new int[] { R.id.deviceListImage , R.id.deviceListText1 , R.id.deviceListText2 }) {
54
55 @Override
56 protected Cursor getChildrenCursor(Cursor groupCursor) {
57
58 String sql_child = "SELECT v._id AS _id, z.name AS nameZimmer, v.name AS nameVerbraucher, d.power AS power, " +
59 "CASE WHEN d.state = 'On' OR d.state = 'Running' THEN v.image_on ELSE v.image END AS image " +
60 "FROM zimmer z " +
61 "JOIN verbraucher v ON z._id = v.zimmer_id " +
62 "LEFT OUTER JOIN details d ON v._id = d.verbraucher_id WHERE z.name LIKE ?";
63
64 // DB-Abfrage um die Kindelemente darzustellen
65 childCursor = dbConn.rawQuery(sql_child, new String[] { groupCursor.getString(groupCursor.getColumnIndex("nameZimmer")) });
66
67 return childCursor;
68 }
69 };
70
71 // Der ExpandableListView den Adapter zuweisen
72 mListView.setAdapter(mAdapter);
73}

Ich hoffe mir kann jmd weiterhelfen...

Viele Grüße.

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

02.04.2011, 21:40:16 via Website

Schieb in Zeile 66 Folgendes ein:
1if (childCursor != null) {
2 startManagingCursor(childCursor);
3}

Antworten
Fabian K.
  • Forum-Beiträge: 5

03.04.2011, 08:58:21 via Website

Ja Klasse, das funktioniert! :)
Vielen Dank Dir!

Antworten