सम्मिलित होने के बाद जनरेट आईडी प्राप्त करें


138

मैं एंड्रॉइड के साथ SQLite का उपयोग कर रहा हूं, और मेरे द्वारा डाली गई पंक्ति की उत्पन्न आईडी प्राप्त करने का सबसे अच्छा तरीका जानना चाहता हूं।

एक समाधान मुझे लगता है कि शामिल करने के बाद एक खोज करता है, लेकिन यह सबसे अच्छा तरीका नहीं दिखता है।

जवाबों:


271

insertविधि रिटर्न idपंक्ति का सिर्फ डाला जाता है या -1अगर वहाँ प्रविष्टि के दौरान एक त्रुटि हुई।

long id = db.insert(...);

जहां डाटाबेस है SQLiteDatabase


21
मैं ऐनक पर पढ़ता हूं। "रिटर्न: नई सम्मिलित पंक्ति की पंक्ति ID, या -1 यदि कोई त्रुटि हुई है" पंक्ति आईआईडी मेरे उत्पन्न फ़ील्ड "आईडी प्राथमिक कुंजी ऑटोइन्क्रिमेंट" के समान है?
मार्कोस वास्कोनसेलोस

29
हाँ, यह वही है।
ग्रैन्ड

3
@GrAnd, लेकिन क्या होगा अगर मैं अपनी तालिका में कुछ "स्टार्ट-मध्य" पंक्तियों को हटा दूंगा, इसलिए मैं उत्पन्न आईडी = n के साथ n-th पंक्तियों के अनुक्रम को तोड़ता हूं। क्या वह लौटी हुई पंक्ति आईडी जेनरेट किए गए ऑटोइंटरमेंट आईडी जैसी ही रहेगी?
अज्ञातजे

1
यदि आपको INSERT या UPDATE करने और आईडी प्राप्त करने की आवश्यकता है, तो क्या होगा?
तिमो

1
@UnognJoe मुझे पता है कि यह पुरानी पोस्ट है। लेकिन किसी के लिए मददगार हो सकता है। बीच में से डिलीट होने पर भी पंक्ति आईडी और ऑटोइंक्रिएटेड आईडी समान होगी।
राज कन्नन अय्यप्पन

8

यदि सामग्री का उपयोग करें:

 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);
}

5

मैंने सूत्रों की जाँच की। 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आमतौर पर डिफ़ॉल्ट कॉलम है


1

मेरे पास mySQL पर इसके साथ काफी समस्याएं थीं, LAST_INSERT_ID आईडी प्राप्त करने का विश्वसनीय तरीका नहीं है, यदि आपके पास डेटाबेस को संभालने वाले उपयोगकर्ता हैं, तो लौटा आईडी वह आईडी नहीं हो सकती है जिसे आपके द्वारा चलाए गए क्वेरी द्वारा डाला गया था, कई अन्य उपयोगकर्ता इस आईडी की वापसी पर प्रभाव डाल सकते हैं। हमारे पास औसतन 7000 उपयोगकर्ताओं के साथ एक मिनट का हथौड़ा चलाने वाला सर्वर था और यह हमेशा लड़खड़ाता रहता था।

हमारे पास जो समाधान था वह आपके द्वारा डाली गई क्वेरी से डेटा का उपयोग करने के लिए था, और फिर उस डेटा का उपयोग करके उस परिणाम की खोज करें। आप वैसे भी अंतिम आईडी की तलाश में एक अनुरोध कर रहे हैं। तो आप सेलेक्ट आईडी से एक सेलेक्ट आईडी भी कर सकते हैं, जहां आईडी पाने के लिए फ़ील्ड = var और फ़ील्ड = var है। क्वेरी पर इसका हल्का प्रदर्शन हिट रहा, लेकिन बहुत अधिक विश्वसनीय परिणाम लौटा।


3
इसके लिए प्रत्येक पंक्ति के लिए आपके कॉलम मान अद्वितीय (या अधिकांशतः अद्वितीय) या कई आईडी वापस करने का जोखिम होना चाहिए।
रिचर्ड बार्कर

0

एक बस का उपयोग कर अंतिम सम्मिलित पंक्ति प्राप्त कर सकते हैं 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;

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.