2014-11-04 46 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; 
} 
相关问题