1. Использовать ответчики
Вы используете одну и ту же функцию обработчика событий для каждого вызова базы данных. Следовательно, когда функция выполняется, она может потерять ссылку на свой исходный оператор (потому что тем временем был инициирован новый вызов). Вот почему вы получаете эти нулевые указатели на объекте результата.
Так что отбросьте слушателей событий и используйте взамен Responder , вот так:
var stmt:SQLStatement = new SQLStatement();
stmt.sqlConnection = connection;
stmt.text = query;
var resp:Responder = new Responder(onResult, onFail);
stmt.execute(-1, resp);
Функция 'onResult' примет объект SQLResult в качестве одного аргумента, и вам больше не придется ссылаться на исходный оператор, чтобы получить этот результат.
2. Задержка
Используйте Таймер, да. Но не используйте его для вызова базы данных с интервалом. Вы не знаете, когда прекратить звонить, не так ли? Используйте его, чтобы определить, печатает ли пользователь по-прежнему или нет: когда это занимает больше времени, скажем, 300 мс. для одного KeyboardEvent.KEY_UP, чтобы следовать за другим, а затем выполнить вызов в базу данных. Один раз.
3. Используйте порог
Не начинайте запрашивать только одну букву. Используйте порог не менее 2-3 символов. Вы не получите никаких соответствующих предложений с одним персонажем в любом случае. Насколько высоким должен быть порог, зависит от размера коллекции для поиска.
4. Отфильтруйте коллекцию ArrayCollection
Игнорировать все вышеперечисленное. Более простым решением может быть просто загрузить все записи, которые вы хотите найти, в ArrayCollection и использовать filterFunction
для отображения только тех записей, которые соответствуют определенной строке. Этот метод будет хорошо работать до тех пор, пока коллекция не будет гигантской (например, десятки тысяч записей) и будет быстрее внедряться.