it-swarm.asia

طريقة SQLiteDatabase.query

أنا أستخدم طريقة استعلام SQLiteDatabase. كيف يمكنني استخدام طريقة الاستعلام؟

لقد جربت هذا:

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

tableColumns - يتم إنشاء المعلمة الأعمدة كما يلي.

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

إذا كنا بحاجة إلى الحصول على جميع الحقول ، فكيف يجب إنشاء معلمة العمود. هل نحن بحاجة إلى تضمين جميع أسماء الحقول في مجموعة الصفيف؟

كيف يمكنني استخدام طريقة الاستعلام بشكل صحيح؟

117
sree_iphonedev

tableColumns

  • null لجميع الأعمدة كما في SELECT * FROM ...
  • new String[] { "column1", "column2", ... } لأعمدة محددة كما في SELECT column1, column2 FROM ... - يمكنك أيضًا وضع تعبيرات معقدة هنا:
    new String[] { "(SELECT max(column1) FROM table1) AS max" } ستمنحك عمودًا باسم max يحتفظ بالقيمة القصوى لـ column1

حيث الشرطية

  • الجزء الذي وضعته بعد 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);

باستخدام إصدار Where/Bind - Args ، تحصل تلقائيًا على قيم متجنبة ولا داعي للقلق إذا كانت بيانات الإدخال تحتوي على '.

غير آمن: String whereClause = "column1='" + value + "'";
آمنة: String whereClause = "column1=?";

لأنه إذا كانت القيمة تحتوي على ' فإن العبارة إما تنقسم وتحصل على استثناءات أو تفعل أشياء غير مقصودة ، على سبيل المثال value = "XYZ'; DROP TABLE table1;--" قد تسقط طاولتك لأن البيان سيصبح بيانين وتعليقًا:

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

باستخدام إصدار args XYZ'; DROP TABLE table1;-- سيتم تجاوزه إلى 'XYZ''; DROP TABLE table1;--' وسيتم التعامل معه فقط كقيمة. حتى إذا لم يكن القصد من ' أن تفعل أشياء سيئة ، فلا يزال من الشائع جدًا أن يكون لدى الأشخاص أسماءهم أو يستخدمونها في النصوص وأسماء الملفات وكلمات المرور وما إلى ذلك. لذا استخدم دائمًا إصدار args. (لا بأس في إنشاء int وغيرها من البدائل مباشرة إلى whereClause رغم ذلك)

234
zapl

حيث جملة و args العمل معاً لتشكيل عبارة WHERE استعلام SQL. لذلك أقول لك تتطلع إلى التعبير

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

ثم يكون كل من WhereClause و whereArgs كما يلي

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

إذا كنت ترغب في تحديد جميع أعمدة الجدول ، أعتقد أن سلسلة فارغة تم تمريرها إلى tableColumns ستكون كافية.

16
Ancantus

هذه إجابة عامة تهدف إلى أن تكون مرجعًا سريعًا للمشاهدين في المستقبل.

مثال

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 String: اسم الجدول الذي يقوم بترجمة الاستعلام مقابله.
  • columns String: قائمة بالأعمدة التي يجب إرجاعها. تمرير فارغة سيعود جميع الأعمدة ، التي لا يشجعها لمنع قراءة البيانات من التخزين التي لن تستخدم.
  • selection String: عامل تصفية يعلن الصفوف التي سيتم إرجاعها ، منسقًا كجمل SQL WHERE (باستثناء WHERE نفسه). تمرير فارغة سيعود جميع الصفوف للجدول المحدد.
  • selectionArgs String: قد تدرج في التحديد ، والتي سيتم استبدالها بالقيم من selectArgs ، حتى تظهر في التحديد. سيتم ربط القيم بالسلاسل.
  • groupBy String: عامل تصفية يعلن عن كيفية تجميع الصفوف ، منسق كجمل SQL GROUP BY (باستثناء GROUP GROUP نفسه). سيؤدي تمرير فارغة إلى عدم تجميع الصفوف.
  • having String: يعلن المرشح عن مجموعات الصفوف المراد تضمينها في المؤشر ، في حالة استخدام تجميع الصفوف ، وتنسيقه كجمل SQL HAVING (باستثناء HAVING نفسه). سيؤدي تمرير خالية إلى تضمين كل مجموعات الصفوف ، وهو مطلوب عند عدم استخدام تجميع الصفوف.
  • orderBy String: كيفية ترتيب الصفوف ، المنسقة كجمل SQL ORDER BY (باستثناء ORDER BY نفسه). سيؤدي تمرير خالية إلى استخدام ترتيب الفرز الافتراضي ، والذي قد يكون غير مرتب.
  • limit String: يحد من عدد الصفوف التي يتم إرجاعها بواسطة الاستعلام ، المنسق كـ جملة LIMIT. تمرير فارغة يدل على أي شرط LIMIT.
15
Suragch

إذا كان استعلام SQL الخاص بك مثل هذا

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
Puneet Verma
 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, here "=" is the where clause

to select all values you will have to give all column names 

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

وهنا هو تعليمي جيد لقاعدة البيانات

http://www.anotherandroidblog.com/2010/08/04/Android-database-tutorial/

0
Avi Kumar Manku