从未在数据库上显式调用SQLite ERROR close()

时间:2012-06-08 11:30:08

标签: android sqlite

我有一个SQLite数据库,它可以工作,但我在更改或添加竞争时在Logcat上收到以下错误。我必须关闭数据库吗?

06-08 12:52:29.897: E/Database(6274): close() was never explicitly called on database '/data/data/de.android.test/databases/table.db' 
06-08 12:52:29.897: E/Database(6274): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
06-08 12:52:29.897: E/Database(6274):   at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1900)
06-08 12:52:29.897: E/Database(6274):   at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:884)
06-08 12:52:29.897: E/Database(6274):   at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:918)
06-08 12:52:29.897: E/Database(6274):   at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:911)
06-08 12:52:29.897: E/Database(6274):   at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:548)
06-08 12:52:29.897: E/Database(6274):   at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
06-08 12:52:29.897: E/Database(6274):   at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
06-08 12:52:29.897: E/Database(6274):   at de.database.DAO.<init>(DAO.java:39)
06-08 12:52:29.897: E/Database(6274):   at de.AWocheActivity.onClick(AWocheActivity.java:551)
06-08 12:52:29.897: E/Database(6274):   at android.view.View.performClick(View.java:2408)
06-08 12:52:29.897: E/Database(6274):   at android.view.View$PerformClick.run(View.java:8817)
06-08 12:52:29.897: E/Database(6274):   at android.os.Handler.handleCallback(Handler.java:587)
06-08 12:52:29.897: E/Database(6274):   at android.os.Handler.dispatchMessage(Handler.java:92)
06-08 12:52:29.897: E/Database(6274):   at android.os.Looper.loop(Looper.java:144)
06-08 12:52:29.897: E/Database(6274):   at android.app.ActivityThread.main(ActivityThread.java:4937)
06-08 12:52:29.897: E/Database(6274):   at java.lang.reflect.Method.invokeNative(Native Method)
06-08 12:52:29.897: E/Database(6274):   at java.lang.reflect.Method.invoke(Method.java:521)
06-08 12:52:29.897: E/Database(6274):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
06-08 12:52:29.897: E/Database(6274):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
06-08 12:52:29.897: E/Database(6274):   at dalvik.system.NativeStart.main(Native Method)

这是代码:

的活动:

     public void onCreate(Bundle savedInstanceState) {
    .
    .
    .
    dao = new DAO(this);
    Cursor subjectList = dao.fetchAllSubject();
   }

    public void onClick(View v) {
    global_db_Id = 0;

    dao = new DAO(this);
    Cursor subjectList = dao.fetchAllSubject();

        if (global_db_Id == 0){
        long insertedId = dao.createSubject(String.valueOf(hour), "A", String.valueOf(day), fach_kurz.getText().toString(), fach_lang.getText().toString(), String.valueOf(item), room.getText().toString(),String.valueOf(index_awoche));
        }else{
            dao.updateSubject(String.valueOf(global_db_Id), String.valueOf(hour), "A", String.valueOf(day), fach_kurz.getText().toString(), fach_lang.getText().toString(), String.valueOf(item), room.getText().toString(), String.valueOf(index_awoche));

         //if (dao != null) {
         //dao.close();
        //}         
}

在onClick方法的最后,我试图关闭数据库,但随后应用程序崩溃了。 数据库:

    public class DAO {

        private DatabaseHelper dbHelper;

        private SQLiteDatabase database;
        public long createSubject(String hour, String week, String day, String name,String desc, String col, String room, String btn_nr){
            ContentValues values = new ContentValues();
            values.put(COLUMN_HOUR, hour);
            values.put(COLUMN_WEEK, week);
            values.put(COLUMN_DAY, day);
            values.put(COLUMN_NAME, name);
            values.put(COLUMN_DESCRIPTION, desc);
            values.put(COLUMN_COLOUR, col);
            values.put(COLUMN_ROOM, room);
            values.put(COLUMN_BTN_NR, btn_nr);



return database.insert(TABLE, null, values);
    }

    public Cursor fetchAllSubject(){
        Cursor mCursor = database.query(true, TABLE, new String[] {
                COLUMN_ID, COLUMN_HOUR, COLUMN_WEEK, COLUMN_DAY, COLUMN_NAME, COLUMN_DESCRIPTION, COLUMN_COLOUR, COLUMN_ROOM, COLUMN_BTN_NR},null
                , null, null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }

    public int updateSubject(String id, String hour, String week, String day, String name,String desc, String col, String room, String btn_nr){
        ContentValues values = new ContentValues();
        values.put(COLUMN_HOUR, hour);
        values.put(COLUMN_WEEK, week);
        values.put(COLUMN_DAY, day);
        values.put(COLUMN_NAME, name);
        values.put(COLUMN_DESCRIPTION, desc);
        values.put(COLUMN_COLOUR, col);
        values.put(COLUMN_ROOM, room);
        values.put(COLUMN_BTN_NR, btn_nr);
        return database.update(TABLE, values,COLUMN_ID + "=?",new String[]{id});
        }
    // This I tried on the end of the onClick Method    
    public void close(){
            if(database!=null)
                database.close();
    }

1 个答案:

答案 0 :(得分:2)

将以下代码写入数据库文件

public class DataBaseHelper extends SQLiteOpenHelper {

   public DataBaseHelper(Context context) {

    super(context, DB_NAME, null, 1);
    this.myContext = context;
 }


    @Override
    public synchronized void close() {

    if (myDataBase != null)
        myDataBase.close();

    super.close();

    }

    @Override
    public void onCreate(SQLiteDatabase arg0) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

然后从活动中调用

 myDataBase.close();

这是推荐的好链接

http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/