2

在我的应用程序中sqlite Database,当我运行应用程序 Logcat 时显示我

close() was never explicitly called on database '/data/data/com.MAT.CanadaImmigrationApp/databases/CanadaianImmigrationApp' 
E/Database(13822): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

我在谷歌上搜索,我发现

db.close();  // to close your Database,
cur.close();     //to close your cursor

但是我不知道在哪里添加此代码?

DbHelper.class

public class DbHelper extends SQLiteOpenHelper {
// Database attributes

public static final String DB_NAME = "DB_NAME";
public static final int DB_VERSION = 1;

public static final String TABLE_QUESTIONS = "Questions_Answers";
public static final String COLUMN_CHAPTERS = "Chapters";
public static final String COLUMN_QUESTIONS = "Question";
public static final String COLUMN_CORRECT_ANSWER = "Correct_Answer";
public static final String COLUMN_OPT1 = "Answer1";
public static final String COLUMN_OPT2 = "Answer2";
public static final String COLUMN_OPT3 = "Answer3";

public DbHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {


    String createTable = "create table if not exists " + TABLE_QUESTIONS + " ( " + BaseColumns._ID + " integer primary key autoincrement, " 
                                                            + COLUMN_CHAPTERS + " text not null, "
                                                            + COLUMN_QUESTIONS + " text not null, "
                                                            + COLUMN_CORRECT_ANSWER + " text not null, "
                                                            + COLUMN_OPT1 + " text not null, "
                                                            + COLUMN_OPT2 + " text not null, "
                                                            + COLUMN_OPT3 + " text not null);";

    // Execute a single SQL statement that is NOT a SELECT or any other SQL statement that returns data.
    db.execSQL(createTable);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS "+ TABLE_QUESTIONS);
    onCreate(db);
}

}

Db_Adapter.class

 public class Db_Adapter  {

public static final String TABLE_QUESTIONS = "Questions_Answers";
public static final String COLUMN_CHAPTERS = "Chapters";
public static final String COLUMN_QUESTIONS = "Question";
public static final String COLUMN_CORRECT_ANSWER = "Correct_Answer";
public static final String COLUMN_OPT1 = "Answer1";
public static final String COLUMN_OPT2 = "Answer2";
public static final String COLUMN_OPT3 = "Answer3";


public static  SQLiteDatabase databasesql;
private  DbHelper Android_OpenDb_Helper;
private   Context mycontext;

public static List<String> question_Set;
public static List<String> Answers_Set;
public static List<String> Option1;
public static List<String> Option2;
public static List<String> Option3;


public Db_Adapter( Context context)
{
    this.mycontext =context;
}
public void close() {
    Android_OpenDb_Helper.close();
  }

public DbHelper createDatabase()
{
    Android_OpenDb_Helper = new DbHelper(mycontext);
    databasesql = Android_OpenDb_Helper.getWritableDatabase();
    return Android_OpenDb_Helper;

} 

public long addToDB(String chapters, String question,
        String correctAnswer, String answer1, String answer2, String answer3)
{
    return databasesql.insert(TABLE_QUESTIONS,null, createContentValues(chapters,question,correctAnswer,answer1,answer2,answer3));
} 

  private ContentValues createContentValues(String chapters, String question,
        String correctAnswer, String answer1, String answer2, String answer3)
{
    ContentValues myContentVal =  new ContentValues();
    myContentVal.put(COLUMN_CHAPTERS, chapters);
    myContentVal.put(COLUMN_QUESTIONS, question);
    myContentVal.put(COLUMN_CORRECT_ANSWER, correctAnswer);
    myContentVal.put(COLUMN_OPT1, answer1);
    myContentVal.put(COLUMN_OPT2, answer2);
    myContentVal.put(COLUMN_OPT3, answer3);


    return myContentVal;
} 

public Cursor readData()
{
    return databasesql.query(TABLE_QUESTIONS, new String[]{COLUMN_CHAPTERS,COLUMN_QUESTIONS,COLUMN_CORRECT_ANSWER,COLUMN_OPT1,COLUMN_OPT2,COLUMN_OPT3}, null, null, null, null, null);
}

public Cursor getQuestion()
{
    return databasesql.query(TABLE_QUESTIONS, new String[]{COLUMN_QUESTIONS}, null, null, null, null, null); 
}

public Cursor getQuizQuestions(int numQ)
{
    return databasesql.rawQuery(
            "select * from "+ TABLE_QUESTIONS +" ORDER BY RANDOM() LIMIT "
                    + numQ, null);
}

public List<String> getQuestions(String difficulty) {

    question_Set = new ArrayList<String>();
    Answers_Set = new ArrayList<String>();

    Option1= new ArrayList<String>();
    Option2 = new ArrayList<String>();
    Option3 = new ArrayList<String>();



    Cursor c = databasesql.rawQuery(
            "select * from "+TABLE_QUESTIONS+" where CHAPTERS = ?",
            new String[] { difficulty });

    while (c.moveToNext()) {

        question_Set.add(c.getString(2).trim());
        Answers_Set.add(c.getString(3).trim());
        Option1.add(c.getString(4).trim());
        Option2.add(c.getString(5).trim());
        Option3.add(c.getString(6).trim());


    }

    return question_Set;
} 

public int DropTable()
{

    return databasesql.delete(TABLE_QUESTIONS, null, null);
} 

}

