Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách sử dụng RANDOM() trong SQLite Android

Mục đích

Hàm RANDOM() sinh số ngẫu nhiên. Dùng trong ORDER BY RANDOM() để xáo trộn thứ tự bản ghi khi SELECT.

Ví dụ: Hiển thị danh sách ngẫu nhiên

DatabaseHelper.java

package com.example.randomdemo;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;

class DatabaseHelper extends SQLiteOpenHelper {
    static final String DB_NAME = "salaryDatabase";
    static final String TABLE = "SalaryDetails";

    DatabaseHelper(Context context) {
        super(context, DB_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE + 
            "(id INTEGER PRIMARY KEY, name TEXT, salary REAL, datetime DEFAULT CURRENT_TIMESTAMP)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int old, int n) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE);
        onCreate(db);
    }

    boolean insert(String name, String salary) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put("name", name);
        cv.put("salary", salary);
        db.insert(TABLE, null, cv);
        return true;
    }

    // ORDER BY RANDOM() xáo trộn thứ tự mỗi lần truy vấn
    ArrayList<String> getAllContacts() {
        ArrayList<String> list = new ArrayList<>();
        SQLiteDatabase db = getReadableDatabase();
        Cursor c = db.rawQuery(
            "SELECT (id || ' : ' || name || ' : ' || salary || ' : ' || datetime) AS fullname " +
            "FROM " + TABLE + " ORDER BY RANDOM()", null);

        if (c.moveToFirst()) {
            do {
                list.add(c.getString(c.getColumnIndexOrThrow("fullname")));
            } while (c.moveToNext());
        }
        c.close();
        return list;
    }

    boolean update(String name, String salary) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put("name", name);
        cv.put("salary", salary);
        db.update(TABLE, cv, "name=?", new String[]{name});
        return true;
    }

    boolean delete() {
        getWritableDatabase().delete(TABLE, null, null);
        return true;
    }
}

Kết quả

Mỗi lần nhấn nút Làm mới, danh sách hiển thị theo thứ tự ngẫu nhiên khác nhau.

Ứng dụng thực tế

  • Quiz app: xáo trộn câu hỏi/đáp án.
  • Gợi ý ngẫu nhiên: món ăn, bài viết, sản phẩm.
  • Chia nhóm ngẫu nhiên.

Hiệu năng

ORDER BY RANDOM() quét toàn bảng và sắp xếp - chậm trên bảng lớn (>10k rows). Giải pháp thay thế:

-- Lấy 1 record ngẫu nhiên nhanh hơn
SELECT * FROM table WHERE id >= (ABS(RANDOM()) % (SELECT MAX(id) FROM table)) LIMIT 1;

Kết hợp với LIMIT

ORDER BY RANDOM() LIMIT 5 lấy 5 bản ghi ngẫu nhiên.