2010-10-25 38 views
24

Tôi đang cố gắng lấy hàng cuối được chèn vào từ cơ sở dữ liệu sqlite trong Android. Tôi đã đọc rất nhiều bài viết về nó, nhưng không thể có một bài viết để làm việc. Đây là phương pháp của tôi:Nhận giá trị được chèn vào cuối cùng từ cơ sở dữ liệu sqlite Android

public Cursor getLastId() { 
     return mDb.query(DATABASE_TABLE, new String[] {KEY_WID}, KEY_WID + "=" + MAX(_id), null, null, null, null, null);} 

Tôi đã thử với MAX, nhưng tôi phải sử dụng sai. Có cách nào khác không?

+1

Phương thức chèn trả về hàngId hoặc -1 http://stackoverflow.com/questions/5409751/get-generated-id-after-insert – rds

+0

xem https://stackoverflow.com/a/40962443/1770868 –

Trả lời

61

Vâng thực sự lớp SQLiteDatabase có phương pháp chèn riêng của mình mà trả về id của hàng mới được tạo ra. Tôi nghĩ đây là cách tốt nhất để lấy ID mới. Bạn có thể kiểm tra tài liệu của tài liệu here.

Tôi hy vọng điều này sẽ hữu ích.

+1

@Georgi: BIG BIG help for me. Cảm ơn bạn :) – Bastaix

+0

Vui vì tôi có thể giúp;) –

+0

+1 cảm ơn ... chỉ thẳng thôi ... đã giết hai con chim với một viên đá .. :) –

24

Sử dụng

SELECT last_insert_rowid(); 

để có được những rowid chèn ngoái. Nếu bạn đang sử dụng AUTOINCREMENT từ khóa sau đó

SELECT * from SQLITE_SEQUENCE; 

sẽ cho bạn biết các giá trị cho mỗi bảng.

+1

Tôi có một lớp DataHelper nơi tôi có tất cả các phương thức xử lý cơ sở dữ liệu. Tôi có vẻ như những phương pháp này ở trên như thế này trong nhiều diễn đàn và tài liệu, nhưng tôi không hiểu làm thế nào chúng được sử dụng. Bạn có sử dụng chúng bên trong lớp DataHelper, hoặc bên trong Sqlite thực tế từ thiết bị đầu cuối? Xin lỗi nếu tôi mơ hồ, tôi chỉ cố gắng tìm ra điều này! – kakka47

+3

bạn có thể làm một rawQuery với SQLiteDatabase của Android và cho nó chuỗi "Select * from SQLITE_SEQUENCE" – schwiz

1

Hãy thử điều này:

public Cursor getLastId() { 
     return mDb.query(DATABASE_TABLE, new String[] { **MAX(id)** }, null, null, null, null, null, null);} 
1
/** 
* @return 
*/ 
public long getLastInsertId() { 
    long index = 0; 
    SQLiteDatabase sdb = getReadableDatabase(); 
    Cursor cursor = sdb.query(
      "sqlite_sequence", 
      new String[]{"seq"}, 
      "name = ?", 
      new String[]{TABLENAME}, 
      null, 
      null, 
      null, 
      null 
    ); 
    if (cursor.moveToFirst()) { 
     index = cursor.getLong(cursor.getColumnIndex("seq")); 
    } 
    cursor.close(); 
    return index; 
} 
+0

Tôi nghĩ rằng các bổ sung mới cho cơ sở dữ liệu SQLite được thêm vào bên dưới các hàng hiện có trong một cột. Do đó, chèn cuối cùng sẽ là hàng dưới cùng trong một cột và do đó, bạn có muốn sử dụng "... cursor.moveToLast() ..." thay vì "... cursor.moveToFirst() ..."? – AJW

2

Nếu bạn muốn last_insert_id chỉ afert một chèn bạn có thể sử dụng:

public long insert(String table, String[] fields, String[] vals) 
{ 
    String nullColumnHack = null; 
    ContentValues values = new ContentValues(); 
    for (int i = 0; i < fields.length; i++) 
    { 
     values.put(fields[i], vals[i]); 
    } 

    return myDataBase.insert(table, nullColumnHack, values); 
} 
+0

Điều đó có đúng không? Tôi không đến các chi tiết cụ thể nên tôi hỏi. Tài liệu cho biết row_id được trả về. Theo tôi biết, hàng row_id sqlite không chính xác giống như giá trị trong cột autoincrement hoặc tôi có sai về điều đó không? –

13

Để có được hàng cuối cùng từ bảng ..

Cursor cursor = theDatabase.query(DATABASE_TABLE, columns,null, null, null, null, null); 
cursor.moveToLast(); 
+1

Điều này dường như đối với tôi là câu trả lời hiệu suất nhanh nhất và dễ nhất. –

0

Phương pháp chèn trả về id của hàng vừa chèn hoặc -1 nếu có lỗi trong quá trình chèn.

long id = db.insert("your insertion statement"); 

db là một thể hiện của SQLiteDatabase của bạn.

1

Sử dụng moveToLast() trong giao diện Cursor.

Từ android.googlesource.com

/** 
* Move the cursor to the last row. 
* 
* <p>This method will return false if the cursor is empty. 
* 
* @return whether the move succeeded. 
*/ 
boolean moveToLast(); 

ví dụ đơn giản:

final static String TABLE_NAME = "table_name"; 
String name; 
int id; 
//.... 

Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null); 

if(cursor.moveToLast()){ 
    //name = cursor.getString(column_index);//to get other values 
    id = cursor.getInt(0);//to get id, 0 is the column index 
} 

Hoặc bạn có thể nhận hàng cuối cùng khi chèn (Đó là @GorgiRankovski đã đề cập):

long row = 0;//to get last row 
//..... 
SQLiteDatabase db= this.getWritableDatabase(); 

ContentValues contentValues = new ContentValues(); 
contentValues.put(COLUMN_NAME, name); 

row = db.insert(TABLE_NAME, null, contentValues); 
//insert() returns the row ID of the newly inserted row, or -1 if an error occurred 

Ngoài ra họ là nhiều cách bạn có thể thực hiện việc này bằng truy vấn:

  1. Một được biểu thị bằng @DiegoTorresMilano
  2. SELECT MAX(id) FROM table_name. hoặc để lấy tất cả các giá trị cột SELECT * FROM table_name WHERE id = (SELECT MAX(id) FROM table_name).
  3. Nếu PRiMARY KEY bạn đã ngồi để AUTOINCREMENT, bạn có thể SELECT vaules occording để tối đa để chuẩn tối thiểu và hạn chế các hàng tới 1 sử dụng SELECT id FROM table ORDER BY column DESC LIMIT 1 (Nếu bạn muốn mỗi giá trị, sử dụng * thay vì id)
Các vấn đề liên quan