Generatedোকানোর পরে উত্পন্ন আইডি পান


138

আমি অ্যান্ড্রয়েড সহ এসকিউএলাইট ব্যবহার করছি এবং আমি যে সারিটি সন্নিবেশ করিয়েছি তার উত্পন্ন আইডি পাওয়ার সেরা উপায়টি জানতে চাই।

আমার মতে একটি সমাধান অন্তর্ভুক্ত করার পরে অনুসন্ধান করে তবে এটি সর্বোত্তম উপায় বলে মনে হয় না।

উত্তর:


271

insertপদ্ধতি আয় idসারির শুধু ঢোকানো বা -1যদি সন্নিবেশ সময় একটি ত্রুটি হয়েছিল।

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

যেখানে ডিবি হয় SQLiteDatabase


21
আমি চশমা পড়া। "রিটার্নস: সদ্য sertedোকানো সারিটির সারি আইডি, বা -1 ত্রুটি দেখা দিলে" রো-আইডটি কি আমার উত্পন্ন ক্ষেত্রের মতো "আইডি প্রাথমিক কী স্বতঃআগ্রহ"?
মার্কোস ভাসকনস্লোস

29
হ্যাঁ, এটি একই রকম।
গ্র্যান্ড এবং

3
@ জিআরএন্ড, তবে কী হবে যদি আমি আমার টেবিলের কিছু "শুরু-মাঝারি" সারিগুলি মুছব, তাই আমি উত্পন্ন আইডি = এন দিয়ে এন-থ সারিগুলির ক্রমটি ভেঙে ফেলব। ফিরে আসা সারির আইডি কি উত্পন্ন স্বতঃআগ্রহক আইডির মতো থাকবে?
অজানা

1
আপনার যদি INSERT বা আপডেট করার দরকার হয় এবং আইডিটি পাওয়া যায়?
টিমো

1
@ অজানাজ আমি জানি এটি পুরানো পোস্ট। তবে কারও পক্ষে সহায়ক হতে পারে। মাঝামাঝি থেকে মুছে ফেলা হলেও সারি আইডি এবং স্বয়ংসিহিত আইডি সমান হবে।
রাজ কানান আইয়্যাপ্পান

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_rowidfunction ডকুমেন্টেশন অনুসারে: https://www.sqlite.org/c3ref/last_insert_rowid.html সারি আইডি হ'ল লুকানো কলাম বা প্রকারের একটি কলাম INTEGER PRIMARY KEYএটি ঘোষণা করা থাকলে।

বেশিরভাগ এসকিউএলাইট টেবিলের প্রতিটি প্রবেশের (টেবিলগুলি বাদে WITHOUT ROWID) একটি অনন্য -৪ -বিট স্বাক্ষরিত পূর্ণসংখ্যা কী থাকে যার নাম " রোউইড "। এই নামগুলি স্পষ্টভাবে ঘোষিত কলামগুলির দ্বারা যতক্ষণ না ব্যবহার করা হয় ততক্ষণ রাউইডটি সর্বদা রাউইড, ওআইডি, বা _ROWID_ নামে একটি অঘোষিত কলাম হিসাবে উপলব্ধ। যদি টেবিলটিতে একটি কলামের টাইপ থাকেINTEGER PRIMARY KEY তবে সেই কলামটি রোউইডের জন্য অন্য একটি উপনাম

সুতরাং এটি _IDসাধারণত ডিফল্ট কলাম হয়


1

আমার এসএসকিউএলে এটি নিয়ে আমার বেশ খানিকটা সমস্যা ছিল, LAST_INSERT_ID আইডি পাওয়ার জন্য নির্ভরযোগ্য উপায় নয়, আপনার যদি ব্যবহারকারীরা ডাটাবেসকে হাতুড়ি দিয়ে থাকেন, ফিরে আসা আইডিটি আপনার চালানো ক্যোয়ারী দ্বারা wasোকানো আইডি নাও হতে পারে, বেশ কয়েকটি অন্যান্য ব্যবহারকারীরা এই আইডি ফিরে আসার উপর প্রভাব ফেলতে পারে। আমাদের কাছে এক মিনিটে হাতুড়ি দিয়ে গড়ে 000০০০ জন ব্যবহারকারী সহ সার্ভার রয়েছে এবং এটি সর্বদা হোঁচট খায়।

আমাদের যে সমাধানটি হয়েছিল তা হ'ল আপনি inোকানো ক্যোয়ারী থেকে ডেটা ব্যবহার করা, এবং তারপরে সেই ডেটা ব্যবহার করে সেই ফলাফলটি অনুসন্ধান করা। আপনি যাইহোক শেষ আইডি সন্ধানের জন্য একটি অনুরোধ করছেন। সুতরাং আপনি পাশাপাশি সারণী থেকে একটি নির্বাচন আইডি করতে পারেন যেখানে ID = পেতে ক্ষেত্র = var এবং ক্ষেত্র = var। এটি একটি সামান্য পারফরম্যান্স ক্যোরির উপর আঘাত হানা, কিন্তু আরও অনেক নির্ভরযোগ্য ফলাফল ফিরে আসল।


3
এর জন্য প্রতিটি সারিটির জন্য আপনার কলামের মানগুলি অনন্য (বা বেশিরভাগ অনন্য) হওয়া বা একাধিক আইডির ঝুঁকিপূর্ণ হওয়া প্রয়োজন।
রিচার্ড বার্কার

0

সহজেই সর্বশেষ rowোকানো সারি _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;

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.