SQLite — чтение последнего элемента из результирующего набора

#java #sqlite #resultset

#java #sqlite #результирующий набор

Вопрос:

Я использую SQLite db для хранения набора данных и использую оператор запроса для получения результирующего набора, который содержит данные (например), как показано ниже,

 0,3,4,88,6,66,77,4,3,5,88
  

Я использую ,

 while(rs.next){  //rs is result set
if(!rs.next){
// if last element do something  
}   
}
  

Таким образом, я могу получить последний элемент, но каждый раз, когда выполняется цикл, результирующий набор увеличивается дважды, один раз в while и другой в if (через rs.next ). Я не могу этого сделать rs.previous , поскольку SQLite его не поддерживает.

Редактировать:

Мне нужно проверить, является ли элемент последней записью в результирующем наборе (не по значению последней записи, поскольку результирующий набор также может содержать повторяющиеся значения).

Могу ли я каким-либо образом добиться этого??

Пожалуйста, помогите.

Комментарии:

1. вы должны иметь возможность изменять запрос, чтобы возвращать только последнюю запись

2. @JigarJoshi Я не могу использовать значение последней записи, поскольку оно также может содержать повторяющиеся значения.

3. @user3164187 Я думаю, вам нужно уточнить этот момент, потому что, как читается ваш вопрос, вы просто хотите получить последний результат из ResultSet

4. @user3164187 Если я правильно понимаю, если число существует в качестве последнего элемента, но имеет дубликат где-то посередине, это число нельзя рассматривать как решение. Итак, по сути, это означает, что вы пытаетесь найти последний отдельный элемент результирующего набора. Это правильно?

5. @kusur Yeah! вот что я пытался вставить в свой вопрос..

Ответ №1:

Надеюсь, это поможет вам

 boolean recordsAvailable = false;
int lastRecord = 0;

recordsAvailable = rs.next;

while (recordsAvailable)
{
   lastRecord  = rs.getInt("MY_VALUE");
   // Do all actions here... 
   ....
  // Towards the end of the loop, 
   if (rs.next)
   { 
       // Records available
   } 
   else
   {
      // Last record 
      // Do actions with the variable lastRecord
       recordsAvailable= false;
   }

}
  

Комментарии:

1. Но вы снова дважды перепрыгнули rs.next , а затем rs.next перейдете ко второй записи, прежде чем вы даже посмотрите на первую запись…

2. @MadProgrammer: Следующий rs.next будет вызван ближе к концу цикла while. Я отредактировал ответ. Надеюсь, теперь это имеет смысл!

Ответ №2:

Если вы не можете переместить курсор (в последнюю позицию), вам просто нужно выполнить итерацию до конца…

 int lastValue = -1;
while(rs.next){  //rs is result set
    lastValue = ...;
}
  

Это должно записать последнее значение, которое вы извлекаете из результирующего набора.

Обновлено

Это зависит от вашей структуры таблицы, но вы могли бы попробовать что-то вроде…

 SELECT Column1
    FROM tbl
    GROUP By Column1
    HAVING COUNT(*) = 1
  

Который, основываясь на вашем примере ввода, выдает…

 | Column1 |
|---------|
|       0 |
|       5 |
|       6 |
|      66 |
|      77 |
  

чтобы удалить все повторяющиеся значения из запроса…

И…

Если вы чувствуете себя действительно необычно…

 SELECT Column1
    FROM tbl
    GROUP By Column1
    HAVING COUNT(*) = 1
    order by Column1 DESC LIMIT 1
  

Который изменит порядок выбора и вернет только первое значение ( 77 на основе вашего примера).

Это означает, что вам нужно только сделать…

 if (rs.next()) {
    // Get value from the result set...
}
  

вместо того, чтобы пройти весь путь до конца ResultSet

Комментарии:

1. Результирующий набор также может содержать повторяющиеся значения .. если 8 — последнее значение, оно может быть и в какой-то другой позиции.

2. И? Извините, я, возможно, пропустил суть, вы хотели последний элемент, не так ли?