Я создал систему, в которой я могу выполнять все свои sql-запросы postgre только с одним классом асинхронных задач в Android Studio.Это было действительно (!!) сложно из-за большого количества ограничений, с которыми мне пришлось столкнуться.Но на самом деле это работает действительно здорово!
//Used for connecting to database and executing queries.
//Index 0 of input string must be the query, Index 1 must be the tablename we demand
//We can only gather data from 1 table for each query, so if you need data from several tablecolumns, use multiple queries like:
//[0] = query, [1] = tablename, [2] = 2nd query, [3] = 2nd tablename, [4] = 3rd query, [5] = 3rd table name ... and so on (each query must come with a tablename)
public class DBHandler extends AsyncTask<String, Void, List<String>>
{
public AsyncResponse delegate;
@Override
protected List<String> doInBackground(String...query)
{
List<String> result = new ArrayList<String>();
String sql;
String tableresult = null;
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
Class.forName("org.postgresql.Driver");
conn = DriverManager.getConnection("jdbc:postgresql://192.168.200.300:5439/dbname?user=anonymous&password=secretpw");
st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); //necessary if you want to use rs.first() after rs.next(), it makes the resultset scrollable
for (int i = 0; i <= query.length-1; i = i+2) //queries are always stored in i=0 and/or in i+2, because i+1 contain the demanded tablenames for resultset handling
{
System.out.println("I is: " +i);
if (!query[i].isEmpty())
{
System.out.println(query[i]);
sql = query[i];
rs = st.executeQuery(sql);
while (rs.next())
if (!query[i + 1].isEmpty() || !rs.getString(query[i + 1]).isEmpty()) //if i+1 is empty, there is no demanded tablename. Used when we dont need any return values (ie. INSERT, UPDATE)
result.add(rs.getString(query[i + 1])); //demanded tablename is always stored in i+1
//We add an empty entry if we demand multiple tablenames so we can keep them seperate
//Might be replaced with any other char, but you will have to backtrack all usages of DBHandler and fix the filters there
if(i+2 < query.length)
result.add(" ");
}
rs.first(); //reset pointer for rs.next()
}
rs.close();
st.close();
conn.close();
System.out.println("End of AsyncTask");
}
catch (SQLException ex)
{
ex.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
return result;
}
//onPostExecute returns query result in a List.
//We need to use interaces delegate feature to send the result to other classes, like "Auslieferung", which is implementing the interface
@Override
protected void onPostExecute(List<String> result)
{
super.onPostExecute(result);
System.out.println("Result: " +result.toString());
if (!result.isEmpty())
delegate.processFinish(result);
}
}
В этой асинхронной задаче есть цикл for.
for (int i = 0; i <= query.length-1; i = i+2)
И теперь, наконец, я могу объяснить свою проблему: я обычно использую запросы SELECTИногда я использую запрос INSERT (который может быть выполнен одним запросом), но когда я анализирую запрос на обновление, цикл for перестает выполнять итерацию после первого прохода, поэтому i + 2 никогда не происходит.Запросы на обновление выглядят так:
String updatequeries[] = {UPDATE delivery SET contactperson = 'Jon Doe' WHERE officeid = 5, " ", UPDATE delivery SET contactemail = 'abd@def.gh' WHERE officeid = 5, " "};
Почему этот цикл перестает работать сразу после первого запуска?Отладчик не показывает ничего необычного, все проанализировано правильно, и нет пропущенных запросов.Обновление таблицы не возвращает никаких результатов, но здесь ничего не зависит от значений результатов.Я попытался выполнить 20 запросов на обновление в одной строке var, но цикл for останавливается после первой итерации в любом случае.Никакие проблемы не отображаются в отладчике или в журналах.Я что-то наблюдал или есть что-то, чего я не знаю?Может ли это быть ошибкой?Пожалуйста, помогите мне!Эта проблема сводит меня с ума.