সর্বাধিক বেসিক উত্তর
আমি নীচে সরল স্ক্যুএল ব্যবহার করছি যাতে সবকিছু যথাসম্ভব স্পষ্ট এবং পঠনযোগ্য। আপনার প্রকল্পে আপনি অ্যান্ড্রয়েড সুবিধার পদ্ধতিগুলি ব্যবহার করতে পারেন। db
নিচে ব্যবহৃত বস্তুর একটি দৃষ্টান্ত হল SQLiteDatabase ।
এফটিএস সারণী তৈরি করুন
db.execSQL("CREATE VIRTUAL TABLE fts_table USING fts3 ( col_1, col_2, text_column )");
এটি onCreate()
আপনার বর্ধিত SQLiteOpenHelper
শ্রেণীর পদ্ধতিতে যেতে পারে ।
জনগণের এফটিএস সারণী
db.execSQL("INSERT INTO fts_table VALUES ('3', 'apple', 'Hello. How are you?')");
db.execSQL("INSERT INTO fts_table VALUES ('24', 'car', 'Fine. Thank you.')");
db.execSQL("INSERT INTO fts_table VALUES ('13', 'book', 'This is an example.')");
এসকিউএলডিড ডাটাবেস # টি sertোকানো বা এর চেয়ে প্রস্তুত বিবৃতি ব্যবহার করা ভাল execSQL
।
এফটিএস সারণী অনুসন্ধান
String[] selectionArgs = { searchString };
Cursor cursor = db.rawQuery("SELECT * FROM fts_table WHERE fts_table MATCH ?", selectionArgs);
আপনি এসকিউএলডিটাবেস # কোয়েরি পদ্ধতিটিও ব্যবহার করতে পারেন । MATCH
কীওয়ার্ডটি নোট করুন ।
পূর্ণ উত্তর
উপরের ভার্চুয়াল এফটিএস টেবিলটিতে এটি সমস্যা রয়েছে। প্রতিটি কলাম ইনডেক্স করা হয়, তবে এটি যদি কিছু কলামকে সূচীকরণের প্রয়োজন না হয় তবে স্থান এবং সংস্থানগুলির অপচয় waste এফটিএস সূচকের প্রয়োজন একমাত্র কলামটি সম্ভবত এটি text_column
।
এই সমস্যাটি সমাধান করার জন্য আমরা একটি নিয়মিত টেবিল এবং ভার্চুয়াল এফটিএস টেবিলের সংমিশ্রণটি ব্যবহার করব। এফটিএস সারণিতে সূচি থাকবে তবে নিয়মিত সারণী থেকে আসল তথ্যগুলির মধ্যে একটিও নেই। পরিবর্তে এটিতে নিয়মিত সারণীর সামগ্রীর লিঙ্ক থাকবে। এটিকে বাহ্যিক সামগ্রী সারণী বলা হয় ।
টেবিলগুলি তৈরি করুন
db.execSQL("CREATE TABLE example_table (_id INTEGER PRIMARY KEY, col_1 INTEGER, col_2 TEXT, text_column TEXT)");
db.execSQL("CREATE VIRTUAL TABLE fts_example_table USING fts4 (content='example_table', text_column)");
লক্ষ্য করুন যে এফটিএস 3 এর চেয়ে আমাদের এটি করতে FTS4 ব্যবহার করতে হবে। এপিআই সংস্করণ ১১ এর আগে অ্যান্ড্রয়েডে এফটিএস 4 সমর্থিত নয় আপনি হয় (1) কেবলমাত্র API> = 11 এর জন্য অনুসন্ধান কার্যকারিতা সরবরাহ করতে পারেন বা (2) একটি FTS3 টেবিল ব্যবহার করতে পারেন (তবে এর অর্থ ডাটাবেস আরও বড় হবে কারণ পুরো পাঠ্য কলামটি বিদ্যমান উভয় ডাটাবেসে)।
টেবিলগুলি বসান
db.execSQL("INSERT INTO example_table (col_1, col_2, text_column) VALUES ('3', 'apple', 'Hello. How are you?')");
db.execSQL("INSERT INTO example_table (col_1, col_2, text_column) VALUES ('24', 'car', 'Fine. Thank you.')");
db.execSQL("INSERT INTO example_table (col_1, col_2, text_column) VALUES ('13', 'book', 'This is an example.')");
(আবার, সন্নিবেশ করার আরও ভাল উপায় রয়েছে এর চেয়ে ভাল execSQL
I
আপনি যদি এখনই কোনও এফটিএস কোয়েরি করার চেষ্টা করে থাকেন fts_example_table
তবে কোনও ফল পাবেন না। কারণটি হ'ল একটি টেবিল পরিবর্তন করা অন্য টেবিলে স্বয়ংক্রিয়ভাবে পরিবর্তন হয় না। আপনাকে ম্যানুয়ালি এফটিএস টেবিল আপডেট করতে হবে:
db.execSQL("INSERT INTO fts_example_table (docid, text_column) SELECT _id, text_column FROM example_table");
( docid
এটি rowid
একটি নিয়মিত টেবিলের মতো। এটি জটিল হয়ে উঠতে পারে। আপনি যদি কেবল একটি প্রাক-উত্পাদিত ডাটাবেস তৈরি করেন তবে আপনি এটি করতে পারেন
db.execSQL("INSERT INTO fts_example_table(fts_example_table) VALUES('rebuild')");
যা পুরো টেবিলটি পুনর্নির্মাণ করবে। এটি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে পরিবর্তন হতে পারে এমন কিছু নয়। বাহ্যিক সামগ্রী টেবিলের সমস্ত সন্নিবেশ সমাপ্ত করার পরে আপনি এটি করবেন। আপনার যদি ডাটাবেসগুলি স্বয়ংক্রিয়ভাবে সিঙ্কে রাখার প্রয়োজন হয় তবে আপনি ট্রিগারগুলি ব্যবহার করতে পারেন । এখানে যান এবং দিকনির্দেশগুলি খুঁজতে কিছুটা নীচে স্ক্রোল করুন।
ডাটাবেসগুলি জিজ্ঞাসা করুন
String[] selectionArgs = { searchString };
Cursor cursor = db.rawQuery("SELECT * FROM fts_example_table WHERE fts_example_table MATCH ?", selectionArgs);
এটি পূর্বের মতোই, এই সময়টি ছাড়া কেবল আপনার text_column
(এবং docid
) অ্যাক্সেস রয়েছে । আপনার যদি বাহ্যিক সামগ্রী সারণীতে অন্য কলামগুলি থেকে ডেটা নেওয়া দরকার? যেহেতু docid
এফটিএস টেবিলটি বাহ্যিক সামগ্রী সারণীর rowid
(এবং এই ক্ষেত্রে _id
) এর সাথে মেলে , আপনি একটি যোগদান ব্যবহার করতে পারেন। (এটির সহায়তার জন্য এই উত্তরের জন্য ধন্যবাদ ।)
String sql = "SELECT * FROM example_table WHERE _id IN " +
"(SELECT docid FROM fts_example_table WHERE fts_example_table MATCH ?)";
String[] selectionArgs = { searchString };
Cursor cursor = db.rawQuery(sql, selectionArgs);
আরও পড়া
এফটিএস ভার্চুয়াল টেবিলগুলি ব্যবহারের অন্যান্য উপায়গুলি সাবধানে এই নথিগুলির মধ্য দিয়ে যান:
অতিরিক্ত নোট