Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

"Attempt to re-open an already-closed object" при работе с SQLite - Программирование Android

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Android и джойстик http://www.cyberforum.ru/android-dev/thread1416961.html
Всем привет Я создаю игру что то наподобие "alien shooter" и управлять героем с экрана как то не очень удобно и вот хочу в проекте реализовать поддержку джойстика. А как его подключать и что для...
Программирование Android Синхронизация баз данных на клиенте и сервере Здравствуйте, подскажите как реализовать простенькое клиент-серверное приложение в котором при редактировании бд сервера автоматически будет менятся бд клиента на устройстве (я понял так выглядит... http://www.cyberforum.ru/android-dev/thread1416904.html
Изменить голубой цвет "список закончился" Программирование Android
Не знаю у кого как, но у меня при листании за пределы списка появляется голубая "туманная полоска" с той стороны где она закончилась (списки сверху вниз, табы справа-налево). Могу ее полностью...
Программирование Android Режим полета - перехват изменения, включение, отключение
Помогите! Кто что знает, слышал, писал... Поможет все! Кнопка случайно нажимается и... я вне связи! И даже не знаю об этом! Есть ли ресиверы? Можно ли узнавать по таймеру функцией? Можно ли...
Программирование Android Получить отдельный кадр с камеры http://www.cyberforum.ru/android-dev/thread1416836.html
У меня идет захват видео через камеру. Но мне нужно анализировать из этого видео кадры. Как правильно сохранять каждый кадр видео с камеры?? Какая есть для этого структура?? Можете написать фрагмент...
Программирование Android Debugger, как правильно с ним работать? День добрый. Подключаю свой девайс к компьютеру, Android Studio его видит. В режиме дебагинга выбираю запустить приложение на моём устройстве. Ранее никаких проблем не было и приложение всегда... подробнее

Показать сообщение отдельно
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1

"Attempt to re-open an already-closed object" при работе с SQLite - Программирование Android

09.04.2015, 18:03. Просмотров 2461. Ответов 41
Метки (Все метки)

Добрый день. Разрабатываю приложение и столкнулся с проблемой... Лог выдаёт вот такое:

FATAL EXCEPTION: main
java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase:

Понапихал Log.v всюду, чтобы разобраться, но ни как, мой уровень не позволяет.
Ясное дело гуглил, но либо я дурак, либо лыжи... Так что взываю о помощи к вам. В заранее спасибо.


Та самая проблемная активити.
EventActivity.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event);
 
        Log.v(TAG, "ОТКРЫВАЕМ ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ" );
 
        // открываем подключение к БД
        db = new DB(this);
        db.open();
 
        Log.v(TAG, "ОК- ОТКРЫЛИ" );
 
        // РАСКРЫВАЮЩИЕСЯ СПИСОКИ
 
        edtMan = (Spinner) findViewById(R.id.ManSpinner);
        edtET = (Spinner) findViewById(R.id.ETSpinner);
        edtMeet = (Spinner) findViewById(R.id.MeetingSpinner);
 
        //СПИНЕРЫ MAN - EVENT TYPE - MEET
        CreatNewSpinnerFU("man", "name", edtMan);
        CreatNewSpinnerFU("event_type", "name", edtET);
        CreatNewSpinnerFU("meeting", "name", edtMeet);
 
 
        checkboxEvent = (CheckBox) findViewById(R.id.checkBox);
 
        Log.v(TAG, "ЖДЁМ 'ТЫК' КНОПКИ" );
 
        btnEvent  = (Button) findViewById(R.id.new_event_in_tab);
        btnEvent.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Do something in response to button click
 
                boolean checkMan= !true,
                        checkET = !true,
                        checkMeet = !true;
 
                Log.v(TAG, "ТЫК!" );
 
                //checkMan = !true; checkET = !true; checkMeet = !true;
 
                Log.v(TAG, "РАБОТАЕ С МАНАМИ --- if (edtMan.getSelectedItem() != null) ---" );
 
                if (edtMan.getSelectedItem() != null)
                {
                    Log.v(TAG, "----if МЫ ВНУТРИ  -----" );
                    Log.v(TAG, "----if -----   checkMan = true;" );
                    checkMan = true;
                    Log.v(TAG, "----if -----   checkMan = true;-- ОК" );
 
 
                    Log.v(TAG, "----if----- ПРИСВАИВАЕМ КУРСОРУ  cur = db.GetCatalogValueByName(.........);" );
                    cur = db.GetCatalogValueByName("man", "_id", "name", edtMan.getSelectedItem().toString());
                    Log.v(TAG, "----if----- ПРИСВАИВАЕМ КУРСОРУ  cur = db.GetCatalogValueByName(.........);-------ОК" );
 
                    Log.v(TAG, "----if-----   ПРИСВАИВАЕМ _id ---- cManID = cur.getInt(...._id\")-----" );
                    cManID = cur.getInt(cur.getColumnIndex("_id"));
                    Log.v(TAG, "----if-----   ПРИСВАИВАЕМ _id ---- cManID = cur.getInt(...._id\")-----ОК" );
                    //db.addRec("event", DB.EVENT_COLUMN_MAN, cManID );
                }
 
                Log.v(TAG, "РАБОТАЕ С EВЕНТ ТАЙПОМ --- if (edtET.getSelectedItem() != null) ---" );
                if (edtET.getSelectedItem() != null)
                {
                    checkET = true;
                    cur = db.GetCatalogValueByName("event_type", "_id", "FullName", edtET.getSelectedItem().toString());
                    cETID = cur.getInt(cur.getColumnIndex("_id"));
                    //db.addRec("event", DB.EVENT_COLUMN_EVENT_TYPE, cETID );
                }
 
                Log.v(TAG, "РАБОТАЕ С МИТОМ --- if (edtMeet.getSelectedItem() != null) ---" );
                if (edtMeet.getSelectedItem() != null)
                {
                    checkMeet = true;
                    cur = db.GetCatalogValueByName("event_type", "_id", "FullName", edtMeet.getSelectedItem().toString());
                    cMeetID = cur.getInt(cur.getColumnIndex("_id"));
                    //db.addRec("event", DB.EVENT_COLUMN_MEETING, cMeetID );
                }
 
                Log.v(TAG, "ПРОВЕРЯЕМ ФЛАГИ НА 'TRUE' ПОСЛЕ ПИШЕМ В ТАБЛИЦУ 'event' --- if(checkMan != false & checkET != false & checkMeet != false) ---" );
 
                //Если все значения true, то записываем данные в таблицу "event"
                if(checkMan != false & checkET != false & checkMeet != false){
 
                    Log.v(TAG, "ЗАПИСЬ В ТАБЛИЦУ ---- db.addRec(\"event\", DB.EVENT_COLUMN_MAN, cManID ); ---" );
                    db.addRec("event", DB.EVENT_COLUMN_MAN, cManID );
                    Log.v(TAG, "ОК" );
 
                    Log.v(TAG, "ЗАПИСЬ В ТАБЛИЦУ ---- db.addRec(\"event\", DB.EVENT_COLUMN_EVENT_TYPE, cETID ); ---" );
                    db.addRec("event", DB.EVENT_COLUMN_EVENT_TYPE, cETID );
                    Log.v(TAG, "ОК" );
 
                    Log.v(TAG, "ЗАПИСЬ В ТАБЛИЦУ ЧЕКБОКСИКА ---- ---" );
                    db.addRec("event", DB.EVENT_COLUMN_MEETING, cMeetID );
 
                    if (checkboxEvent.isChecked() == true) {
                        db.addRec("event", DB.EVENT_COLUMN_VALUE, 1 );
                        Log.v(TAG, "ОК---1" );
 
                    }else {
                        db.addRec("event", DB.EVENT_COLUMN_VALUE, 0 );
                        Log.v(TAG, "ОК---0" );
                    }
 
                }
 
 
            }
        });
        db.close();
    }
