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

Обработка событий при работе с sqlite - Android

Восстановить пароль Регистрация
 
Russtem81
3 / 3 / 1
Регистрация: 15.10.2015
Сообщений: 45
15.10.2015, 15:25     Обработка событий при работе с sqlite #1
Добрый день, утоните пожалуйста как правильно отработать событие.
При обработке SQL запроса
если после условия WHERE = идет переменная которая есть однозначно в столбце все отрабатывает.
если после условия WHERE = идет переменная которой нет в столбце приложение закрывается выдавая сообщение:
Unfortunately, gbna has stoped.
как продолжить работу программы и вернуть пользователю сообщение что ни чего не найдено.
поиск чз LIKE работает, но это не нужно.



public void onResume(){
super.onResume();
try {
sqlHelper.open();
/* String query = " SELECT " + DatabaseHelper.COLUMN_DETECT + ","+ DatabaseHelper.COLUMN_ID +
" FROM " + DatabaseHelper.TABLE +
" Where " + DatabaseHelper.COLUMN_E_CODE + " LIKE "+ " '%" + mRequest.getText()+ "%' " ;*/
try
{
String query = " SELECT " + DatabaseHelper.COLUMN_DETECT + ","+ DatabaseHelper.COLUMN_ID +
" FROM " + DatabaseHelper.TABLE +
" Where " + DatabaseHelper.COLUMN_E_CODE + "="+ mRequest.getText();
userCursor = sqlHelper.database.rawQuery(query, null);
userCursor.moveToFirst();

}
catch (Exception e)
{
Log.i(TAG, "Крах");
}

Log.i(TAG, "Реализуем запрос");
// Log.i(TAG, String.valueOf(userCursor));

userCursor.moveToFirst();
String Test = userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_DETECT));
String Test1 = userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_ID));
//String[] headers = new String[]{DatabaseHelper.COLUMN_DETECT, DatabaseHelper.COLUMN_E_MESSAGE};
// String.valueOf(userCursor.getColumnCount());

header.setText("Найдено элементов: " + String.valueOf(userCursor.getCount()));
mTest.setText( Test );
mErroeMeesage.setText(Test1);
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dubok79
 Аватар для dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
17.10.2015, 00:09     Обработка событий при работе с sqlite #2
А вы зайдите в саму базу sqlite и выполните в ней свой запрос. Поймете, что вы делаете не так.
Russtem81
3 / 3 / 1
Регистрация: 15.10.2015
Сообщений: 45
19.10.2015, 10:47  [ТС]     Обработка событий при работе с sqlite #3
Судя по всему изначально вопрос был поставлен не верно.
Программа валилась при работе запроса в onResume(){try{}catch{}}

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
public class MainActivity extends Activity  {
    private ArrayAdapter<String> mAdapter;
    private static final String TAG = "Проверка";
 
 
    ListView mList;
    DatabaseHelper sqlHelper;
    Cursor userCursor = null;
         /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mList=(ListView)findViewById(R.id.listView);
        sqlHelper=new DatabaseHelper(this);
        sqlHelper = new DatabaseHelper(getApplicationContext());
        sqlHelper.create_db();
 
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
 
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
 
        return super.onOptionsItemSelected(item);
    }
 
    public void sendMessage(View view)  {
        EditText editText = (EditText) findViewById(R.id.edit_message);
        String message = editText.getText().toString();
 
 
        if (editText.getText().length()==0) {
            Toast toast = Toast.makeText(getApplicationContext(),
                    "Введите RAS статус", Toast.LENGTH_SHORT);
            toast.show();
        }
        else {
 
            try {
                sqlHelper.open();
                String query = " SELECT * FROM " + DatabaseHelper.TABLE +
                        " Where " + DatabaseHelper.COLUMN_E_CODE + " LIKE " + " '%" + message + "%' ";
 
                userCursor = sqlHelper.database.rawQuery(query, null);
                int sql=userCursor.getCount();
                Log.i(TAG, "String.valueOf(userCursor.getCount())"+String.valueOf(userCursor.getCount()) );
                Log.i(TAG,""+ sql );
                if (sql ==1) {
                    userCursor.moveToFirst();
                        final String[] OUT_Array = new String[]
                                {
                                        "COLUMN_ID:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_ID)),
                                        "COLUMN_E_CODE:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_E_CODE)),
                                        "COLUMN_E_MESSAGE:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_E_MESSAGE)),
                                        "COLUMN_DETECT:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_DETECT)),
                                        "COLUMN_CHECK:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_CHECK)),
                                        "COLUMN_MOTOR:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_MOTOR)),
                                        "COLUMN_SENSOR:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_SENSOR)),
                                        "COLUMN_ROOT_CHECK:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_ROOT_CHECK)),
                                        "COLUMN_RESOL:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_RESOL)),
                                };
                        mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, OUT_Array);
                        mList.setAdapter(mAdapter);
 
 
                }
                else {
 
                    mList.removeAllViewsInLayout();
                    
                    Toast toast = Toast.makeText(getApplicationContext(),
                            "Не один результат", Toast.LENGTH_SHORT);
                    toast.show();
                }
 
 
 
                sqlHelper.database.close();
                userCursor.close();
 
 
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
 
 
    }
 
 
}
Добавлено через 12 минут
так все работает.
Но появился очередной вопрос. При реализации запроса возможно варианты: не найдено ни чего, найдено одно соответствие, найдено более одного соответствия.
Самое простое когда пользователь с прямыми руками ввел корректно запрос и нашли одно соответствие, заполняем ListView и все ок.
Как заставить кусок перезаписать ListView, сделать так чтоб он исчез из видимости, затереть массив final String[] OUT_Array = new String[]


