2017-02-20 49 views
0

如何在thansaction體中獲得自動增量值?交易體中的自動增量值

代碼

public void insertAllStudents(List<Student> students) { 
    String sql = "INSERT INTO "+ StudentEntry.TABLE_NAME +" VALUES (?,?,?,?,?);"; 
    SQLiteDatabase db = this.getWritableDatabase(); 
    SQLiteStatement statement = db.compileStatement(sql); 
    db.beginTransaction(); 
    for (Student student: students) { 
     statement.clearBindings(); 
     statement.bindString(2, student.getId()); 
     statement.bindString(3, student.getFirstName()); 
     statement.bindString(4, student.getLastName()); 
     statement.bindLong(5, student.getBirthday()); 
     statement.execute(); 
    } 
    db.setTransactionSuccessful(); 
    db.endTransaction(); 
} 

第一列(_ID)是自動增量字段。獲得這個價值有沒有機會? student.getId() - 這不是來自數據庫的ID,這是不同的ID。

回答

1

如果更改代碼以使用db.insert(),則此方法返回插入行的ID - 請參閱Get generated id after insert

還有一個專門的SQLite的功能,以獲得最後插入的行,如果你希望保留編制報表,看Best way to get the ID of the last inserted row on SQLite

編輯:例如使用db.insert()。這沒有測試,但應該非常接近功能。

db.beginTransaction(); 
boolean success = true; 
final ContentValues values = new ContentValues(); 
for (final Student student: students) { 
    values.put("student_id", student.getId()); 
    values.put("first_name", student.getFirstName()); 
    values.put("last_name", student.getLastName()); 
    values.put("birthday", student.getBirthday()); 
    final long id = db.insert("my_table", null, values); 
    if (id == -1) { 
     success = false; 
     break; 
    } 

    // TODO do your thing with id here. 
} 
if (success) { 
    db.setTransactionSuccessful(); 
} 
db.endTransaction(); 
+0

db.insert()需要大量的時間,所以使用事務將數據插入我。但是,在完成交易之前,我可以獲得id值嗎? – Andrew

+0

是的,'SELECT LAST_INSERT_ROWID()'應該可以工作,即使在一個事務中 - http://stackoverflow.com/questions/376773/in-sqlite3-can-a-select-succeed-within-a-transaction-of-順便插入 – Tom

+0

@Andrew,你應該可以在事務中使用db.insert() - 它只是在引擎蓋下編譯一個語句。 – Tom

1

相反的statement.execute(),你可以做statement.executeInsert()。這將返回插入行的行ID。或者,按照@Tom的建議,您可以使用db.insert()代替,並且它還會返回插入的行ID。儘管如此,使用像你現在這樣編譯的語句更快。

如果你想嘗試db.insert()方法,它會是這個樣子:

ContentValues values = new ContentValues(); 
for (Student student: students) { 
    // use whatever constants you have for column names instead of these: 
    values.put(COLUMN_STUDENT_ID, student.getId()); 
    values.put(COLUMN_STUDENT_FIRSTNAME, student.getFirstName()); 
    values.put(COLUMN_STUDENT_LASTNAME, student.getLastName()); 
    values.put(COLUMN_STUDENT_BIRTHDAY, student.getBirthday()); 
    db.insert(StudentEntry.TABLE_NAME, null, values); 
}