2011-09-27 8 views
11

가능한 중복 :
Get generated id after insert안드로이드 SQLite는 지난 삽입 행 ID를 얻을

이 코드 사용하여 내 안드로이드 응용 프로그램에서 마지막으로 삽입 된 행 ID를 얻으려면 :

String query = "SELECT * from SQLITE_SEQUENCE"; 
int createdUserId = Integer.parseInt(dbHelper.executeSQLQuery(query).toString()); 

하지만 문제는 그것이 dbHelper.executeSQLQuery(query).toString()으로 변환 할 수없는 예외를 throw합니다. 정수. 난 정말 sqlite 잘 아니지만,이 삽입 된 마지막 행 ID를 반환해야한다고 생각합니다 ... 어느 것입니다 확실히 int (적어도 내가 이런 식으로 생각하는) 것입니다. 그래서 이것이 올바른 방법이 아니면 안드로이드 응용 프로그램에서 마지막 행 ID를 얻는 방법을 안내해 줄 수 있습니까?

감사합니다 !!!

+0

dbHelper의 인스턴스는 무엇입니까? – Squonk

+3

왜'SELECT' 문은 * 아무것도 삽입합니까? 'SQLiteDatabase.insert (...)'와 같이 실제로 뭔가 삽입 할 경우 "새로 삽입 된 행의 행 ID"또는 "오류가 발생하면 -1"이 반환됩니다. –

+0

@MisterSquonk 그것은 내 DatabaseHelper 클래스의 인스턴스입니다. –

답변

34

SQL 구문은 최신이 아닌 모든 행 ID를 반환합니다. 또한

SELECT ROWID from SQL_LITE_SEQUENCE order by ROWID DESC limit 1 

내가 SQL_LITE_SEQUENCE에서 선택하면 모든 테이블에서 최신 ID를 얻을 것이다 믿고 있습니다 ... 이런 식으로 뭔가를 시도, 당신은 또한 단지 ID를 모든 테이블에 ROWID를 선택하고 점점하여 SQL_LITE_SEQUENCE에 액세스 할 수 있습니다 그 테이블. IE

SELECT ROWID from MYTABLE order by ROWID DESC limit 1 

덕분 나중에 쉽게 참조 할 수 있도록 여기에 추가, 코멘트의 다음 단계를 지적 MisterSquonk에 ...

쿼리 문은 다음 결과를 포함하는 커서 객체를 반환합니다, 그래서 당신은

String query = "SELECT ROWID from MYTABLE order by ROWID DESC limit 1"; 
Cursor c = db.rawQuery(query); 
if (c != null && c.moveToFirst()) { 
    lastId = c.getLong(0); //The 0 is the column index, we only have 1 column, so the index is 0 
} 

은 (주이 같은 (난 그냥 다른 사람을 위해, 당신의 도우미 방법에 대한 일반적인 방법을 대체 할 것)을 할 것 정수 값에 액세스하는 것을 SQL 라이트 문서는 ROWID와 정수를 호출하지만, 64 비트 정수이므로 자바에서는 길이로 검색해야합니다.)

+0

원자 적이지 만 안전하지 않습니다. 수정 : downvote 제거, 나는 그것이 다른 것을 요구하고 있다고 생각. –

+0

이론적 인 가능성이 정답을 제공하지 않을 수 있습니다. 왜냐하면 행이 데이터베이스에서 삭제 된 다음 새로운 행이 추가되면 엄청난 양의 삽입 후에 rowid가 sqlite가 무작위로 선택하려고하는 한계에 도달 할 수 있기 때문입니다 한동안 사용할 rowid 슬롯. 이 경우 분명히 마지막으로 삽입 된 행은 가장 큰 숫자 값을 가지지 않으므로 행 ID를 정렬하면 충분하지 않습니다. [SQLite의 자동 증가] (https://www.sqlite.org/autoinc.html) – Timo

12

"selectlast_insert_rowid()"을 사용 하시겠습니까? :)

+0

이봐, 조금만 설명해 주시겠습니까? 플로팅 코더의 대답에 의해 노력하고 있지만 실행되지 않습니다 : ( –

+0

죄송합니다,하지만 귀하의 문제가 무엇인지 모르겠습니다. 어쩌면 당신은 문제가 무엇인지 자세히 설명해 줄 수있는 새로운 질문을 열어야합니다. – JimmyB

+1

이것은 올바른 쿼리입니다 : ROWID DESC 한도에 의해 MYTABLE 순서에서 SELECT ROWID 1 –

관련 문제