我称这种方法为:

获取问题:

Cursor cursor = DB_Adapter.getQuestion();     

对于获取插入:

DB_Adapter.addToDB(Chapters,Question,CorrectAnswer,Answer1,Answer2,Answer3);

请让我知道我应该在哪里添加db.close();cur.close();

谢谢。

4

4 回答 4

2

调用后: -

DB_Adapter.addToDB(Chapters,Question,CorrectAnswer,Answer1,Answer2,Answer3); 
**db.close();**
于 2012-11-06T10:34:40.137 回答
2

有两种方法可以关闭CursorDatabase object.

第一种方法 在使用后关闭两个对象。(即每当与您的光标相关的过程完成时)

第二种方式

将其添加到OnStop()或中onDestroy()

InOnStop()onDestroy()检查游标和数据库对象是否为空。如果没有,则关闭它。

public void onStop(){
 if(db!=null)
   {db.close();}
 if(cur!=null)
  { cur.close();}
}

它应该工作。

于 2012-11-06T10:35:07.123 回答
1

使用此方法创建数据库

我的构造函数

public DBClass(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
		
		this.context = context;
		
		
		
	
		
	}

@Override
	public void onCreate(SQLiteDatabase db) {
		
		context.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
		db.execSQL("CREATE TABLE IF NOT EXISTS prediction(country1 VARCHAR,Country2 VARCHAR,winner VARCHAR,pool VARCHAR);");
	}

然后在您的数据库访问函数中使用这些

public void databaseInsertOperations(String c1, String c2, String c3) {
		db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		cv.put(DBClass.COUNTRY_1, c1);
		cv.put(DBClass.COUNTRY_2, c2);
		cv.put(DBClass.WINNER, c3);
		db.insert(DBClass.TABLE, null, cv);
		db.close();
	}

	public ArrayList<String> databaseRetriveOperation() {

	
		db = this.getWritableDatabase();
		
		ArrayList<String> buffer = new ArrayList<String>();

cursor = db.rawQuery("select * from prediction", null);

		if (cursor.getCount() == 0) {
			System.out.println("Error No records found");

		} else {

			while (cursor.moveToNext()) {
				buffer.add(cursor.getString(0) + "/" + cursor.getString(1)
						+ "/" + cursor.getString(2));
			}
			
		}
		
		db.close();		cursor.close();
		return buffer;

	}

当我遇到此错误时为我解决了

于 2014-12-03T05:29:23.587 回答
0

试试这个场景:

当您想使用数据库帮助功能访问或触发任何查询时,请使用打开数据库。

使用该函数或查询后,请始终关闭该数据库。

例如:

db.open(); // function to open database for the use
db.YOUR_QUERY or ANY_FUNCTION
db.close();

数据库的打开和关闭用于以可写/可读等特定模式打开数据库并关闭它。

您可以在 databaseHelper 类中使用以下函数来打开和关闭数据库。

 //---opens the database---
public DBAdapter2 open() throws SQLException 
{
        db = DBHelper.getWritableDatabase();

    return this;
}

//---closes the database---    
public void close() 
{
    DBHelper.close();
}

希望它会帮助你。

更新

改变这个:

    question_Set.add(c.getString(2).trim());
    Answers_Set.add(c.getString(3).trim());
    Option1.add(c.getString(4).trim());
    Option2.add(c.getString(5).trim());
    Option3.add(c.getString(6).trim());

与以下:

        db.open();
    question_Set.add(c.getString(2).trim());
    db.close();
    db.open();
    Answers_Set.add(c.getString(3).trim());
    db.close();
    db.open();
    Option1.add(c.getString(4).trim());
    db.close();
    db.open();
    Option2.add(c.getString(5).trim());
    db.close();
    db.open();
    Option3.add(c.getString(6).trim());
    db.close();
于 2012-11-06T10:39:50.390 回答