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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
#1

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

09.04.2015, 18:03. Просмотров 2639. Ответов 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
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2015, 18:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос "Attempt to re-open an already-closed object" при работе с SQLite (Программирование Android):

При нажатии на кнопку выходит ошибка "Attempting to invoke method on a null object reference" - Программирование Android
Доброго дня! Есть вот этот код. При нажатии на кнопку Add выдает Attempting to invoke interface method java.sql.Statement...

SQLite, ошибка: не существует поля "почта" в базе данных - Программирование Android
Создал самую простую программку для понимания баз данных SQLite. Есть два поля: имя и почта. 3 кнопки: добавить в базу данных, считать с...

Двухуровневый список выбора (Spinner) "Страна->Город" c применением SQLite - Программирование Android
Подскажите пожалуйста в каком виде создавать данные в БД и как правильно переработать файлы чтоб выводить список стран и городов черпая...

Ошибка Attempt to invoke virtual method on a null object reference - Программирование Android
Здравствуйте, создаю приложение, которое работает с firebase. При отправке сообщения приложение вылетает public class Tab3Activity...

Ошибка Attempt to invoke virtual method on a null object reference - Программирование Android
Выдает ошибку. Никак не могу понять в чем проблема. Помогите плиз. Лог ошибки: Caused by: java.lang.NullPointerException: Attempt to...

"Синхронизация" баз SQLite двух устройств - Программирование Android
Добрый вечер, у меня такой вопрос к знатокам: возможно ли реализовать "синхронизацию" между двумя устройствами, имеющих отличные друг от...

41
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
11.04.2015, 13:59  [ТС] #31
Armagedo, вот, пожалуйста. Проект пишется на андроид студио, если что.
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
11.04.2015, 16:37 #32
Цитата Сообщение от Naomis Посмотреть сообщение
EVENT_COLUMN_MEETING + " integer" +
А запятые кто будет проставлять?
1
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
11.04.2015, 20:12  [ТС] #33
Rube, осознал ошибку, проставил запятые...
Java
1
2
3
4
5
6
7
8
  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" +
                    ");";
Но лог вот такой. По прежнему не видит/ не находит столбцы.
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
04-11 20:00:44.220  29001-29001/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ЗАПИСЬ В ТАБЛИЦУ ---- db.addRec("event", DB.EVENT_COLUMN_MAN, cManID ); ---
04-11 20:00:44.270  29001-29001/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ОК
04-11 20:00:44.270  29001-29001/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ЗАПИСЬ В ТАБЛИЦУ ---- db.addRec("event", DB.EVENT_COLUMN_MEETING, cMeetID ); ---
04-11 20:00:44.270  29001-29001/com.example.kirukato.coolstdreg E/SQLiteLog﹕ (1) table event has no column named MeetingId
04-11 20:00:44.270  29001-29001/com.example.kirukato.coolstdreg E/SQLiteDatabase﹕ Error inserting MeetingId=1
    android.database.sqlite.SQLiteException: table event has no column named MeetingId (code 1): , while compiling: INSERT INTO event(MeetingId) VALUES (?)
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
            at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
            at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
            at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
            at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
            at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1475)
            at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1347)
            at com.example.kirukato.coolstdreg.DB.addRec(DB.java:112)
            at com.example.kirukato.coolstdreg.EventActivity$1.onClick(EventActivity.java:133)
            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)
Заметил, что FATAL EXCEPTION: main происходет после "D/on pause﹕ /" Предполагаю, что моей программе не хватает onResume().
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
04-11 20:02:53.588  29001-29001/com.example.kirukato.coolstdreg W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x4154d8b0)
04-11 20:02:53.588  29001-29001/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:152)
            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
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
11.04.2015, 20:20 #34
Цитата Сообщение от Naomis Посмотреть сообщение
Armagedo, вот, пожалуйста. Проект пишется на андроид студио, если что.
В архиве по ссылке - только манифест 1,5кБ...
0
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
11.04.2015, 20:32  [ТС] #35
Armagedo, нужно скачать, при просмотре почему то такая проблема.

