ฉันใช้ SQLite กับ Android และฉันต้องการทราบวิธีที่ดีที่สุดในการสร้าง id ของแถวที่ฉันแทรก
วิธีแก้ปัญหาที่ฉันคิดว่าทำการค้นหาหลังจากรวม แต่ไม่ได้ดูวิธีที่ดีที่สุด
ฉันใช้ SQLite กับ Android และฉันต้องการทราบวิธีที่ดีที่สุดในการสร้าง id ของแถวที่ฉันแทรก
วิธีแก้ปัญหาที่ฉันคิดว่าทำการค้นหาหลังจากรวม แต่ไม่ได้ดูวิธีที่ดีที่สุด
คำตอบ:
insert
ผลตอบแทนที่วิธีการid
ของแถวเพียงแทรกหรือ-1
ถ้ามีข้อผิดพลาดระหว่างการแทรก
long id = db.insert(...);
SQLiteDatabase
ที่เป็นฐานข้อมูล
หากใช้ ContentValues:
DBHelper db =new DBHelper();// your dbHelper
ContentValues values = new ContentValues();
values.put("firstName","Ahmad");
values.put("lastName","Aghazadeh");
long insertedId= db.getSQLiteDatabase().insert("user", "", values) ;
หากแบบสอบถามใช้ exec select last_insert_rowid()
String sql = "INSERT INTO [user](firstName,lastName) VALUES (\"Ahmad\",\"Aghazadeh\"); select last_insert_rowid()";
DBHelper itemType =new DBHelper();// your dbHelper
c = db.rawQuery(sql, null);
if (c.moveToFirst())
result = c.getLong(0);
ถ้าใช้ห้อง
@Entity
class User {
@PrimaryKey(autoGenerate = true)
public int id;
//...
}
@Dao
public interface UserDao{
@Insert(onConflict = OnConflictStrategy.REPLACE)
long insert(User user);
// Insert multiple users
@Insert(onConflict = OnConflictStrategy.REPLACE)
long[] insert(User... user);
}
ฉันตรวจสอบแหล่งที่มา
ฟังก์ชั่นinsert
การใช้วิธีการsqlite3_last_insert_rowid
เพื่อกลับ ID ตามเอกสารประกอบ: https://www.sqlite.org/c3ref/last_insert_rowid.html
id แถวคือคอลัมน์ที่ซ่อนอยู่หรือคอลัมน์ประเภทหนึ่งINTEGER PRIMARY KEY
หากมีการประกาศ
แต่ละรายการในตาราง SQLite ส่วนใหญ่ (ยกเว้นสำหรับ
WITHOUT ROWID
ตาราง) มีคีย์เลขจำนวนเต็มแบบ 64 บิตที่ไม่ซ้ำกันซึ่งเรียกว่า " rowid " rowid มีอยู่เสมอในคอลัมน์ที่ไม่ได้ประกาศชื่อ ROWID, OID หรือ _ROWID_ ตราบใดที่ชื่อเหล่านั้นไม่ได้ถูกใช้โดยคอลัมน์ที่ประกาศอย่างชัดเจนเช่นกัน ถ้าตารางมีคอลัมน์ชนิดแล้วคอลัมน์ที่เป็นนามแฝงสำหรับ ROWIDINTEGER PRIMARY KEY
นั่นคือ_ID
คอลัมน์เริ่มต้นโดยปกติ
ฉันมีปัญหาเล็กน้อยเกี่ยวกับเรื่องนี้ใน mySQL LAST_INSERT_ID ไม่ใช่วิธีที่เชื่อถือได้ในการรับ ID หากคุณมีผู้ใช้ตอกฐานข้อมูล ID ที่ส่งคืนอาจไม่ใช่ ID ที่แทรกโดยการสืบค้นที่คุณเรียกใช้หลาย ๆ ตัว ผู้ใช้รายอื่นอาจส่งผลกระทบต่อการส่งคืนรหัสนี้ เรามีเซิร์ฟเวอร์ที่มีผู้ใช้งานเฉลี่ย 7000 คนต่อนาทีและมันก็สะดุดเสมอ
วิธีแก้ปัญหาที่เราต้องใช้ข้อมูลจากแบบสอบถามที่คุณแทรกจากนั้นค้นหาผลลัพธ์นั้นโดยใช้ข้อมูลนั้น คุณกำลังส่งคำขอเพื่อค้นหารหัสล่าสุด ดังนั้นคุณอาจทำตาราง SELECT id จากที่ field = var และ field = var เพื่อรับ id มันมีประสิทธิภาพเล็กน้อยในการค้นหา แต่ผลลัพธ์ที่เชื่อถือได้กลับมามากขึ้น
หนึ่งก็จะได้รับแถวแทรกสุดท้าย _id last_insert_rowid()
ใช้ โค้ดตัวอย่างมีดังต่อไปนี้
/**
* Return Last inserted row id(auto incremented row) (_id)
* @return
*/
public int getLastAddedRowId() {
String queryLastRowInserted = "select last_insert_rowid()";
final Cursor cursor = database.rawQuery(queryLastRowInserted, null);
int _idLastInsertedRow = 0;
if (cursor != null) {
try {
if (cursor.moveToFirst()) {
_idLastInsertedRow = cursor.getInt(0);
}
} finally {
cursor.close();
}
}
return _idLastInsertedRow;
}