//СОЗДАНИЕ SPINNER
    public void CreatNewSpinnerFU(String name_table, String name_column, Spinner qwerty) {
        List ListArray = new ArrayList();
        Cursor Post = db.GetCatalogByName(name_table);
        Post.moveToFirst();
 
        if (Post != null && Post.getCount() > 0) {
            do {
                ListArray.add(Post.getString(Post.getColumnIndex(name_column)));
            } while (Post.moveToNext());
 
            ArrayAdapter dataAdapterPost = new ArrayAdapter(this, android.R.layout.simple_spinner_item, ListArray);
            dataAdapterPost.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            qwerty.setAdapter(dataAdapterPost);
        }
    }

Класс с базой данных.
BD.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
public class DB {
 
    private static final String TAG = "DB__ACTIVITY";
 
 
    private static final String DB_NAME = "Allreg";
    private static final int DB_VERSION = 1;
    //man
    private static final String DB_TABLE = "man";
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_NAME = "name";
 
    private static final String DB_CREATE =
            "create table " + DB_TABLE + "(" +
                    COLUMN_ID + " integer primary key autoincrement, " +
                    COLUMN_NAME + " text" +
                    ");";
 
    //event type
    private static final String EVENT_TYPE_TABLE = "event_type";
    public static final String EVENT_TYPE_COLUMN_ID = "_id";
    public static final String EVENT_TYPE_COLUMN_NAME = "name";
 