Добавлено через 10 минут
Поставил onResume и ошибка FATAL EXCEPTION: main больше не появлялась. Пока не появлялась.
Java
1
2
3
4
5
protected void onResume() {
        super.onResume();
        db.open();
        Log.d(TAG, " onResume()");
    }
Сей час попробую настроить вывод данных из БД, что бы посмотреть действительно ли не вливаются данные в БД. Так как лог отдно и тоже пишет, что:
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
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
04-11 20:19:34.245  30520-30520/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ЗАПИСЬ В ТАБЛИЦУ ---- db.addRec("event", DB.EVENT_COLUMN_MAN, cManID ); ---
04-11 20:19:34.286  30520-30520/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ОК
04-11 20:19:34.286  30520-30520/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ЗАПИСЬ В ТАБЛИЦУ ---- db.addRec("event", DB.EVENT_COLUMN_MEETING, cMeetID ); ---
04-11 20:19:34.286  30520-30520/com.example.kirukato.coolstdreg E/SQLiteLog﹕ (1) table event has no column named MeetingId
04-11 20:19:34.286  30520-30520/com.example.kirukato.coolstdreg E/SQLiteDatabase﹕ Error inserting MeetingId=3
    android.database.sqlite.SQLiteException: table event has no column named MeetingId (code 1): , while compiling: INSERT INTO event(MeetingId) VALUES (?)
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
            at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
            at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
            at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
            at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
            at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1475)
            at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1347)
            at com.example.kirukato.coolstdreg.DB.addRec(DB.java:112)
            at com.example.kirukato.coolstdreg.EventActivity$1.onClick(EventActivity.java:133)
            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)
04-11 20:19:34.286  30520-30520/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ОК
04-11 20:19:34.286  30520-30520/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ЗАПИСЬ В ТАБЛИЦУ ---- db.addRec("event", DB.EVENT_COLUMN_EVENT_TYPE, cETID ); ---
04-11 20:19:34.286  30520-30520/com.example.kirukato.coolstdreg E/SQLiteLog﹕ (1) table event has no column named EventTypeId
04-11 20:19:34.286  30520-30520/com.example.kirukato.coolstdreg E/SQLiteDatabase﹕ Error inserting EventTypeId=1
    android.database.sqlite.SQLiteException: table event has no column named EventTypeId (code 1): , while compiling: INSERT INTO event(EventTypeId) VALUES (?)
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
            at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
            at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
            at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
            at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
            at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1475)
            at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1347)
            at com.example.kirukato.coolstdreg.DB.addRec(DB.java:112)
            at com.example.kirukato.coolstdreg.EventActivity$1.onClick(EventActivity.java:137)
            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)
04-11 20:19:34.286  30520-30520/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ОК
04-11 20:19:34.286  30520-30520/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ЗАПИСЬ В ТАБЛИЦУ ЧЕКБОКСИКА ---- ---
04-11 20:19:34.296  30520-30520/com.example.kirukato.coolstdreg E/SQLiteLog﹕ (1) table event has no column named Value
04-11 20:19:34.296  30520-30520/com.example.kirukato.coolstdreg E/SQLiteDatabase﹕ Error inserting Value=1
    android.database.sqlite.SQLiteException: table event has no column named Value (code 1): , while compiling: INSERT INTO event(Value) VALUES (?)
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
            at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
            at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
            at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
            at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
            at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1475)
            at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1347)
            at com.example.kirukato.coolstdreg.DB.addRec(DB.java:112)
            at com.example.kirukato.coolstdreg.EventActivity$1.onClick(EventActivity.java:145)
            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)
04-11 20:19:34.296  30520-30520/com.example.kirukato.coolstdreg V/EVENT__ACTIVITY﹕ ОК---1
04-11 20:20:34.330  30520-30520/com.example.kirukato.coolstdreg D/on pause﹕ /
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
11.04.2015, 20:36 #36
Naomis, в IDEA сходу не раскрутился у меня, а времени разбирать шо к чему не особо.

