Mam jeden stół question_table
i jeden ImageButton
(z tyłu ). Po kliknięciu przycisku Wstecz muszę pobrać ostatni wstawiony rekord z bazy danych .
Mój wiersz zawiera następujące kolumny: question
, optionA
, optionB
, optionC
, optionD
, i muszę danych do wykorzystania na mój Activity
. Tworzę jedną metodę w bazie danych, ale nie działa.
Oto kod w celach informacyjnych:
Wyciąg z MySQLiteHelper.java :
public List<ObjectiveWiseQuestion> getLastInsertQuestion()
{
// long index = 0;
List<ObjectiveWiseQuestion>LocwiseProfileList=new ArrayList<ObjectiveWiseQuestion>();
db = getReadableDatabase();
Cursor cursor = db.query(
"sqlite_sequence",
new String[]{"seq"},
"name = ?",
new String[]{TABLE_QUESTION},
null,
null,
null,
null );
if (cursor.moveToFirst())
{
do {
ObjectiveWiseQuestion owq= new ObjectiveWiseQuestion();
owq.setQuestion(cursor.getString(2));
owq.setOptionA(cursor.getString(3));
owq.setOptionB(cursor.getString(4));
owq.setOptionC(cursor.getString(5));
owq.setOptionD(cursor.getString(6));
owq.setCorrectOption(cursor.getString(7));
LocwiseProfileList.add(owq);
} while(cursor.moveToNext());
db.close();
}
return LocwiseProfileList;
}
OnClickListner
z AddQuestionActivity.java
imgBack.setOnClickListener( new View.OnClickListener()
{
@Override
public void onClick(View v)
{
msg();
emptyFormField();
try {
final List<ObjectiveWiseQuestion> LocWiseProfile = db.getLastInsertQuestion();
for (final ObjectiveWiseQuestion cn : LocWiseProfile)
{
db=new MySQLiteHelper(getBaseContext());
db.getWritableDatabase();
txtQuestion.setText(cn.getQuestion());
txtOptionA.setText(cn.getOptionA());
txtOptionB.setText(cn.getOptionB());
txtOptionC.setText(cn.getOptionC());
txtOptionD.setText(cn.getOptionD());
txtCorrectOption.setText(cn.getCorrectOption());
db.close();
}
} catch(Exception e) {
e.printStackTrace();
}
}
});
Proszę, daj mi jakąś wskazówkę.
sqlite
przed zwróceniem wyniku Stephen Nguyen powinien posortować wszystkie rekordy według ich identyfikatora (wolno),DESC
a następnieLIMIT 1
Myślę, że najlepsza odpowiedź jest nieco rozwlekła, po prostu użyj tego
SELECT * FROM table ORDER BY column DESC LIMIT 1;
źródło
Aby uzyskać ostatni rekord ze swojego stołu ...
String selectQuery = "SELECT * FROM " + "sqlite_sequence"; Cursor cursor = db.rawQuery(selectQuery, null); cursor.moveToLast();
źródło
Oto prosty przykład, który po prostu zwraca ostatnią linię bez potrzeby sortowania czegokolwiek z żadnej kolumny:
"SELECT * FROM TableName ORDER BY rowid DESC LIMIT 1;"
źródło
Myślę, że byłoby lepiej, gdybyś użył zapytania metody z klasy SQLiteDatabase zamiast całego ciągu SQL, który byłby:
Ostatnie dwa parametry to ORDER BY i LIMIT.
Możesz zobaczyć więcej na: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html
źródło
Jeśli masz już kursor, to w ten sposób możesz uzyskać ostatni rekord z kursora:
cursor.moveToPosition(cursor.getCount() - 1); //then use cursor to read values
źródło
Załóżmy, że szukasz ostatniego wiersza tabeli dbstr.TABNAME w kolumnie INTEGER o nazwie „_ID” (na przykład BaseColumns._ID), ale może to być dowolna inna kolumna.
źródło
Po prostu możesz się poruszać
Cursor
moveToLast (); metoda zapewnia przejście do ostatniego rekorduźródło
Chciałem zachować moją tabelę, ciągnąc w jednym wierszu, który daje mi ostatnią wartość w określonej kolumnie tabeli. Zasadniczo chciałem zastąpić tę
LAST()
funkcję w programie Excel i to zadziałało., (Select column_name FROM report WHERE rowid = (select last_insert_rowid() from report))
źródło
Inną opcją jest użycie SQLite
LAST_VALUE()
funkcji w następujący sposób.Biorąc pod uwagę tę tabelę:
+--------+---------+-------+ | OBJECT | STATUS | TIME | +--------+---------+-------+ | | | | | 1 | ON | 100 | | | | | | 1 | OFF | 102 | | | | | | 1 | ON | 103 | | | | | | 2 | ON | 101 | | | | | | 2 | OFF | 102 | | | | | | 2 | ON | 103 | | | | | | 3 | OFF | 102 | | | | | | 3 | ON | 103 | +--------+---------+-------+
Możesz uzyskać ostatni status każdego obiektu za pomocą następującego zapytania
SELECT DISTINCT OBJECT, -- Only unique rows LAST_VALUE(STATUS) OVER ( -- The last value of the status column PARTITION BY OBJECT -- Taking into account rows with the same value in the object column ORDER by time asc -- "Last" when sorting the rows of every object by the time column in ascending order RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING -- Take all rows in the patition ) as lastStatus FROM TABLE
Wynik wyglądałby następująco:
+--------+--------------+ | OBJECT | LAST_STATUS | +--------+--------------+ | | | | 1 | ON | | | | | 2 | ON | | | | | 3 | ON | +--------+--------------+
źródło
w sqlite jest tabela o nazwie sqlite_sequence, ta tabela zawiera nazwę tabeli i jej ostatni numer identyfikacyjny (jeśli identyfikator jest automatycznie zwiększany).
Aby więc uzyskać ostatni wiersz w tabeli, po prostu wpisz:
Select * from TABLENAME where id=(SELECT * from sqlite_sequence where name ='TABLENAME')
źródło
W poprzednich odpowiedzi zakładają , że istnieje zwiększając całkowitą kolumna ID, więc
MAX(ID)
daje ostatni wiersz. Ale czasami klawisze są typu tekstowego , a nie uporządkowane w przewidywalny sposób. Aby więc wziąć ostatni 1 lub N wierszy (# Nrows #), możemy zastosować inne podejście :Select * From [#TableName#] LIMIT #Nrows# offset cast((SELECT count(*) FROM [#TableName#]) AS INT)- #Nrows#
źródło