    private static final String EVENT_TYPE_DB_CREATE =
            "create table " + EVENT_TYPE_TABLE + "(" +
                    EVENT_TYPE_COLUMN_ID + " integer primary key autoincrement, " +
                    EVENT_TYPE_COLUMN_NAME + " text" +
                    ");";
 
    //meeting
    private static final String MEETING_TABLE = "meeting";
    public static final String MEETING_COLUMN_ID = "_id";
    public static final String MEETING_COLUMN_NAME = "name";
 
    private static final String MEETING_DB_CREATE =
            "create table " + MEETING_TABLE + "(" +
                    MEETING_COLUMN_ID + " integer primary key autoincrement, " +
                    MEETING_COLUMN_NAME + " text" +
                    ");";
 
    //event
    private static final String EVENT_TABLE = "event";
    public static final String EVENT_COLUMN_ID = "_id";
    public static final String EVENT_COLUMN_MAN = "ManId";
    public static final String EVENT_COLUMN_MEETING = "MeetingId";
    public static final String EVENT_COLUMN_EVENT_TYPE = "EventTypeId";
    public static final String EVENT_COLUMN_VALUE = "Value";
 
    private static final String EVENT_DB_CREATE =
            "create table " + EVENT_TABLE + "(" +
                    EVENT_COLUMN_ID + " integer primary key autoincrement, " +
                    EVENT_COLUMN_MAN + " integer" +
                    EVENT_COLUMN_MEETING + " integer" +
                    EVENT_COLUMN_EVENT_TYPE + " integer" +
                    EVENT_COLUMN_VALUE + " integer" +
                    ");";
 
    private final Context mCtx;
 
 
    private DBHelper mDBHelper;
    private SQLiteDatabase mDB;
 
    public DB(Context ctx) {
        mCtx = ctx;
    }
 