Проскочил по файлам и в EventActivity

Java
1
2
3
4
5
6
 public void onPause()
    {
        super.onPause();
        Log.d("on pause", " / ");
        db.close();
    }
Зачем?

Добавлено через 1 минуту
Ну, если есть желание, то отслеживай закрытие-открытие базы
0
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
11.04.2015, 20:52  [ТС] #37
Armagedo, то есть эта вещь теперь совсем не нужна?
Java
1
2
3
4
5
6
 public void onPause()
    {
        super.onPause();
        Log.d("on pause", " / ");
        db.close();
    }
Главный вопрос теперь что с данными в базе?.. Почему лог постоянно говорит нечто подобное?
Prolog
1
2
E/SQLiteLog﹕ (1) table event has no column named EventTypeId
E/SQLiteDatabase﹕ Error inserting EventTypeId=1
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
11.04.2015, 20:58 #38
Цитата Сообщение от Naomis Посмотреть сообщение
Armagedo, то есть эта вещь теперь совсем не нужна?
я ж вчера написал и сутра повторил

Цитата Сообщение от Armagedo Посмотреть сообщение
Возможно ты где-то в коде еще закрываешь базу.
Цитата Сообщение от Naomis Посмотреть сообщение
Главный вопрос теперь что с данными в базе?.. Почему лог постоянно говорит нечто подобное?
Постараюсь завтра сутра раскрутить твой проект у себя и погонять.
Но не гарантирую - сам понимаешь, когда на кону стоит водка с закуской
1
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
11.04.2015, 21:06  [ТС] #39
Armagedo, конечно понимаю, тут всё на добровольной основе. Просто у меня сроки поджимают, так как сдача диплома всё ближе и ближе , и любая помощь мне как нельзя кстати. Я очень благодарен всем, кто мне хоть как-то старался помочь. На сколько я понимаю ошибка "attempt to re-open an already-closed object" была решена, теперь нужно решить проблему с "android.database.sqlite.SQLiteException: table event has no column named", а для этого нужно думаю создать новую тему, что бы не путать людей. Ещё раз спасибо большое.
0
vindigo
20 / 20 / 3
Регистрация: 15.05.2014
Сообщений: 80
12.04.2015, 08:09 #40
Интересно тут у вас
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
12.04.2015, 09:59 #41
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Naomis, весь твой головняк из-за невнимательности.
Объясняю

Java
1
2
3
4
5
6
7
8
 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" +
                    ");";
плюс

Java
1
db.execSQL(EVENT_DB_CREATE);
создаё таблицу следующей структуры

_id | integer primary key autoincrement
ManId | integerMeetingId integerEventTypeId integerValue integer
И естественно в этой таблице нет полей ни MeetingId, ни EventTypeId, ни Value.

Ты можешь возразить, дескать, какого х№, такая таблица вообще создалась с таким типом поля! и куда смотрит прогрессивная общественность?

И тут ты идёшь смотреть спецификацию SQLite и находшь
2.1 Determination Of Column Affinity

The affinity of a column is determined by the declared type of the column, according to the following rules in the order shown:

1. If the declared type contains the string "INT" then it is assigned INTEGER affinity.


2. If the declared type of the column contains any of the strings "CHAR", "CLOB", or "TEXT" then that column has TEXT affinity. Notice that the type VARCHAR contains the string "CHAR" and is thus assigned TEXT affinity.

3. If the declared type for a column contains the string "BLOB" or if no type is specified then the column has affinity NONE.

4. If the declared type for a column contains any of the strings "REAL", "FLOA", or "DOUB" then the column has REAL affinity.

Otherwise, the affinity is NUMERIC.

Note that the order of the rules for determining column affinity is important. A column whose declared type is "CHARINT" will match both rules 1 and 2 but the first rule takes precedence and so the column affinity will be INTEGER.
Т.е. типом ты можешь пытаться указать любой набор буков, но, как тольковстретится подходящее по вышеуказанным правилам, тип поля будет выбран автоматически.

