Сбой базы данных SQLite из-за повторного открытия уже закрытого объекта

#android #database #sqlite

#Android #База данных #sqlite

Вопрос:

У меня есть мой DatabaseHelper

 public class DatabaseHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "name";
private static final int DATABASE_VERSION = 1;

private static DatabaseHelper dbHelper;

private Context mTempCtx = null;

private DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    mTempCtx = context;
}


public static DatabaseHelper getInstance(Context context) {
    if (null == dbHelper) {
        dbHelper = new DatabaseHelper(context);
    }
    return dbHelper;
} 
...
  

Моя основная деятельность с вкладками

 import android.support.v7.app.ActionBarActivity;
public class MainActivity extends ActionBarActivity {

// private AdView mAdView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    DatabaseHelper.getInstance(getApplicationContext())
            .getWritableDatabase();

    ActionBar actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    ...
  

и фрагмент на первой вкладке

 import android.support.v4.app.Fragment;
public class CalendarFragment extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    ...
    Cursor cur = getActivity().getContentResolver().query(
            TABLE.CONTENT_URI, TABLE.PROJECTION, null, null, null);
  

Этот запрос делает мой

 06-18 08:21:05.854: E/AndroidRuntime(1023): Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteQuery: ...
  

Этот код работает на 4.2.2 и 4.3, 4.4, но я получаю сбой на 4.1 и 2.3.7. На данный момент, после прочтения нескольких руководств и вопросов здесь, он все еще не работал для меня.

Комментарии:

1. покажите больше кода, который написан внутри onCreateView() !

2. Есть только inflater, get ListView object from и setHasOptionsMenu(true); подробнее

Ответ №1:

если вы хотите выполнить какую-либо операцию с базой данных после db.close , вы должны вызвать db.getWritableDatabase() .

Комментарии:

1. Если я добавлю DatabaseHelper.getInstance(getApplicationContext()).getWritableDatabase(); к onCreateView во фрагменте, я все равно получаю ту же ошибку

2. для каждой операции с БД вам необходимо вызвать db.getWritableDatabase() и закрыть (db.close) после завершения процесса.

3. Я знаю, но все равно ничего не происходит. Почему его работа на 4.2.2 и сбой на 4.1?