আমি অ্যান্ড্রয়েড সহ এসকিউএলাইট ব্যবহার করছি এবং আমি যে সারিটি সন্নিবেশ করিয়েছি তার উত্পন্ন আইডি পাওয়ার সেরা উপায়টি জানতে চাই।
আমার মতে একটি সমাধান অন্তর্ভুক্ত করার পরে অনুসন্ধান করে তবে এটি সর্বোত্তম উপায় বলে মনে হয় না।
আমি অ্যান্ড্রয়েড সহ এসকিউএলাইট ব্যবহার করছি এবং আমি যে সারিটি সন্নিবেশ করিয়েছি তার উত্পন্ন আইডি পাওয়ার সেরা উপায়টি জানতে চাই।
আমার মতে একটি সমাধান অন্তর্ভুক্ত করার পরে অনুসন্ধান করে তবে এটি সর্বোত্তম উপায় বলে মনে হয় না।
উত্তর:
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
function ডকুমেন্টেশন অনুসারে: https://www.sqlite.org/c3ref/last_insert_rowid.html
সারি আইডি হ'ল লুকানো কলাম বা প্রকারের একটি কলাম INTEGER PRIMARY KEY
এটি ঘোষণা করা থাকলে।
বেশিরভাগ এসকিউএলাইট টেবিলের প্রতিটি প্রবেশের (টেবিলগুলি বাদে
WITHOUT ROWID
) একটি অনন্য -৪ -বিট স্বাক্ষরিত পূর্ণসংখ্যা কী থাকে যার নাম " রোউইড "। এই নামগুলি স্পষ্টভাবে ঘোষিত কলামগুলির দ্বারা যতক্ষণ না ব্যবহার করা হয় ততক্ষণ রাউইডটি সর্বদা রাউইড, ওআইডি, বা _ROWID_ নামে একটি অঘোষিত কলাম হিসাবে উপলব্ধ। যদি টেবিলটিতে একটি কলামের টাইপ থাকেINTEGER PRIMARY KEY
তবে সেই কলামটি রোউইডের জন্য অন্য একটি উপনাম ।
সুতরাং এটি _ID
সাধারণত ডিফল্ট কলাম হয়
আমার এসএসকিউএলে এটি নিয়ে আমার বেশ খানিকটা সমস্যা ছিল, LAST_INSERT_ID আইডি পাওয়ার জন্য নির্ভরযোগ্য উপায় নয়, আপনার যদি ব্যবহারকারীরা ডাটাবেসকে হাতুড়ি দিয়ে থাকেন, ফিরে আসা আইডিটি আপনার চালানো ক্যোয়ারী দ্বারা wasোকানো আইডি নাও হতে পারে, বেশ কয়েকটি অন্যান্য ব্যবহারকারীরা এই আইডি ফিরে আসার উপর প্রভাব ফেলতে পারে। আমাদের কাছে এক মিনিটে হাতুড়ি দিয়ে গড়ে 000০০০ জন ব্যবহারকারী সহ সার্ভার রয়েছে এবং এটি সর্বদা হোঁচট খায়।
আমাদের যে সমাধানটি হয়েছিল তা হ'ল আপনি inোকানো ক্যোয়ারী থেকে ডেটা ব্যবহার করা, এবং তারপরে সেই ডেটা ব্যবহার করে সেই ফলাফলটি অনুসন্ধান করা। আপনি যাইহোক শেষ আইডি সন্ধানের জন্য একটি অনুরোধ করছেন। সুতরাং আপনি পাশাপাশি সারণী থেকে একটি নির্বাচন আইডি করতে পারেন যেখানে ID = পেতে ক্ষেত্র = var এবং ক্ষেত্র = var। এটি একটি সামান্য পারফরম্যান্স ক্যোরির উপর আঘাত হানা, কিন্তু আরও অনেক নির্ভরযোগ্য ফলাফল ফিরে আসল।
সহজেই সর্বশেষ 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;
}