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

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

Войти
Регистрация
Восстановить пароль
 
Tilesto
6 / 6 / 0
Регистрация: 14.05.2015
Сообщений: 145
Завершенные тесты: 2
#1

SQlite + курсор + ориентация - Программирование Android

11.08.2016, 02:49. Просмотров 390. Ответов 5
Метки нет (Все метки)

Всем добрый вечер. Хотя не совсем добрый (для меня).

Уже два часа безрезультатно пытаюсь решить проблему. Если в двух словах:

вылетает прога, когда я меняю ориентацию экрана.

Весь код скидывать думаю не надо, потому что ошибка где-то тут:

Java
1
2
3
4
5
6
@Override
                public Cursor runQuery(CharSequence constraint) {
 
                    if (constraint == null || constraint.length() == 0) {
                        return sqlHelper.database.rawQuery("select *   from " + DatabaseHelper.TABLE, null);
                    }
Ошибка:
FATAL EXCEPTION: main
Process: ru.tilesto.base, PID: 6119
java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteQuery: select * from users

Что-то не так с подключением/отключением бд. Не могу понять что именно, и тем более не могу понять какого дьявола это зависит от ориентации экрана. Все работает исправно, но стоит перевернуть, и все.

Помогите кто чем может)

Добавлено через 6 минут
P.S. хотя в коде тоже намутятил, скину фул. Надеюсь хоть что-нибудь кто-нибудь тут разберет)
Кликните здесь для просмотра всего текста
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
package ru.tilesto.base;
 
import android.content.Intent;
import android.graphics.PorterDuff;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuItem;
 
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FilterQueryProvider;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.ListView;
import android.database.sqlite.SQLiteDatabase;
import android.database.Cursor;
import android.widget.SimpleCursorAdapter;
 
import java.sql.SQLException;
 
public class MainActivity extends ActionBarActivity {
 
    ListView mList;
    DatabaseHelper sqlHelper;
    SQLiteDatabase db;
    Cursor userCursor;
    SimpleCursorAdapter userAdapter;
    EditText userFilter;
    EditText userFilterCode;
    Button reset;
    Button bSort;
    Button bSortId;
    Button bSortAlph;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
 
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
 
