এসকিউএলডিটাবেস.কোয়ারী পদ্ধতি


121

আমি এসকিউএলডিটিবেসসের ক্যোয়ারী পদ্ধতিটি ব্যবহার করছি। আমি কোয়েরি পদ্ধতিটি কীভাবে ব্যবহার করব?

আমি এটি চেষ্টা করেছি:

Cursor cursor = sqLiteDatabase.query(
    tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);

টেবিলকলামগুলি - কলামগুলির প্যারামিটারটি নীচে তৈরি করা হয়েছে।

String[] columns = new String[]{KEY_ID, KEY_CONTENT};

আমাদের যদি সমস্ত ক্ষেত্র পেতে হয় তবে কলাম প্যারামিটারটি কীভাবে তৈরি করা উচিত। স্ট্রিং অ্যারেতে আমাদের সমস্ত ফিল্ডের নাম অন্তর্ভুক্ত করা দরকার?

আমি কীভাবে সঠিকভাবে ক্যোয়ারী পদ্ধতিটি ব্যবহার করব?


1
মত সরল পদ্ধতির ব্যবহার করে দেখুন এই
ইমরান রানা

আমি যে পদ্ধতি জানি। তবে আমি কাঁচা-কুয়েরির পরিবর্তে কীভাবে কীভাবে পদ্ধতি প্রয়োগ করতে পারি তা শিখার চেষ্টা করছি।
শ্রী_আইফোনদেভ

উত্তর:


244

tableColumns

  • null হিসাবে সমস্ত কলামের জন্য SELECT * FROM ...
  • new String[] { "column1", "column2", ... }নির্দিষ্ট কলামগুলির জন্য যেমন SELECT column1, column2 FROM ...- আপনি এখানে জটিল ভাব প্রকাশ করতে পারেন:
    new String[] { "(SELECT max(column1) FROM table1) AS max" }আপনাকে maxসর্বাধিক মান ধারণ করে একটি কলাম দেবেcolumn1

whereClause

  • WHEREযে কীওয়ার্ড ছাড়াই আপনি যে অংশটি রেখেছেন তা যেমন"column1 > 5"
  • ?গতিশীল জিনিসগুলির জন্য অন্তর্ভুক্ত করা উচিত , যেমন "column1=?"-> দেখুনwhereArgs

whereArgs

  • বিষয়বস্তু প্রতিটি পূরণ উল্লেখ ?মধ্যে whereClauseক্রমে দেখানো মধ্যে

অন্যরা

  • ঠিক whereClauseশব্দ পরে বা বিবৃতি nullযদি আপনি এটি ব্যবহার করবেন না।

উদাহরণ

String[] tableColumns = new String[] {
    "column1",
    "(SELECT max(column1) FROM table2) AS max"
};
String whereClause = "column1 = ? OR column1 = ?";
String[] whereArgs = new String[] {
    "value1",
    "value2"
};
String orderBy = "column1";
Cursor c = sqLiteDatabase.query("table1", tableColumns, whereClause, whereArgs,
        null, null, orderBy);

// since we have a named column we can do
int idx = c.getColumnIndex("max");

নিম্নলিখিত কাঁচা কোয়েরির সমতুল্য

String queryString =
    "SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
    "WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);

যেখানে / বাইন্ড -আরগস সংস্করণটি ব্যবহার করে আপনি স্বয়ংক্রিয়ভাবে মূল্যগুলি পালিয়ে যান এবং ইনপুট-ডেটা রয়েছে কিনা তা আপনার চিন্তা করার দরকার নেই '

অনিরাপদ: String whereClause = "column1='" + value + "'";
নিরাপদ:String whereClause = "column1=?";

কারণ মানটিতে যদি 'আপনার বিবৃতি থাকে তবে তা ভঙ্গ হয় এবং আপনি ব্যতিক্রম পান বা অনিচ্ছাকৃত জিনিসগুলি করেন, উদাহরণস্বরূপ value = "XYZ'; DROP TABLE table1;--"এমনকি আপনার টেবিলটি এমনকি ড্রপ হতে পারে যেহেতু বিবৃতিটি দুটি বিবৃতি এবং একটি মন্তব্য হয়ে যাবে:

SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'

