Я предлагаю вам использовать уже встроенную библиотеку, чтобы список автоматически обновлялся, когда новые данные помещаются в firebase: проверьте это . Если вы хотите придерживаться пользовательской реализации, сначала определите адаптер в OnCreate
обратный вызов и вызов adapter.notifyDataSetChanged()
каждый раз, когда вы обновляете свои данные. Если вы хотите вставить / обновить / удалить только один элемент из вашего списка, позвоните adapter.notifyItemChanged(position)
из вашего адаптера.
Я настоятельно рекомендую вам перейти на RecyclerView
вместо ListView
в Android (интересное сравнение между ними)
Лучший способ использовать это с DBMS_SQL.
Вы создаете строку, которая представляет Ваш SQL-оператор. Вы все еще используете, связывают переменные. Это болезненно.
Это проходит примерно так (я не скомпилировал это, но это должно быть близко):-
CREATE OR REPLACE FUNCTION find_country( v_name t1.country%TYPE,
v_type t2.type%TYPE) /* Hmm, column called type? */
DECLARE
v_SQL varchar2(2000);
v_select INTEGER; /* "Pointer" to a DBMS_SQL select statement */
v_execute INTEGER;
BEGIN
v_SQL := 'select column from table1 t1, table2 t2 ||
'where t1.id = t2.id';
IF v_name IS NOT NULL THEN
v_SQL := v_SQL || ' AND t1.country = :v_name'
END IF;
IF v_type IS NOT NULL THEN
v_SQL := v_SQL || ' AND t2.type = :v_type';
END IF;
/* Setup Cursor */
v_select := dbms_sql.open_cursor;
dbms_sql.parse( v_select, v_SQL, DBMS_SQL.native);
IF v_name IS NOT NULL THEN
dbms_sql.bind_variable( v_select, ':v_name', v_name );
END IF;
IF v_type IS NOT NULL THEN
dbms_sql.bind_variable( v_select, ':v_type', v_type );
END IF;
DBMS_SQL.DEFINE_COLUMN(v_select, 1, v_column); /* This is what we have selected */
/* Return value from EXECUTE is undefined for a SELECT */
v_execute := DBMS_SQL.EXECUTE( v_select );
IF DBMS_SQL.FETCH_ROWS( v_select ) > 0 THEN
/* A row was found
DBMS_SQL.COLUMN_VALUE( v_select, 1, v_column);
/* Tidy Up */
DBMS_SQL.CLOSE_CURSOR(v_select);
RETURN v_ID_address;
ELSE
DBMS_SQL.CLOSE_CURSOR(v_select);
/* No row */
RETURN NULL;
END IF;
EXCEPTION
WHEN OTHERS THEN
IF DBMS_SQL.IS_open(v_select) THEN
DBMS_SQL.CLOSE_CURSOR(v_select);
END IF;
RAISE;
END;
Этот подход является столь болезненным по сравнению только с записью SQL, встроенного, что, если у Вас нет "кучи" столбцов иногда, это - просто более легкая запись нескольких различных версий с помощью этого синтаксиса:
FOR r IN (SELECT blah FROM blah WHERE t1 = v_t1) LOOP
func( r.blah );
END LOOP;
Это не непосредственно, что Вы спрашиваете, но это может быть приемлемое решение:
select column from table1 t1, table2 t2
where
(v_name is null or t1.name = v_name)
and (v_country is null or t1.country = v_country)
and t1.id = t2.id
and (v_type is null or t2.type = v_type)
Один путь состоял бы в том, чтобы создать Ваш запрос, поскольку строка затем использует, выполняются непосредственный
Лучший способ сделать это должно было бы использовать функцию Application Context Oracle, лучше всего определенную как лучшая производительность и безопасность.
Более быстрый путь был бы тем, какой предложенный hamishmcn, использование ВЫПОЛНЯЕТ НЕПОСРЕДСТВЕННЫЙ. Я предпочел бы это предложению WW DBMS_SQL каждый раз.
Иначе это является самым быстрым для записи, но не будет работать, также было бы что-то вроде этого:
select column from table1 t1, table2 t2
where t1.name = nvl(v_name, t1.name)
and t1.country = nvl(v_country, t1.country)
and t1.id = t2.id
and t2.type = nvl(v_type, t2.type)
Вы не должны использовать dbms_sql для решения этой проблемы, и можно все еще использовать нормальный курсор при помощи касательно курсора.
Образец:
DECLARE
TYPE cursor_ref IS REF CURSOR;
c1 cursor_ref;
r1 table1.column%type;
BEGIN
l_sql := 'select t1.column from table1 t1, table2 t2 where t1.id = t2.id ';
if v_name is not null then
l_sql := l_sql||' and t1.name = '||v_name ;
end if;
if v_country is not null then
l_sql := l_sql||' and t1.country = '||v_country';
end if;
if v_type is not null then
l_sql := l_sql||' and t2.type = '||v_type';
end if;
open c1 for l_sql;
loop
fetch c1 into r1;
exit when c1%notfound;
-- do something
end loop;
close c1;
end;
/
Можно сделать это лучше путем привязки переменных с командой, 'использующей' как это:
open c1 for l_sql using v_name, v_country;