2014-11-04 44 views
1

在我的android應用程序中,我使用sqlite數據庫,但使用查詢從SQLite中讀取數據時,它給了我錯誤。這是我創建表的代碼。「無法重新打開一個已經關閉的對象」,當從sqlite讀取數據時android

package com.example.mydb; 
public class Dbadapter { 

private static final String DATABASE_NAME = "mydb"; 
private static final int DATABASE_VERSION = 5; 

private static final String DATABASE_TABLE18 = "modalation_medicine_table"; 
private static final String MOD_ID = "modalation_previousss_id"; 
private static final String MOD_MED_ID = "modalation_medicine_id"; 
private static final String MOD_MEDICINE = "modalation_medicine"; 

private static final String CREATE_DATABASE_TABLE18 = "CREATE TABLE IF NOT EXISTS " 
     + DATABASE_TABLE18 
     + " (" 
     + MOD_MED_ID 
     + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
     + MOD_MEDICINE 
     + " text, " 
     + MOD_ID 
     + " integer, " 
     + " FOREIGN KEY (" 
     + MOD_ID 
     + ") REFERENCES " 
     + DATABASE_TABLE5 
     + " (" 
     + MODALATION_KEY_ID 
     + "));"; 

private DbHelper ourHelper; 
private final Context ourContext; 
private SQLiteDatabase ourDatabase; 

private static class DbHelper extends SQLiteOpenHelper { 

    public DbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
      db.execSQL(CREATE_DATABASE_TABLE18); 

    ContentValues modalation_medicine = new ContentValues(); 
     modalation_medicine.put(MOD_MEDICINE, "Natrum Muriaticum"); 
     modalation_medicine.put(MOD_ID, 1); 
     db.insert(DATABASE_TABLE18, null, modalation_medicine); 

     modalation_medicine.put(MOD_MEDICINE, "Calcarea Carbonica"); 
     modalation_medicine.put(MOD_ID, 1); 
     db.insert(DATABASE_TABLE18, null, modalation_medicine); 

     modalation_medicine.put(MOD_MEDICINE, "Phosphorus"); 
     modalation_medicine.put(MOD_ID, 1); 
     db.insert(DATABASE_TABLE18, null, modalation_medicine); 
} 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXIST " + DATABASE_TABLE18); 

    } 

} 

public Dbadapter(Context c) { 
    ourContext = c; 
} 

public Dbadapter open() throws SQLException{ 
    ourHelper = new DbHelper(ourContext); 
    ourDatabase = ourHelper.getWritableDatabase(); 
    return this; 
} 

public void close() { 
    ourHelper.close(); 
} 

現在,當使用這種方法從我的SQLite數據庫讀取數據M,它給了我一個錯誤「無法重新打開已關閉的對象」。

public boolean mod_app_symps(String l, String modfinalMed) { 
     String[] modalation = new String[] { MOD_ID, MOD_MEDICINE }; 
     Cursor c24; 
     boolean iscontain = false; 
     c24 = ourDatabase.query(DATABASE_TABLE18, modalation, "modalation_previousss_id = ? AND modalation_medicine = ?",new String[] { l , modfinalMed } , null, null, null); 
     if(c24.getCount() > 0) { 
      iscontain = true; 
     } 
     return iscontain; 
    } 

我試圖通過谷歌解決問題,但沒有任何幫助! P:我有許多其他方法正在做同樣的工作,即從SQLite數據庫讀取數據,並且它們都正常工作。該錯誤僅在此方法中才會出現。

編輯:此方法能正常工作

public String[] getmodMed(long l) { 
     String[] modalation_med = new String[] { MOD_ID, MOD_MEDICINE}; 
     Cursor c19 = ourDatabase.query(DATABASE_TABLE18, modalation_med, MOD_ID + "='" + l + "'" , null, null, null, null); 
     String mod_medicine[]= new String[c19.getCount()]; 
     int imodmedicine = c19.getColumnIndex(MOD_MEDICINE); 
     if(c19 != null){ 
      c19.moveToFirst(); 
      while(!c19.isAfterLast()) { 
       for(int i =0; i< c19.getCount(); i++) { 
       mod_medicine[i]= c19.getString(imodmedicine); 
       c19.moveToNext(); 
       } } 
     } 
     return mod_medicine; 
    } 

回答

0

這是因爲這行代碼:

public void close() { 
ourHelper.close(); 
} 

您關閉數據庫,然後想再次訪問它。

+0

如果是這樣的問題,則是m用來讀取來自同一DB數據不能正常工作的其他方法。對? – Yamna 2014-11-04 15:30:08

+0

好吧,如果您用此方法關閉數據庫,然後嘗試使用任何其他方法訪問它,問題就會發生。 嘗試評論ourHelper.close();並看看會發生什麼 – SteBra 2014-11-04 15:32:18

+0

好吧,讓我檢查! – Yamna 2014-11-04 15:32:52

0

我們需要看到更多的代碼,特別是「ourDatabase」。這聽起來像是在你運行該方法之前它已經關閉了。嘗試添加SQLiteDatabase DB = ourHelper.getWriteableDatabase您查詢權之前,然後運行對「DB」查詢

public boolean mod_app_symps(String l, String modfinalMed) { 
    SQLiteDatabase db = outHelper.getWriteableDatabase(); 
    String[] modalation = new String[] { MOD_ID, MOD_MEDICINE }; 
    Cursor c24; 
    boolean iscontain = false; 
    c24 = db.query(DATABASE_TABLE18, modalation, "modalation_previousss_id = ? AND modalation_medicine = ?",new String[] { l , modfinalMed } , null, null, null); 
    if(c24.getCount() > 0) { 
     iscontain = true; 
    }   
    return iscontain; 
} 
相關問題