从SQLite数据库Android SDK获取随机行

蒂斯93H

我想从我创建的数据库中获取随机行,但是我不知道该怎么做。

我在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);
        }
    }
}

有没有一种方法可以实现该数据库类的“查询”方法,如果可以,如何实现?还是有人建议使用其他数据库代码?

编辑:

我可能没有在这里问正确的问题...我的问题是,此时使用答案中给出的任何方法,例如

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的代码中已经有正确查询的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从SQLite数据库Android SDK获取随机行

来自分类Dev

从android中的sqlite数据库获取随机数据

来自分类Dev

从SQLite数据库Android获取arraylist

来自分类Dev

从sqlite数据库获取数据作为livedata android

来自分类Dev

从 Android 中的 SQLite 数据库获取数据?

来自分类Dev

适用于Android SDK的SQLite数据库

来自分类Dev

从Android应用程序获取SQLite数据库

来自分类Dev

如何从Android中的SQLite数据库获取空值

来自分类Dev

Android在SQLite数据库文件中获取Sharedpreferences

来自分类Dev

Android从Sqlite数据库保存并获取图像

来自分类Dev

Android如何从SQLite数据库的列中获取值

来自分类Dev

如何从Android中的SQLite数据库获取空值

来自分类Dev

从Android应用程序获取SQLite数据库

来自分类Dev

从Android中的SQLite数据库中获取德语字符

来自分类Dev

如何从Android中的SQLite数据库获取名称

来自分类Dev

从数据库android sqlite获取并设置布尔类型

来自分类Dev

SQLite数据库更新一行Android

来自分类Dev

在Android中打印SQLite数据库的所有行

来自分类Dev

Android中的SQLite数据库返回零行

来自分类Dev

Android:从数据库获取特定行

来自分类Dev

获取SQLite数据库的内存

来自分类Dev

SQLite从数据库获取表数

来自分类Dev

SQLite获取数据库方法缓慢

来自分类Dev

获取Sqlite数据库的版本

来自分类Dev

如何在Android中从sqlite数据库插入和获取数据?

来自分类Dev

SDcard上的android SQLite数据库,无需使用SQLiteOpenHelper即可插入数据并获取结果

来自分类Dev

无法从Android中自行创建的sqlite数据库中获取数据

来自分类Dev

根据内容查询获取sqlite数据库行的id

来自分类Dev

Sqlite3数据库文件在android设备中不起作用[Corona SDK]

Related 相关文章

热门标签

归档