আরগস সংস্করণটি ব্যবহার করে XYZ'; DROP TABLE table1;--পালাতে হবে 'XYZ''; DROP TABLE table1;--'এবং কেবলমাত্র একটি মান হিসাবে বিবেচিত হবে। এমনকি 'খারাপ কাজ করার উদ্দেশ্য না থাকলেও এটি এখনও সাধারণ বিষয় যে এটি লোকেরা তাদের নামে রয়েছে বা এটি পাঠ্য, ফাইলের নাম, পাসওয়ার্ড ইত্যাদিতে ব্যবহার করেন তাই সর্বদা আরগস সংস্করণটি ব্যবহার করুন। ( intসরাসরি whereClauseযদিও এর মধ্যে অন্যান্য আদিমগুলি তৈরি করা ঠিক আছে )


এই ... গ্রুপের মধ্যে সীমা / অফসেট কোথায় পড়ে? হচ্ছে? orderby?
সিংহ 789

3
@ Lion789 বেশ কিছু সংস্করণ একটি আছে যে limitপরামিতি, যেমন developer.android.com/reference/android/database/sqlite/... এটা শেষ মাত্র সহজ টেক্সট সংযুক্তকরণের যাতে আপনি যেমন লাগাতে পারেন এর "some_column LIMIT 10"মধ্যে orderByএবং এটি এখনও কাজ করবে
zapl

2 টি টেবিলে যোগদানের জন্য এখানে কোনও বিকল্প?
বিজয় কুম্ভোজ

2
@ বিজয় কুম্ভোজে আপনি যেমন টেবিলের নাম table1 CROSS JOIN table2হিসাবে রাখতে সক্ষম হবেন । কিন্তু একটি বিন্দু যেখানে আমি rawquery এ দেখাবে হল: stackoverflow.com/q/10598137/995891
zapl

3
@ বিজয় কুম্ভোজে আপনি যতই স্বাচ্ছন্দ্যবোধ করেন / শেষ পর্যন্ত পরিষ্কার দেখায়। queryপদ্ধতি নিছক মত কয়েক কীওয়ার্ড যোগ করা হয় SELECTএবং FROMআর্গুমেন্ট (উৎস দেখুন) তারপর একটি না rawQueryফলে কোয়েরি স্ট্রিং সঙ্গে। যদি আপনার কোয়েরিটি উপলভ্য আর্গুমেন্টগুলির সাথে ভালভাবে ফিট না করে তবে queryকেবল নিজেরাই ক্যোয়ারীর স্ট্রিং লিখুন।
zapl

21

এটি ভবিষ্যতের দর্শকদের জন্য দ্রুত রেফারেন্স হিসাবে বোঝানো আরও সাধারণ উত্তর।

উদাহরণ

SQLiteDatabase db = helper.getReadableDatabase();

String table = "table2";
String[] columns = {"column1", "column3"};
String selection = "column3 =?";
String[] selectionArgs = {"apple"};
String groupBy = null;
String having = null;
String orderBy = "column3 DESC";
String limit = "10";

Cursor cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);

