java - Android中的Sqlite : DataBaseObjectNotClosedException

标签 java android android-sqlite

我已经从 Android 中的 SQLite 数据库填充了 ListView。当我运行应用程序 ListView 时,它没有填充数据 - 它是空的。即使我也关闭了 Cursor,我也会收到 DataBaseObjectNotClosedException 异常。谁能看出我的错误在哪里?

这是我的日志文件:

07-15 14:46:45.372: E/Database(18100): close() was never explicitly called on database '/data/data/com.sqlitedemo/databases/EmployeeReview.db' 
07-15 14:46:45.372: E/Database(18100): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
07-15 14:46:45.372: E/Database(18100):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1847)
07-15 14:46:45.372: E/Database(18100):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
07-15 14:46:45.372: E/Database(18100):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
07-15 14:46:45.372: E/Database(18100):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
07-15 14:46:45.372: E/Database(18100):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:544)
07-15 14:46:45.372: E/Database(18100):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
07-15 14:46:45.372: E/Database(18100):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
07-15 14:46:45.372: E/Database(18100):  at com.sqlitedemo.Employee_List.showList(Employee_List.java:148)
07-15 14:46:45.372: E/Database(18100):  at com.sqlitedemo.Employee_List.onCreate(Employee_List.java:63)
07-15 14:46:45.372: E/Database(18100):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-15 14:46:45.372: E/Database(18100):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
07-15 14:46:45.372: E/Database(18100):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
07-15 14:46:45.372: E/Database(18100):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
07-15 14:46:45.372: E/Database(18100):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
07-15 14:46:45.372: E/Database(18100):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-15 14:46:45.372: E/Database(18100):  at android.os.Looper.loop(Looper.java:123)
07-15 14:46:45.372: E/Database(18100):  at android.app.ActivityThread.main(ActivityThread.java:3683)
07-15 14:46:45.372: E/Database(18100):  at java.lang.reflect.Method.invokeNative(Native Method)
07-15 14:46:45.372: E/Database(18100):  at java.lang.reflect.Method.invoke(Method.java:507)
07-15 14:46:45.372: E/Database(18100):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-15 14:46:45.372: E/Database(18100):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-15 14:46:45.372: E/Database(18100):  at dalvik.system.NativeStart.main(Native Method)

这是我在 Activity 类中的方法

private void showList()
    {     

    ArrayList<Employee> EmployeeList = new ArrayList<Employee>();  
    EmployeeList.clear();  

    String strQuery = "SELECT sum(empid) as emp_id, Staff_emp_name as emp_name, department as emp_dept, designation as emp_designation,"
                    +" (SUM(performance_rate_one+performance_rate_two+performance_rate_three+performance_rate_four+performance_rate_five)/5) as TotalPerformance"
                    +" FROM employee_details INNER JOIN performance"
                    +" ON employee_details.Emp_id = performance.empid "
                    +" GROUP BY empid "
                    +" ORDER BY TotalPerformance DESC";


    SQLiteDatabase sqlDatabase = databaseHelper.getWritableDatabase();
    Cursor c1 =sqlDatabase.rawQuery(strQuery, null);


    if (c1 != null && c1.getCount() != 0) 
    {   
        if (c1.moveToFirst())

        {   
            do
            {    
                Employee EmployeeListItems = new Employee();  
                EmployeeListItems.setEmployeeId(c1.getInt(c1.getColumnIndex("emp_id")));
                EmployeeListItems.setName(c1.getString(c1.getColumnIndex("emp_name")));
                EmployeeListItems.setDepartment(c1.getString(c1.getColumnIndex("emp_dept")));
                EmployeeListItems.setDesignation(c1.getString(c1.getColumnIndex("emp_designation")));

                EmployeeListItems.setPerformancerate(c1.getString(c1.getColumnIndex("TotalPerformance")));
                EmployeeList.add(EmployeeListItems);     

            } while (c1.moveToNext());   

    } 
        startManagingCursor(c1);
        sqlDatabase.close();
        c1.close();
    } 

        EmployeeList_Adapter contactListAdapter = new EmployeeList_Adapter(Employee_List.this, EmployeeList); 
        listEmployee.setAdapter(contactListAdapter);  
        contactListAdapter.notifyDataSetChanged();

    }

我在线路上遇到错误

SQLiteDatabase sqlDatabase = databaseHelper.getWritableDatabase();
Cursor c1 =sqlDatabase.rawQuery(strQuery, null);

最佳答案

 sqlDatabase.close();
 c1.close();

将会是 -

 c1.close();
 sqlDatabase.close();

关于java - Android中的Sqlite : DataBaseObjectNotClosedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24754443/

相关文章:

java - 多次调用 java SaxParser.parse(String, Handler) 合法吗?

java - 哪个xml序列化库是性能导向的?

java - 100 次循环完成后,如何获得比较总数?

android - 在 Android 中保存和恢复 MapView 的最佳方式是什么?

java - 如何修复sqlite在android中多次插入最后一个EditText值

android - 如何在 SQLite 查询中使用通配符?

java - 如何使我的应用程序在选择时以及用户选择文件夹时读取我的文件,然后使应用程序读取其中的所有文件?

java - 我正在尝试使用回收器 View 从 Fire Base 数据库检索数据,但出现错误

java - 当我返回 Activity 时,如何重新启动 BarcodeDetector 以获得新结果?

android - 使用 ID 删除多行?