मैं एंड्रॉइड के साथ SQLite का उपयोग कर रहा हूं, और मेरे द्वारा डाली गई पंक्ति की उत्पन्न आईडी प्राप्त करने का सबसे अच्छा तरीका जानना चाहता हूं।
एक समाधान मुझे लगता है कि शामिल करने के बाद एक खोज करता है, लेकिन यह सबसे अच्छा तरीका नहीं दिखता है।
मैं एंड्रॉइड के साथ SQLite का उपयोग कर रहा हूं, और मेरे द्वारा डाली गई पंक्ति की उत्पन्न आईडी प्राप्त करने का सबसे अच्छा तरीका जानना चाहता हूं।
एक समाधान मुझे लगता है कि शामिल करने के बाद एक खोज करता है, लेकिन यह सबसे अच्छा तरीका नहीं दिखता है।
जवाबों:
insert
विधि रिटर्न id
पंक्ति का सिर्फ डाला जाता है या -1
अगर वहाँ प्रविष्टि के दौरान एक त्रुटि हुई।
long id = db.insert(...);
जहां डाटाबेस है SQLiteDatabase
।
यदि सामग्री का उपयोग करें:
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) ;
यदि क्वेरी का उपयोग करें 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
एक आईडी वापस करने के लिए समारोह का उपयोग करें । प्रलेखन के अनुसार: https://www.sqlite.org/c3ref/last_insert_rowid.html
पंक्ति आईडी छुपा स्तंभ या प्रकार का स्तंभ है INTEGER PRIMARY KEY
यदि यह घोषित किया गया है।
अधिकांश SQLite तालिकाओं (तालिकाओं को छोड़कर
WITHOUT ROWID
) में प्रत्येक प्रविष्टि में एक अद्वितीय 64-बिट हस्ताक्षरित पूर्णांक कुंजी है जिसे " पंक्ति " कहा जाता है । पंक्ति हमेशा ROWID, OID, या _ROWID_ नाम के एक अघोषित कॉलम के रूप में उपलब्ध है, जब तक कि उन नामों को भी स्पष्ट रूप से घोषित कॉलम द्वारा उपयोग नहीं किया जाता है। यदि तालिका में एक प्रकार का स्तंभ है,INTEGER PRIMARY KEY
तो वह कॉलम पंक्ति के लिए एक अन्य उपनाम है ।
तो यह _ID
आमतौर पर डिफ़ॉल्ट कॉलम है
मेरे पास mySQL पर इसके साथ काफी समस्याएं थीं, LAST_INSERT_ID आईडी प्राप्त करने का विश्वसनीय तरीका नहीं है, यदि आपके पास डेटाबेस को संभालने वाले उपयोगकर्ता हैं, तो लौटा आईडी वह आईडी नहीं हो सकती है जिसे आपके द्वारा चलाए गए क्वेरी द्वारा डाला गया था, कई अन्य उपयोगकर्ता इस आईडी की वापसी पर प्रभाव डाल सकते हैं। हमारे पास औसतन 7000 उपयोगकर्ताओं के साथ एक मिनट का हथौड़ा चलाने वाला सर्वर था और यह हमेशा लड़खड़ाता रहता था।
हमारे पास जो समाधान था वह आपके द्वारा डाली गई क्वेरी से डेटा का उपयोग करने के लिए था, और फिर उस डेटा का उपयोग करके उस परिणाम की खोज करें। आप वैसे भी अंतिम आईडी की तलाश में एक अनुरोध कर रहे हैं। तो आप सेलेक्ट आईडी से एक सेलेक्ट आईडी भी कर सकते हैं, जहां आईडी पाने के लिए फ़ील्ड = var और फ़ील्ड = var है। क्वेरी पर इसका हल्का प्रदर्शन हिट रहा, लेकिन बहुत अधिक विश्वसनीय परिणाम लौटा।
एक बस का उपयोग कर अंतिम सम्मिलित पंक्ति प्राप्त कर सकते हैं 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;
}