else {

mList.removeAllViewsInLayout();

Toast toast = Toast.makeText(getApplicationContext(),
"Не один результат", Toast.LENGTH_SHORT);
toast.show();
}
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,640
Завершенные тесты: 1
19.10.2015, 11:36     Обработка событий при работе с sqlite #4
Russtem81, а почему просто не перебрать все записи?
Java
1
2
3
4
5
List<Some> result = new ArrayList();
while(cursor.moveToNext()){
    //Достаем строку из крусора
    result.add(то_что_достали);
}
Russtem81
3 / 3 / 1
Регистрация: 15.10.2015
Сообщений: 45
19.10.2015, 12:08  [ТС]     Обработка событий при работе с sqlite #5
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
 else {
                    while (userCursor.moveToNext())
                    {
 
 
                        final String[] OUT_Array = new String[]
                                {
                                        "COLUMN_ID:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_ID)),
                                        "COLUMN_E_CODE:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_E_CODE)),
                                        "COLUMN_E_MESSAGE:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_E_MESSAGE)),
                                        "COLUMN_DETECT:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_DETECT)),
                                        "COLUMN_CHECK:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_CHECK)),
                                        "COLUMN_MOTOR:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_MOTOR)),
                                        "COLUMN_SENSOR:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_SENSOR)),
                                        "COLUMN_ROOT_CHECK:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_ROOT_CHECK)),
                                        "COLUMN_RESOL:  " + userCursor.getString(userCursor.getColumnIndex(DatabaseHelper.COLUMN_RESOL)),
                                };
 
                        Log.i(TAG, OUT_Array[3]);
 
                        mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, OUT_Array);
                    }
                    mList.setAdapter(mAdapter);
                }
Спасибо, это у меня есть частично работает. Массив заполняется результатом запроса
например в лог выводится 3й элемент массива:
10-19 14:03:49.576 26038-26038/? I/Проверка﹕ 6
10-19 14:03:49.576 26038-26038/? I/Проверка﹕ COLUMN_DETECT: SCDC and SHDC sensors were not cleared within the specified time when moved deskew roller to home position at MR, MJ commands.
10-19 14:03:49.576 26038-26038/? I/Проверка﹕ COLUMN_DETECT: SCDC sensor was not blocked or SHDC sensor was not cleared within the specified time when moved deskew roller to right.
10-19 14:03:49.576 26038-26038/? I/Проверка﹕ COLUMN_DETECT: SCDC sensor was not cleared or SHDC sensor was not blocked within the specified time when moved deskew roller to left.
10-19 14:03:49.576 26038-26038/? I/Проверка﹕ COLUMN_DETECT: When the deskew roller was moved from right or left position, the home position (SCDC and SHDC sensors were cleared) was detected faster than the specified time.
10-19 14:03:49.576 26038-26038/? I/Проверка﹕ COLUMN_DETECT: SCDC/SHDC sensors were following impossible state.
SCDC sensor : blocked & SHDC sensor : blocked
10-19 14:03:49.576 26038-26038/? I/Проверка﹕ COLUMN_DETECT: During jam clear processing, URHS sensor did not become clear within the specified time.


но mList.setAdapter(mAdapter); вставляется только крайний элемент массива.

вопрос как вывести все элементы из массива


все это не относится к вопросу как затереть ListView если ни чего не найдено
fraley
90 / 90 / 31
Регистрация: 24.05.2015
Сообщений: 245
19.10.2015, 12:48     Обработка событий при работе с sqlite #6
Russtem81, я не вникал в ваш код, но по последнему вашему сообщению...
Во-первых, вы каждый раз создаете адаптер заново внутри while, поэтому естественно у вас сохраняется только последний элемент.
Во-вторых, ваша логика по работе с адаптером не правильная - вы должна создать адаптер, до while. В while вы должны заносить данные в ваш array, а потом когда закончите дать команду адаптеру обновить ListView.
Russtem81
3 / 3 / 1
Регистрация: 15.10.2015
Сообщений: 45
20.10.2015, 21:09  [ТС]     Обработка событий при работе с sqlite #7
Все получилось окончательно помогла вот эта статься http://developer.alexanderklimov.ru/.../arraylist.php.
С явой ни когда раньше не связывался.
теперь вопрос, ч/з какой оператор отработать разные варианты возврата курсора.
курсор=0
курсор=1
курсор>1
if else как то мало, switch case не очевидно как отработать события когда курсор больше 1)
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,640
Завершенные тесты: 1
20.10.2015, 21:16     Обработка событий при работе с sqlite #8
можно и switch, если не может быть значения меньше нуля.
Java
1
2
3
4
5
6
7
8
9
10
11
switch (size){
    case 0:
        //нуль
        break;
    case 1:
        //один
        break;
    default:
        //не нуль и не один, т.е. либо < 0, либо > 1
        break;
}
Ну или if else

Java
1
2
3
4
5
6
7
if(size == 0){
    //нуль
} else if(size == 1){
     //один
} else if(size > 1){
    //больше 1, но если size < 0, ниодно условие не выполнится.
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2015, 11:12     Обработка событий при работе с sqlite
Еще ссылки по теме:

Android Русский язык при работе с бд
Android "Attempt to re-open an already-closed object" при работе с SQLite
Обработка событий в Service Android
Android Обработка событий в ExpandableListView
Android Обработка событий дочерним и родительским элементами

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

Или воспользуйтесь поиском по форуму:
Russtem81
3 / 3 / 1
Регистрация: 15.10.2015
Сообщений: 45
22.10.2015, 11:12  [ТС]     Обработка событий при работе с sqlite #9
Вопросы знатокам продолжаются)
Слушаю свой ListView
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
             //   int m = MyList.size();
 
               if (MyList.size() < 10){
                Intent MyIntent = new Intent(MainActivity.this, ImageSoSO.class);
                MyIntent.putExtra(EXTRA_MESSAGE, MyList.get(position));
                startActivity(MyIntent);}
                else {
                    Toast toast = Toast.makeText(getApplicationContext(),
                            "Х...ня прошла, но все же утоните запрос", Toast.LENGTH_SHORT);
                    toast.show();
                   }
                Log.i(TAG, "Значение из массива" + MyList.get(position));
                Log.v(TAG, "Запись = " + position + ", id = " + id);
                
 
            }
        });
отрабатываю два варианта:
1. пользователю можно попытаться найти расположение датчика на схеме и загрузить соответствующею картинку
2. пользователь посмотрел возможные варианты в текстовом формате и вынужден уточнить запрос.
на данном этапе есть облом, после возврата с активности ImageSoSO.class в родительскую активность ListView затирается. ВОПРОС как проще всего сохранить динамически загруженные данные в родительской активности.

активность ImageSoSO.class будет регулярными выражениями обрабатывать строку и загружать картинку, больше ни чего не планируется.

Добавлено через 17 часов 33 минуты
Переписал код, переопределил метод onCreate
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mList=(ListView)findViewById(R.id.listView);
        meditText= (EditText) findViewById(R.id.edit_message);
       // Log.i(TAG, "Значение из массива CREAT" + MyList.size());
        mMessage = meditText.getText().toString();
        //Log.i(TAG, "Значение из массива mMessage  " + mMessage);
        
        SQL(mMessage);
        sqlHelper=new DatabaseHelper(this);
        sqlHelper = new DatabaseHelper(getApplicationContext());
        sqlHelper.create_db();
    }


реализовал для вращения
Java
1
2
3
4
5
6
7
 protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        mMessage=savedInstanceState.getString("count");
 
        // = savedInstanceState.getInt("count");
        Log.d(TAG, "onRestoreInstanceState");
    }
Java
1
2
3
4
5
6
 protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("count",mMessage);
        //outState.putInt("count", cnt);
        Log.d(TAG, "onSaveInstanceState");
    }
Последовательность методов при вызове второй активности и возврат

при переходе на другую активность идет отработка методов
10-22 13:03:45.828 2403-2403/com.example.funktion D/Проверка﹕ onPause
10-22 13:03:46.069 2403-2403/com.example.funktion D/Проверка﹕ onSaveInstanceState
10-22 13:03:46.069 2403-2403/com.example.funktion D/Проверка﹕ onStop

при возврате не отрабатывает метод onRestoreInstanceState
10-22 13:04:19.399 2403-2403/com.example.funktion D/Проверка﹕ onDestroy
10-22 13:04:19.418 2403-2403/com.example.funktion D/Проверка﹕ onStart
10-22 13:04:19.418 2403-2403/com.example.funktion D/Проверка﹕ onResume

Вопрос какую пару методов необходимо использовать при вызове второй активности и возврате с нее.

нашел тему:
http://startandroid.ru/ru/uroki/vse-...ovorote-ekrana. но пример с onRetainNonConfigurationInstance и getLastNonConfigurationInstance не очевиден на данный момент.
Yandex
Объявления
22.10.2015, 11:12     Обработка событий при работе с sqlite
Ответ Создать тему
Опции темы

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