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

Lọc dữ liệu SQLite Android với WHERE LIKE

Mục tiêu

Sử dụng toán tử LIKE trong SQLite để tìm kiếm theo mẫu (pattern matching) với wildcard % (bất kỳ chuỗi nào) và _ (đúng 1 ký tự).

Các bước thực hiện

Bước 1: Tạo dự án mới

Android Studio → File → New Project → Empty Activity.

Bước 2: Layout (activity_main.xml) - Giống các bài trước

Bước 3: DatabaseHelper.java - Truy vấn LIKE

package com.example.sqlitelike;

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 {

    private static final String DB_NAME = "salaryDatabase3";
    private static final String TABLE_NAME = "SalaryDetails";
    private static final int VERSION = 1;

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

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

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

    boolean insert(String name, String salary) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put("name", name);
        cv.put("salary", salary);
        return db.insert(TABLE_NAME, null, cv) != -1;
    }

    // TRUY VẤN CHÍNH: WHERE name LIKE 'Sa%'
    ArrayList<String> getAllContacts() {
        SQLiteDatabase db = getReadableDatabase();
        ArrayList<String> list = new ArrayList<>();
        
        Cursor cursor = db.rawQuery(
            "SELECT * FROM " + TABLE_NAME + " WHERE name LIKE 'Sa%'", 
            null
        );

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

Giải thích LIKE & Wildcards

Case Sensitivity

  • Mặc định SQLite: LIKE không phân biệt hoa/thường cho ASCII (A-Z = a-z)
  • Unicode: có thể phân biệt tùy collation
  • Ép buộc case-sensitive: WHERE name LIKE 'Sa%' COLLATE BINARY
  • Ép buộc case-insensitive: WHERE name LIKE 'Sa%' COLLATE NOCASE (mặc định)

Kết quả

Nhập: "Sam", "Sarah", "John", "Sandy", "Samuel", "Peter"
Kết quả: Sam, Sarah, Sandy, Samuel (tất cả bắt đầu bằng "Sa")

Lọc dữ liệu SQLite Android với WHERE LIKE

Ứng dụng thực tế: Tìm kiếm gợi ý (Autocomplete)

// User gõ "Sa" -> query:
String query = "SELECT name FROM " + TABLE_NAME + " WHERE name LIKE ? LIMIT 10";
Cursor c = db.rawQuery(query, new String[]{"Sa%"});

So sánh LIKE vs GLOB

PatternÝ nghĩaVí dụ khớp
Sa%Bắt đầu bằng "Sa"Sam, Sarah, Sandy, Samsung
%sonKết thúc bằng "son"Jason, Jackson, Johnson
%an%Chứa "an" ở bất kỳ vị tríAnn, Andrew, Sandra, Duncan
S_m3 ký tự, bắt đầu S, kết thúc mSam, Sim, Sum
___Đúng 3 ký tự bất kỳTom, Ann, Bob
Đặc điểmLIKEGLOB
Wildcard nhiều ký tự%*
Wildcard 1 ký tự_?
Case-sensitiveMặc định KHÔNG (ASCII)Mặc định CÓ
Escape characterESCAPE '\'Dùng [...] cho tập ký tự
Hiệu năngChậm hơn GLOBNhanh hơn

Tối ưu hiệu năng

  • Tạo index: CREATE INDEX idx_name ON SalaryDetails(name) (giúp LIKE 'prefix%')
  • Tránh LIKE '%suffix' hoặc LIKE '%middle%' (không dùng được index)
  • Full-text search: dùng FTS5 (Full Text Search) module của SQLite