        userFilter = (EditText)findViewById(R.id.userFilter);
        userFilterCode = (EditText)findViewById(R.id.userFilterCode);
        bSort = (Button)findViewById(R.id.bSort);
        bSortId = (Button)findViewById(R.id.bSortId);
        bSortAlph = (Button)findViewById(R.id.bSortAlph);
 
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), UserActivity.class);
                startActivity(intent);
            }
        });
 
        reset = (Button) findViewById(R.id.bReset);
        reset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                userFilter.setText("");
                userFilterCode.setText("");
            }
        });
 
        mList = (ListView)findViewById(R.id.list);
        mList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(getApplicationContext(), UserActivity.class);
                intent.putExtra("id", id);
                startActivity(intent);
            }
        });
 
        sqlHelper = new DatabaseHelper(getApplicationContext());
        sqlHelper.create_db();
 
        bSort.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
 
                    /*sqlHelper.open();
                    db = sqlHelper.getReadableDatabase();*/
                    userCursor = db.rawQuery("select * from " + DatabaseHelper.TABLE + " order by expDateReal", null);
                    onResume();
            }
        });
 
        bSortId.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
 
                    //sqlHelper.open();
                    db = sqlHelper.getReadableDatabase();
                    if (!db.isOpen())
                        sqlHelper.open();
                    userCursor = db.rawQuery("select * from " + DatabaseHelper.TABLE, null);
                    onResume();
                } catch (SQLException ex) {
                }
            }
        });
 
        bSortAlph.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
 
                    /*sqlHelper.open();
                    db = sqlHelper.getReadableDatabase();*/
                    userCursor = db.rawQuery("select * from " + DatabaseHelper.TABLE + " order by name", null);
                    onResume();
            }
        });
 
        bSortId.callOnClick();
    }
 
    @Override
    public void onResume(){
        super.onResume();
 
            String[] headers = new String[]{DatabaseHelper.COLUMN_ID, DatabaseHelper.COLUMN_NAME,
                    DatabaseHelper.COLUMN_ZONE, DatabaseHelper.COLUMN_NUM_ALL, DatabaseHelper.COLUMN_NUM_ON_BOX,DatabaseHelper.COLUMN_PRICE,
                    DatabaseHelper.COLUMN_EXP_DATE};
            userAdapter = new SimpleCursorAdapter(this, R.layout.items,
                    userCursor, headers, new int[]{R.id.id, R.id.name, R.id.zone, R.id.numAll, R.id.numOnBox,R.id.price, R.id.expDate}, 0);
 
            // если в текстовом поле есть текст, выполняем фильтрацию
            // данная проверка нужна при переходе от одной ориентации экрана к другой
 
             if(!userFilter.getText().toString().isEmpty())
                userAdapter.getFilter().filter(userFilter.getText().toString());
 
            // установка слушателя изменения текста
            userFilter.addTextChangedListener(new TextWatcher() {
 
                public void afterTextChanged(Editable s) {
                }
 
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
                // при изменении текста выполняем фильтрацию
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    userAdapter.getFilter().filter(s.toString());
                }
            });
 
        db = sqlHelper.getReadableDatabase();
 
            try{
            sqlHelper.open();
            } catch (SQLException ex) {}
 
            if(!userFilterCode.getText().toString().isEmpty()) {
                userAdapter.getFilter().filter(userFilterCode.getText().toString());
            }
 
            // установка слушателя изменения текста
            userFilterCode.addTextChangedListener(new TextWatcher() {
 
                public void afterTextChanged(Editable s) {
                }
 
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
 
                // при изменении текста выполняем фильтрацию
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    userAdapter.getFilter().filter(s.toString());
                }
            });
 
            // устанавливаем провайдер фильтрации
            userAdapter.setFilterQueryProvider(new FilterQueryProvider() {
                @Override
                public Cursor runQuery(CharSequence constraint) {
 
                if(constraint==null||constraint.length()==0)
 
                {
                    return sqlHelper.database.rawQuery("select *   from " + DatabaseHelper.TABLE, null);
                }
 
                else
 
                {
                    if (userFilter.length() == 0) {
                        return sqlHelper.database.rawQuery("select * from " + DatabaseHelper.TABLE + " where " +
                                DatabaseHelper.COLUMN_CODE + " like ?", new String[]{"%" + constraint.toString() + "%"});
                    } else {
                        return sqlHelper.database.rawQuery("select * from " + DatabaseHelper.TABLE + " where " +
                                DatabaseHelper.COLUMN_NAME + " like ?", new String[]{"%" + constraint.toString() + "%"});
                    }
                }
            }
    });
 
            mList.setAdapter(userAdapter);
    }
 
    @Override
    public void onDestroy(){
        super.onDestroy();
        // Закрываем подключения
 
        db = sqlHelper.getReadableDatabase();
        sqlHelper.database.close();
        userCursor.close();
    }
 
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
 
        int id = item.getItemId();
 
        if (id == R.id.action_settings) {
 
            Intent intent = new Intent(getApplicationContext(), UserActivity.class);
            startActivity(intent);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2016, 02:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос SQlite + курсор + ориентация (Программирование Android):

Как установить курсор на запись с введенным ID в SQLite - Программирование Android
Добрый день, имеется таблица с записями в sqlite. В Активити я должен вывести запись на экран в подготовленную форму по ее id. Но как...

Ориентация - Программирование Android
Народ помогите уже мучаюсь какой день не могу поменять ориентацию эмулятора. Сам эмулятор тока переворачивается(ctrl+F11, ctrl+F12,7,9) но...

Ориентация экрана - Программирование Android
Здравствуйте!Хотелось бы услышать совета знающих людей:) Имеется Активити с открытой БД и Курсором...Необходимо сделать так, что бы...

ориентация экрана - Программирование Android
Как сделать так чтобы в тоже время запретить вертикальную ориентацию активити. Но в горизонтальном положении его можно было поворачивать...

Ориентация экрана и данные - Программирование Android
Здравствуйте! Подскажите такую вещь: У меня есть некоторые данные в активити а именно private MyObj myObj; У которого есть некоторые...

Портретная\Альбомная ориентация - Программирование Android
Добрый день! Подскажите как сделать, три фрейма или активити в портретном режиме должно отображаться только второе активити\фрейм, доступ...

