2016-11-15 3 views
-1

Вот мой класс SQLiteHeler.java.android.database.sqlite.DatabaseObjectNotClosedException: приложение не закрыло объект курсора или базы данных, который был открыт здесь

//tables name in database 
public static final String TABLE_NAME="Favtable"; 

//common column for all table 
public static final String KEY_ID="id"; 
//column in alumnitable 
public static final String KEY_CID="Courseid"; 
public static final String KEY_FavStatus="Status"; 

public SQLiteHelper(Context context) { 

    super(context, DATABASE_NAME, null, 1); 
} 

//create tables 
@Override 
public void onCreate(SQLiteDatabase database){ 

    String CREATE_NAME="CREATE TABLE IF NOT EXISTS "+TABLE_NAME+" ("+KEY_ID+" INTEGER PRIMARY KEY,"+KEY_CID+" VARCHAR, "+KEY_FavStatus+" VARCHAR)"; 
    database.execSQL(CREATE_NAME); 
    database.close(); 

} 
public void InsertData(int Courseid,int flag) 
{ 
    Cursor cursor = null; 
    SQLiteDatabase database = this.getReadableDatabase(); 
    cursor.moveToFirst(); 
    SQLiteQuery = "INSERT INTO FavTable (Courseid,Status) VALUES('" + Courseid + "', '" + flag + "');"; 
    database.execSQL(SQLiteQuery); 
    database.close(); 
} 
public void close() { 
    if (database != null) { 
     database.close(); 
    } 
} 

@Override 
public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { 
    database.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME); 

    onCreate(database); 
} 

}

Что я делаю неправильно? Это дает ошибку как

_android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here_ 

И я назвал создавать и вставлять методы SQLiteHelper в моем классе Фрагмент путем создания объекта.

Это мой CourseFragment.java.here я звоню OnCreate и Вставить метод

alertDialogBuilder.setPositiveButton ("Да", новый DialogInterface.OnClickListener() {

        @Override 
            public void onClick(DialogInterface arg0, 
                 int arg1) { 
             flag = 1; 


             /*s1="true";*/ 
             Courseid = mCourse.getCourseid(); 

             mCourse.setIsFavCourse(!mCourse.getIsFavCourse()); 
             mCourse.save(); 

             // Update listview 
             mCourses.get(position).setIsFavCourse(
               mCourse.getIsFavCourse()); 
             courseListAdapter.notifyDataSetChanged(); 

           //Add courseid and status to database 
             favourite.onCreate(database); 
             favourite.InsertData(Courseid,flag); 

             // Start sync service for course 
             Intent i = new Intent(context, MDroidService.class); 

             i.putExtra("notifications", false); 
             i.putExtra("siteid", 
               session.getCurrentSiteId()); 
             i.putExtra("courseid", 
               mCourse.getCourseid()); 

             context.startService(i); 

            } 
           }); 
+2

Проверить это http://stackoverflow.com/questions/4734886/how-can-one-avoid-databaseobjectnotclosedexception – Raghavendra

+1

«Что я делаю неправильно?» Очень много всего. ** 1 ** - Вы вставляете ваши значения ** integer ** как ** строки **. ** 2 ** - Вы создаете ** бесполезный курсор **, который затем перемещается в первую запись (но он не связан с каким-либо набором записей), поскольку он все еще ** null **. ** 3 ** - И вы никогда не закрываете его. –

+2

«Курсор курсор = нуль» и «cursor.moveToFirst» не служат цели, и последнее может вызвать проблемы. Не то, чтобы эти две строки вызывали проблему. если, сказав, что я вызвал create_, вы вызвали 'onCreate', что этот метод автоматически вызывается, поэтому вы не должны называть его напрямую. – MikeT

ответ

0

После копирования и бега ваш код, а затем его изменение. Первичная/начальная проблема связана с закрытием базы данных при ее создании в методе onCreate помощника (прокомментирован в коде ниже).

Однако, согласно комментариям, существуют и другие проблемы, некоторые из которых разрешают следующий код. Следующий код работает (насколько решение вопроса, что вы в настоящее время есть): -

public class SQLiteHelper extends SQLiteOpenHelper { 

    public static final String DATABASE_NAME = "Courses"; 

    //tables name in database 
    public static final String TABLE_NAME="Favtable"; 

    //common column for all table 
    public static final String KEY_ID="_id"; 
    //column in alumnitable 
    public static final String KEY_CID="Courseid"; 
    public static final String KEY_FavStatus="Status"; 

    public SQLiteHelper(Context context) { 

     super(context, DATABASE_NAME, null, 1); 
    } 

    //create tables 
    @Override 
    public void onCreate(SQLiteDatabase database){ 

     String CREATE_NAME="CREATE TABLE IF NOT EXISTS "+TABLE_NAME+" ("+KEY_ID+" INTEGER PRIMARY KEY,"+KEY_CID+" VARCHAR, "+KEY_FavStatus+" VARCHAR)"; 
     database.execSQL(CREATE_NAME); 
     //database.close(); 

    } 
    public void InsertData(int Courseid,int flag) 
    { 
     SQLiteDatabase database = this.getWritableDatabase(); 
     String SQLiteQuery = "INSERT INTO FavTable (Courseid,Status) VALUES('" + Courseid + "', '" + flag + "');"; 
     database.execSQL(SQLiteQuery); 
    } 


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

Вот код/​​звонки, которые я использовал в своей деятельности: -

SQLiteHelper mydb = new SQLiteHelper(this); 
    mydb.InsertData(0,10); 
    mydb.close(); 

Вы не должны иметь эта строка в коде (как вывешено после того как я ответил): -

favourite.onCreate(database);

+0

Спасибо @MikeT сэр и Ротванг сэр за исправление моих ошибок. Спасибо снова. Помощь сработала: -): -) Помощь означает много для меня. Спасибо agian. –

Смежные вопросы