    // открыть подключение
    public void open() {
        mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);
        mDB = mDBHelper.getWritableDatabase();
    }
 
    // закрыть подключение
    public void close() {
        if (mDBHelper!=null) mDBHelper.close();
    }
 
    // получить все данные из таблицы DB_TABLE
    public Cursor getAllData(String name_DB) {
        String str = name_DB;
        return mDB.query(str, null, null, null, null, null, null);
    }
 
    // удалить запись из DB_TABLE
    //-----------------------------------поправить работу с _id
    public void delRec(String name_DB , String column_id , long id) {
        String str = name_DB;
        String col_id = column_id;
        mDB.delete(name_DB, col_id + " = " + id, null);
    }
 
    // ФУНКЦИЯ РАБОТЫ С БД
    // ПОЛУЧЕНИЕ СПРАВОЧНИКА ПО ИМЕНИ
    public Cursor GetCatalogByName(String FullName)
    {
        Cursor cur = mDB.rawQuery("select * from " + FullName.toString() , null);
        cur.moveToFirst();
        return cur;
    }
 
    // ПОЛУЧЕНИЕ ПОЛЯ В СПРАВОЧНИКЕ ПО ИМЕНИ ПОЛЯ И СПРАВОЧНИКА
    public Cursor GetCatalogValueByName(String CatalogFullName,
                                        String FieldFullName,
                                        String ConditionField,
                                        String Value)
    {
        //Open();
 
        Log.v(TAG, "----МЫ В GetCatalogValueByName----");
 
        Log.v(TAG,"---ПРОСМОТР ПОСТУПАЮЩИХ ДАННЫХ." + " select " + FieldFullName + " from " + CatalogFullName +
                " where " + ConditionField + " = '" + Value + "'" );
 
        Cursor cur = mDB.rawQuery(" select " + FieldFullName +
                " from " + CatalogFullName +
                " where " + ConditionField + " = '" + Value + "'"
                , null);
 
        Log.v(TAG, " select " + FieldFullName +
                " from " + CatalogFullName +
                " where " + ConditionField + " = '" + Value + "'");
 
        cur.moveToFirst();
        //Close();
 
        Log.v(TAG, cur.getCount() + "");
 
        return cur;
    }
 
    // класс по созданию и управлению БД
    private class DBHelper extends SQLiteOpenHelper {
 
        public DBHelper(Context context, String name, CursorFactory factory,
                        int version) {
            super(context, name, factory, version);
        }
 
        // создаем и заполняем БД
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(DB_CREATE);
            db.execSQL(EVENT_TYPE_DB_CREATE);
            db.execSQL(MEETING_DB_CREATE);
            db.execSQL(EVENT_DB_CREATE);
 
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }
}



И сам лог
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
04-09 15:46:08.708  10679-10679/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ОТКРЫВАЕМ ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ
04-09 15:46:08.728  10679-10679/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ОК- ОТКРЫЛИ
04-09 15:46:08.728  10679-10679/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ЖДЁМ 'ТЫК' КНОПКИ
04-09 15:46:12.092  10679-10679/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ТЫК!
04-09 15:46:12.092  10679-10679/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ РАБОТАЕ С МАНАМИ --- if (edtMan.getSelectedItem() != null) ---
04-09 15:46:12.092  10679-10679/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ----if МЫ ВНУТРИ  -----
04-09 15:46:12.092  10679-10679/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ----if -----   checkMan = true;
04-09 15:46:12.092  10679-10679/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ----if -----   checkMan = true;-- ОК
04-09 15:46:12.092  10679-10679/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ----if----- ПРИСВАИВАЕМ КУРСОРУ  cur = db.GetCatalogValueByName(.........);
04-09 15:46:12.092  10679-10679/com.example.kirukato.coolstdreg V/DB__ACTIVITY﹕ ----МЫ В GetCatalogValueByName----
04-09 15:46:12.092  10679-10679/com.example.kirukato.coolstdreg V/DB__ACTIVITY﹕ ---ПРОСМОТР ПОСТУПАЮЩИХ ДАННЫХ.
    select _id from man where name = 'Вася '
04-09 15:46:12.092  10679-10679/com.example.kirukato.coolstdreg D/AndroidRuntime﹕ Shutting down VM
04-09 15:46:12.092  10679-10679/com.example.kirukato.coolstdreg W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x4154d8b0)
04-09 15:46:12.102  10679-10679/com.example.kirukato.coolstdreg E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.example.kirukato.coolstdreg/databases/Allreg
            at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
            at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1318)
            at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1261)
            at com.example.kirukato.coolstdreg.DB.GetCatalogValueByName(DB.java:154)
            at com.example.kirukato.coolstdreg.EventActivity$1.onClick(EventActivity.java:96)
            at android.view.View.performClick(View.java:4421)
            at android.view.View$PerformClick.run(View.java:17903)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:213)
            at android.app.ActivityThread.main(ActivityThread.java:5225)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
            at dalvik.system.NativeStart.main(Native Method)
Программа не вся, так как тут есть ограничение по символам. Надеюсь на вашу помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru