SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
-
sanya5791
- Сообщения: 20
- Зарегистрирован: 10 окт 2014, 15:22
- Откуда: Днепропетровск
Сообщение
sanya5791 » 10 окт 2014, 15:48
Здравствуйте.
Хочу в одном методе объявить локальный курсор ResultSet rs и передать его в обработчик нажатия ListView.
Код: Выделить всё
........
private void launchCallableStatement(String statementName) {
Fragment frag2; //объявим фрагмент
CallableStatement stmt; //вызываемая процедура БД
ResultSet rs;
ListView lv;
.....
rs = stmt.executeQuery();
// находим список фо фрагменте
lv = (ListView) frag2.getView().findViewById(R.id.lv_out1);
/*** Обработаем нажатие на список ListView ***/
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View arg1,
int position, long arg3) {
MyLogger("The item N" + position + " is selected" +
"\nIt's name" + parent.getAdapter().getItem(position));
try {
rs.absolute(position+1);
} catch (SQLException e) {
// TODO Auto-generated catch block
MyLogger("SQLException" + e);
e.printStackTrace();
}
}
});
......
Внутри блока try, rs.absolute(position+1); не видно ранее объявленного курсора. Понимаю, что @Override, значит вызвать метод из другого класса. Но все-таки, как можно туда передать курсор
Хочу использовать именно локальный курсор - если объявить глобально, то все работает. БОльшое спасибо.
-
Leeroy
- Сообщения: 67
- Зарегистрирован: 12 дек 2013, 21:25
Сообщение
Leeroy » 10 окт 2014, 17:02
final ResultSet rs
и/или в public void onItemClick, добавь ещё одну локальную переменную ссылающуюся на курсор
Java Core -> JDBC -> GoF -> Android SDK ->...
Телепрограмма в твоем смарте
Телепрограмма
-
sanya5791
- Сообщения: 20
- Зарегистрирован: 10 окт 2014, 15:22
- Откуда: Днепропетровск
Сообщение
sanya5791 » 12 окт 2014, 18:07
Спасибо, с final все понятно. А как же передать без объявления final?
Вы написали:
Leeroy писал(а):final ResultSet rs
и/или в public void onItemClick, добавь ещё одну локальную переменную ссылающуюся на курсор
Как раз интересен вариант "
или в public void onItemClick, добавь ещё одну локальную переменную ссылающуюся на курсор". Подробнее пожалуйста
.
-
Leeroy
- Сообщения: 67
- Зарегистрирован: 12 дек 2013, 21:25
Сообщение
Leeroy » 12 окт 2014, 20:26
попробуй в объявлении класса реализовать implements OnItemClickListener {
В классе объяви переменную класса курсор.
и в @Override public void onItemClick(AdapterView<?> parent, View arg1,
int position, long arg3)
обращайся к ней
Java Core -> JDBC -> GoF -> Android SDK ->...
Телепрограмма в твоем смарте
Телепрограмма
-
sanya5791
- Сообщения: 20
- Зарегистрирован: 10 окт 2014, 15:22
- Откуда: Днепропетровск
Сообщение
sanya5791 » 14 окт 2014, 16:01
Ув. Leeroy. Вы писали:
Leeroy писал(а):
В классе объяви переменную класса курсор.
Но я как раз хотел бы избежать объявления курсора на уровне класса, ограничившись лишь объявлением курсора внутри метода launchCallableStatement(String). Может я неправильно понял,... тогда можно подробнее?
-
ihitmani
- Сообщения: 8
- Зарегистрирован: 26 ноя 2014, 01:04
Сообщение
ihitmani » 26 ноя 2014, 11:22
sanya5791 писал(а):Здравствуйте.
Хочу в одном методе объявить локальный курсор ResultSet rs и передать его в обработчик нажатия ListView.
Код: Выделить всё
........
private void launchCallableStatement(String statementName) {
Fragment frag2; //объявим фрагмент
CallableStatement stmt; //вызываемая процедура БД
ResultSet rs;
ListView lv;
.....
rs = stmt.executeQuery();
// находим список фо фрагменте
lv = (ListView) frag2.getView().findViewById(R.id.lv_out1);
/*** Обработаем нажатие на список ListView ***/
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View arg1,
int position, long arg3) {
MyLogger("The item N" + position + " is selected" +
"\nIt's name" + parent.getAdapter().getItem(position));
try {
rs.absolute(position+1);
} catch (SQLException e) {
// TODO Auto-generated catch block
MyLogger("SQLException" + e);
e.printStackTrace();
}
}
});
......
Внутри блока try, rs.absolute(position+1); не видно ранее объявленного курсора. Понимаю, что @Override, значит вызвать метод из другого класса. Но все-таки, как можно туда передать курсор
Хочу использовать именно локальный курсор - если объявить глобально, то все работает. БОльшое спасибо.
А не пробовал
https://developer.android.com/reference ... .Object%29, найти ту вьюху зараньше зесетить туда курсор а потом вытащить?
-
sanya5791
- Сообщения: 20
- Зарегистрирован: 10 окт 2014, 15:22
- Откуда: Днепропетровск
Сообщение
sanya5791 » 27 ноя 2014, 12:46
Всем спасибо за ответы. Для себя решение нашел следующее:
Т.к. resultSet принимает результат запроса к БД, то сам запрос можно выполнять только в отдельном потоке. А значит, нет доступа к основному (UI) потоку.
Следовательно, создал отдельный класс для осуществления запроса и здесь же на уровне класса объявил ResultSet mRs. А потом, через getter - ResultSet getRs() получаю его там, где мне нужно.
Код: Выделить всё
public class GetZonesTask extends AsyncTask<String, String, Boolean> {
//.......... объявляю другие переменные
private ResultSet mRs;
//.............. выполняю запрос к БД и получаю ответ в ResultSet mRs
public ResultSet getRs() {
return mRs;
}
}
Т.е. вкраце: все-таки объявил ResultSet переменной на уровне класса, а не локально, внутри метода.
Еще раз спасибо за Ваши ответы.