Получить случайную строку из базы данных SQLite Android SDK

Я хочу получить случайную строку из базы данных, которую я создал, но я не могу понять, как это сделать.

Я нашел несколько вопросов и ответов здесь, в StackOverflow, которые говорят, что я должен использовать это:

Cursor cursor = this.db.query("mainTable Order BY RANDOM() LIMIT 1", new String[] { "*" }, null, null, null, null, null); 

Тем не менее, я думаю, что у меня есть какая-то другая база данных, потому что она возвращает ошибку, не зная метод «запрос».

Это код базы данных, который я использую:

 package com.example.database; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class DBAdapter{ private static final String TAG = "DBAdapter"; public static final String KEY_ROWID = "_id"; public static final int COL_ROWID = 0; public static final String KEY_PIC = "picture"; public static final String KEY_ANS = "answer"; public static final int COL_PIC = 1; public static final int COL_ANS = 2; public static final String[] ALL_KEYS = new String[] {KEY_ROWID, KEY_PIC, KEY_ANS}; public static final String DATABASE_NAME = "MyDb"; public static final String DATABASE_TABLE = "mainTable"; public static final int DATABASE_VERSION = 2; private static final String DATABASE_CREATE_SQL = "create table " + DATABASE_TABLE + " (" + KEY_ROWID + " integer primary key autoincrement, " + KEY_PIC + " integer not null, " + KEY_ANS + " text not null" + ");"; private final Context context; private DatabaseHelper myDBHelper; private SQLiteDatabase db; public GevaarherkenningDBHelper(Context ctx) { this.context = ctx; myDBHelper = new DatabaseHelper(context); } public GevaarherkenningDBHelper open() { db = myDBHelper.getWritableDatabase(); return this; } public void close() { myDBHelper.close(); } public long insertRow(int pic, String answer) { ContentValues initialValues = new ContentValues(); initialValues.put(KEY_PIC, pic); initialValues.put(KEY_ANS, answer); return db.insert(DATABASE_TABLE, null, initialValues); } public boolean deleteRow(long rowId) { String where = KEY_ROWID + "=" + rowId; return db.delete(DATABASE_TABLE, where, null) != 0; } public void deleteAll() { Cursor c = getAllRows(); long rowId = c.getColumnIndexOrThrow(KEY_ROWID); if (c.moveToFirst()) { do { deleteRow(c.getLong((int) rowId)); } while (c.moveToNext()); } c.close(); } public Cursor getAllRows() { String where = null; Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, where, null, null, null, null, null); if (c != null) { c.moveToFirst(); } return c; } public Cursor getRow(long rowId) { String where = KEY_ROWID + "=" + rowId; Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, where, null, null, null, null, null); if (c != null) { c.moveToFirst(); } return c; } public Cursor getRowRandom(String rowId) { Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, null, null, null, null, "RANDOM()", "1"); if (c != null) { c.moveToFirst(); } return c; } public boolean updateRow(long rowId, int pic, String answer) { String where = KEY_ROWID + "=" + rowId; ContentValues newValues = new ContentValues(); newValues.put(KEY_PIC, pic); newValues.put(KEY_ANS, answer); return db.update(DATABASE_TABLE, newValues, where, null) != 0; } private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase _db) { _db.execSQL(DATABASE_CREATE_SQL); } @Override public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading application's database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data!"); _db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); onCreate(_db); } } } 

Есть ли способ, которым я могу реализовать метод query? – это класс базы данных, и если да, то каким образом? Или кто-нибудь предлагает использовать другой код базы данных?

РЕДАКТИРОВАТЬ:

Вероятно, я не задал здесь правильный вопрос … Моя проблема заключается в том, что с использованием любого из методов, приведенных в ответах на данный момент, таких как

 db.rawQuery("SELECT * FROM mainTable ORDER BY RANDOM() LIMIT 1", null); 

Возвращает ошибку, которая не определена.

Итак, что мне нужно изменить в коде адаптера базы данных, чтобы правильно использовать этот код?

Попробуйте удалить this и убедитесь, что ваш db является SQLiteDatabase. Также вы можете получить случайную строку следующим образом:

 db.rawQuery("SELECT * FROM mainTable ORDER BY RANDOM() LIMIT 1", null); 

Кстати, у вас уже есть метод getRowRandom в коде с правильным запросом.

SQLiteDatabase query() – это метод в SQLiteDatabase . Вы уже используете query() в своем классе DBAdapter , например, в getAllRows() .