ডকুমেন্টেশন থেকে ব্যাখ্যা

  • table স্ট্রিং: সিকিউরিটির বিরুদ্ধে কোয়েরিটি সংকলনের নাম।
  • columns স্ট্রিং: কোন কলামগুলি ফিরবে তার একটি তালিকা। নাল পাস করলে সমস্ত কলাম ফিরে আসবে, যা ব্যবহার করা হচ্ছে না এমন স্টোরেজ থেকে ডেটা পড়া রোধ করতে নিরুৎসাহিত করা হয়।
  • selection স্ট্রিং: একটি ফিল্টার ঘোষনা করছে যে কোন সারিটি ফিরে আসবে, এসকিউএল WHERE ধারা হিসাবে ফর্ম্যাট হয়েছে (নিজেই বাদ দিয়ে)। নাল পাস করা প্রদত্ত টেবিলের জন্য সমস্ত সারি ফিরিয়ে দেবে।
  • selectionArgs স্ট্রিং: আপনি বাছাইয়ের ক্ষেত্রে অন্তর্ভুক্ত করতে পারেন, যা নির্বাচনআরগ থেকে মান দ্বারা প্রতিস্থাপন করা হবে, যাতে তারা নির্বাচনের মধ্যে উপস্থিত হয়। মানগুলি স্ট্রিং হিসাবে আবদ্ধ হবে।
  • groupBy স্ট্রিং: একটি ফিল্টার ঘোষনা করে কীভাবে সারিগুলিকে গ্রুপ করা যায়, এসকিউএল গ্রুপ দ্বারা বিভাজন (নিজেই গ্রুপটি বাদ দিয়ে) format নাল পাস করার ফলে সারিগুলি গোষ্ঠীভুক্ত করা হবে না।
  • having স্ট্রিং: একটি ফিল্টার ঘোষণা করে যে কোন সারি গ্রুপকে কার্সারে অন্তর্ভুক্ত করতে হবে, যদি সারি গ্রুপিং ব্যবহার করা হয়, এসকিউএল হ্যাভিং ধারা হিসাবে ফর্ম্যাট করা হয় (নিজেই বাদ দিচ্ছে)। নাল পাস করার ফলে সমস্ত সারি গোষ্ঠীগুলি অন্তর্ভুক্ত হবে এবং সারি গ্রুপিং ব্যবহার না করা অবস্থায় এটি প্রয়োজনীয়।
  • orderBy স্ট্রিং: কীভাবে সারিগুলি অর্ডার করবেন, এসকিউএল অর্ডার বাই ক্লজ হিসাবে ফর্ম্যাট করা (নিজেই অর্ডার বাদ দিয়ে)। নাল পাস করা ডিফল্ট ক্রম অর্ডারটি ব্যবহার করবে, যা আনর্ডারড হতে পারে।
  • limit স্ট্রিং: সীমাবদ্ধতার সীমা সীমাবদ্ধ করে ক্যোয়ারী, এলএমটি ধারা হিসাবে ফর্ম্যাট করে। নাল পাস করার ফলে কোনও সীমাবদ্ধ বিধি বোঝায় না।

16

যেখানে ক্লজ এবং আরগগুলি এসকিউএল ক্যোয়ারীর WHERE স্টেটমেন্ট গঠনের জন্য একসাথে কাজ করে। সুতরাং আপনি প্রকাশ খুঁজছেন বলে

WHERE Column1 = 'value1' AND Column2 = 'value2'

তারপরে আপনার হায়ার ক্লাউজ এবং যেখানে আর্গগুলি নীচে থাকবে

String whereClause = "Column1 =? AND Column2 =?";
String[] whereArgs = new String[]{"value1", "value2"};

আপনি যদি সমস্ত টেবিল কলাম নির্বাচন করতে চান তবে আমি বিশ্বাস করি যে টেবিলকলামগুলিতে নাল স্ট্রিং যথেষ্ট হবে।


ঘিরা না ?মধ্যে ', 'স্বয়ংক্রিয়ভাবে প্রয়োজনে যোগ করা হয়
zapl

1

যদি আপনার এসকিউএল কোয়েরিটি এর মতো হয়

SELECT col-1, col-2 FROM tableName WHERE col-1=apple,col-2=mango
GROUPBY col-3 HAVING Count(col-4) > 5  ORDERBY col-2 DESC LIMIT 15;

তারপরে কোয়েরি () পদ্ধতির জন্য, আমরা এটি করতে পারি: -

String table = "tableName";
String[] columns = {"col-1", "col-2"};
String selection = "col-1 =? AND col-2=?";       
String[] selectionArgs = {"apple","mango"};
String groupBy =col-3;
String having =" COUNT(col-4) > 5";
String orderBy = "col-2 DESC";
String limit = "15";

query(tableName, columns, selection, selectionArgs, groupBy, having, orderBy, limit);

0
db.query(
        TABLE_NAME,
        new String[] { TABLE_ROW_ID, TABLE_ROW_ONE, TABLE_ROW_TWO },
        TABLE_ROW_ID + "=" + rowID,
        null, null, null, null, null
);

TABLE_ROW_ID + "=" + rowIDএখানে =হয় whereদফা। সমস্ত মান নির্বাচন করতে আপনাকে সমস্ত কলামের নাম দিতে হবে:

or you can use a raw query like this 
db.rawQuery("SELECT * FROM permissions_table WHERE name = 'Comics' ", null);

এবং এখানে ডাটাবেস জন্য একটি ভাল টিউটোরিয়াল

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