5
vxg
Модератор
3172 / 1975 / 222
Регистрация: 13.01.2012
Сообщений: 7,612
11.08.2016, 08:15 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Tilesto, смена экрана = пересоздание активити = отсутствие чего-то что вы произвели с базой во время работы активити?
1
Tilesto
6 / 6 / 0
Регистрация: 14.05.2015
Сообщений: 145
Завершенные тесты: 2
11.08.2016, 12:13  [ТС] #3
vxg, спасибо за наводку, теперь хоть знаю в какую сторону копать)
Но все равно не знаю, что именно не так. Открыл подключение к базе, по окончании активити - закрыл подключение. И мне в итоге выдает ошибку - attempt to re-open an already-closed object, мол я пытаюсь открыть объект, который уже закрыл. А какая религия не позволяет студии этого сделать? Заново открыть что-то((

Добавлено через 7 минут
Нахимичил что-то, теперь ошибка с курсором - android.database.StaleDataException: Attempting to access a closed CursorWindow.Most probable cause: cursor is deactivated prior to calling this method.
0
Pablito
2506 / 1990 / 620
Регистрация: 12.05.2014
Сообщений: 6,954
Завершенные тесты: 1
11.08.2016, 12:17 #4
если для обеих ориентаций экрана используется одна и та же разметка то нет смысла пересоздавать активити при повороте

можно просто отключить пересоздание активити в манифесте (внутри тега activity)
XML
1
            android:configChanges="orientation|screenSize"
разметка просто будет пересчитывать размеры и все
1
Tilesto
6 / 6 / 0
Регистрация: 14.05.2015
Сообщений: 145
Завершенные тесты: 2
12.08.2016, 00:36  [ТС] #5
Паблито, спасибо за ответ, и полезную "штуку") Буду знать, полезненько, даже очень.
Но в данном проекте, именно в этой активити две разметки хд

Добавлено через 5 минут
Так ладно, видно я не так вопрос задал, и проблему поставил.
Мне нужно осуществить сортировку списка, по нажатой кнопке. Кнопки сортировки: по имени, по ид, по дате.
Как я делаю (понимаю что неправильно, но по-другому не придумал как):
-создаю кнопки, и слушатели к ним, типа
Java
1
2
3
4
5
6
7
bSortByName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                    userCursor = db.rawQuery("select * from " + DatabaseHelper.TABLE + " order by name", null);
                    onResume();
            }
        });
-но мне надо изначально список заполнить данными из бд, поэтому одной кнопке я делаю вот такую "порнографию"
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        
        sqlHelper = new DatabaseHelper(getApplicationContext());
        sqlHelper.create_db();
 
        bSortId.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    db = sqlHelper.getReadableDatabase();
                    if (!db.isOpen())
                        sqlHelper.open();
                    userCursor = db.rawQuery("select * from " + DatabaseHelper.TABLE, null);
                    onResume();
                } catch (SQLException ex) {
                }
            }
        });
- и потом, при запуске активити, я программно эту кнопку нажимаю
Java
1
bSortId.callOnClick();
У слабонервных программистов сейчас случился сердечный приступ хдд Я художник, я так вижу) Как сделать нормальную сортировку по кнопкам?)))

Добавлено через 6 минут
Ну в общем в onResume() идет подключение к бд, с запросом userCursor = db.rawQuery("select * from " + DatabaseHelper.TABLE, null); . Если нажимать на кнопки, то query меняется соответсвенно. Но как мне сделать подключение к БД изначально, а потом еще переподключаться в зависимости от кнопок, и заново заполнять список. Про потоки пока вообще молчу, надо чтобы работало хоть как-то

Добавлено через 10 минут
Чет я расфлудился) Разогнался точнее.
Если вешать слушатели на кнопки, или же радиокнопки, то список обновляется, но только не от нажатия кнопки, а от перезапуска активити. Т.е. нажал кнопку сортировки по дате, ничего не изменилось. Перешел на какое-то другое активити, а потом обратно, список обновился уже отсортированный

Добавлено через 41 минуту
Сделал не кнопки, а кнопки-переключатели, тоглы. Все обновляется как надо. Но при смене ориентации опять ошибка:
Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' on a null object reference

Добавлено через 11 часов 4 минуты
Ладно, тему можно закрыть. Вроде разобрался)
0
vxg
Модератор
3172 / 1975 / 222
Регистрация: 13.01.2012
Сообщений: 7,612
12.08.2016, 08:28 #6
Tilesto, и что же там было?
0
12.08.2016, 08:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2016, 08:28
Привет! Вот еще темы с ответами:

Ориентация экрана в эмуляторе - Программирование Android
Здравствуйте, к меня в эмуляторе не меняется ориентация экрана, при нажатии комбинации ctrl+ F11 или ctrl+F12 никакой реакции

Ориентация экрана конфликтует с onPause() - Программирование Android
Здравствуйте. В своем проекте я использую класс GameView (extends SurfaceView implements Runnable) и загружаю его в onCreate через...

Ориентация экрана при загрузке данных - Программирование Android
Добрый день! Приложение запрашивает HTML страницу которая загружется в doInBackground. Но при смене ориентции экрана приложение...

SQLite - Программирование Android
почему id = 0 ??? public void onClick(View view) { dataBase = new DataBase(context); sqLiteDatabase =...


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

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

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