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

Cách sử dụng IS NOT NULL trong SQLite Android

SQLite ANDROID: Điều kiện IS NOT NULL

SQLite là cơ sở dữ liệu nhẹ tích hợp sẵn trong Android. Toán tử IS NOT NULL dùng để lọc các bản ghi có giá trị khác NULL trong cột cụ thể.

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

Android Studio → File → New Project.

Bước 2: Giao diện (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Nhập tên" />

    <EditText
        android:id="@+id/salary"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Nhập lương"
        android:inputType="numberDecimal" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="8dp">

        <Button
            android:id="@+id/save"
            android:text="Lưu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/refresh"
            android:text="Làm mới"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/update"
            android:text="Cập nhật"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp" />

</LinearLayout>

Bước 3: MainActivity.java

package com.example.sqlitenotnull;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    Button btnSave, btnRefresh;
    EditText edtName, edtSalary;
    ListView listView;
    DatabaseHelper dbHelper;
    ArrayList dataList;
    ArrayAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dbHelper = new DatabaseHelper(this);
        dataList = new ArrayList<>(dbHelper.getAllContacts());
        
        edtName = findViewById(R.id.name);
        edtSalary = findViewById(R.id.salary);
        listView = findViewById(R.id.listView);
        btnSave = findViewById(R.id.save);
        btnRefresh = findViewById(R.id.refresh);

        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dataList);
        listView.setAdapter(adapter);

        btnRefresh.setOnClickListener(v -> {
            dataList.clear();
            dataList.addAll(dbHelper.getAllContacts());
            adapter.notifyDataSetChanged();
        });

        btnSave.setOnClickListener(v -> {
            String name = edtName.getText().toString().trim();
            String salary = edtSalary.getText().toString().trim();
            
            if (name.isEmpty() || salary.isEmpty()) {
                if (name.isEmpty()) edtName.setError("Nhập tên");
                if (salary.isEmpty()) edtSalary.setError("Nhập lương");
                return;
            }

            if (dbHelper.insert(name, salary)) {
                Toast.makeText(this, "Đã thêm", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "Thêm thất bại", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

Bước 4: DatabaseHelper.java

package com.example.sqlitenotnull;

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;

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "salaryDatabase";
    private static final String TABLE_NAME = "SalaryDetails";
    private static final int DB_VERSION = 1;

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DB_VERSION);
    }

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

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

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

    // QUAN TRỌNG: Sử dụng IS NOT NULL
    public ArrayList getAllContacts() {
        ArrayList list = new ArrayList<>();
        SQLiteDatabase db = getReadableDatabase();
        
        // Chỉ lấy bản ghi có name = 'sairam' VÀ name KHÔNG NULL
        Cursor cursor = db.rawQuery(
            "SELECT * FROM " + TABLE_NAME + 
            " WHERE name = 'sairam' AND name IS NOT NULL", null);

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

    public boolean update(String name, String salary) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put("name", name);
        cv.put("salary", salary);
        int rows = db.update(TABLE_NAME, cv, "name = ?", new String[]{name});
        return rows > 0;
    }

    public boolean deleteAll() {
        SQLiteDatabase db = getWritableDatabase();
        int rows = db.delete(TABLE_NAME, null, null);
        return rows > 0;
    }
}

Giải thích truy vấn IS NOT NULL

-- Cú pháp cơ bản
SELECT * FROM table_name WHERE column_name IS NOT NULL;

-- Kết hợp với điều kiện khác
SELECT * FROM SalaryDetails 
WHERE name = 'sairam' AND name IS NOT NULL;

-- Ý nghĩa: Lấy các dòng có name = 'sairam' VÀ cột name không phải NULL
-- (Dù name = 'sairam' đã ngụ ý không null, nhưng IS NOT NULL rõ ràng hơn ý định)

Sự khác biệt: IS NOT NULL vs != ''

Điều kiệnÝ nghĩa
IS NOT NULLGiá trị tồn tại (không phải NULL)
!= '' hoặc <> ''Giá trị không phải chuỗi rỗng (có thể là NULL)
IS NOT NULL AND != ''Cả hai: không NULL và không rỗng

Best Practice

  • Luôn dùng IS NOT NULL / IS NULL thay vì = NULL hoặc != NULL (sai cú pháp SQL).
  • Kết hợp với COALESCE() hoặc IFNULL() để xử lý giá trị mặc định.
  • Index cột thường dùng trong WHERE IS NOT NULL để tăng tốc truy vấn.