Что у тебя и случилось - несмотря на заявленный добой для типа поля набор "integerMeetingIdintegerEventTypeIdintegerValueinteger", SQLite находит там "int" и для себя считает это поле типа INTEGER.
Для него всё просто и понятно и он даже не подумал ругаться, а просто взял и создал вот такую таблицу.

А ты сиди и жди когда там появится поле MeetingId или EventTypeId или Value.

Камрад Rube заметил некоторую неточность

Цитата Сообщение от Rube Посмотреть сообщение
А запятые кто будет проставлять?
Ты тут же отрапортовал

Цитата Сообщение от Naomis Посмотреть сообщение
Rube, осознал ошибку, проставил запятые...
Java
1
2
3
4
5
6
7
8
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" +
* * * * * * * * * * ");";
И теоретически это попытка выполнения следующего запроса

create table event(_id integer primary key autoincrement, ManId integer,MeetingId integer,EventTypeId integer,Value integer);
И, если бы была возможность - Андрюха завершил бы программу и ругнулся на недопустимый синтаксис.
Но он этого не сделал.

Почему?
Дык потому, что при создании объекта твоего класса DBHelper (наследника SQLiteOpenHelper) система посмотрела, что
1. База уже существует, а значит никаких onCreate вызывать не нужно будет.
2. Её версия осталсь прежней, а значит никаких изменений вноситься не должно, и никакие onUpgrade и onDowngrade вызывать также.

Поэтому все изменения внесённые в EVENT_DB_CREATE нигде не используются и база, как была так и осталась со старой таблицей event, но опяь же без полей MeetingId или EventTypeId или Value.

"Короче, Склифосовский"(с)

Чтобы подправить твою базу "на лету":

1. Добавляем пробелы после запятых
Java
1
2
3
4
5
6
7
8
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" +
* * * * * * * * * * ");";
2. Изменяем номер версии на больший, например, 2.
Java
1
private static final int DB_VERSION = 2;
3. Прописываем перtсоздание таблицы value в onUpgrade
Java
1
2
3
4
5
@Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL(EVENT_DB_CREATE);
 
        }
4. ПИЛЯТЪ , убери же наконец
Java
1
2
3
4
5
6
 public void onPause()
    {
        super.onPause();
        Log.d("on pause", " / ");
        db.close();
    }
ВСЁ! Бей яйца и разговляйся. Только аккуратно, синька - зло
1
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
12.04.2015, 13:19  [ТС] #42
Armagedo, чёрт возьми! Категорически тебе благодарствую. Всё исправил! Но обновить БД по методу onUpgrade не получилось, программа начала ругаться и вылетать при любом телодвижении. Решил дело просто, снёс прогу и поставил заново. Теперь всё работает и пишет, не вылетает и логами не ругается, но есть ощущение, что добавление какое-то не верное, но это уже совсем другая песня. Категорически спасибо Armagedo и всем кто помогал. А мы пойдём дальше думать, работа только в самом разгаре.

Armagedo, точно-точно, синька-зло.
0
12.04.2015, 13:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2015, 13:19
Привет! Вот еще темы с ответами:

SQLite, отношение "один ко многим" - Программирование Android
Добрый день! Имеется такая задача: Создаю в SQLite две таблицы - &quot;Кинотеатры&quot;, &quot;Фильмы&quot;. У фильма есть параметр - в каких...

При эмулировании вместо надписи "Hello world" отображается "android" - Программирование Android
Привет форумчане! Я только-только начинал программировать на андроиде. Поставил среду, все настроил как на google.developers . Когда...

Обработка событий при работе с sqlite - Программирование Android
Добрый день, утоните пожалуйста как правильно отработать событие. При обработке SQL запроса если после условия WHERE = идет...

Работа с БД, связывание таблиц "фильмы", "жанры", "режиссеры" - Программирование Android
Ребят, всем привет! накидайте какие-нить идеи по реализации ситуация такая есть таблицы - &quot;списки_жанров&quot;, &quot;фильмы&quot;, &quot;режиссеры&quot; мне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.