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

Cách sử dụng ràng buộc NOT NULL trong SQLite Android

Giới thiệu

Ràng buộc NOT NULL đảm bảo một cột không thể chứa giá trị NULL. Khi định nghĩa bảng, thêm NOT NULL sau kiểu dữ liệu để bắt buộc người dùng phải nhập giá trị cho cột đó.

Ví dụ minh họa

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

File → New Project → Chọn Empty Activity → Đặt tên package.

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"
    android:orientation="vertical"
    tools:context=".MainActivity">

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

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

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

Bước 3: MainActivity.java

package com.example.notnulldemo;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    Button save;
    EditText name, salary;

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

        final DatabaseHelper helper = new DatabaseHelper(this);
        name = findViewById(R.id.name);
        salary = findViewById(R.id.salary);

        findViewById(R.id.save).setOnClickListener(v -> {
            String n = name.getText().toString().trim();
            String s = salary.getText().toString().trim();
            if (!n.isEmpty() && !s.isEmpty()) {
                if (helper.insert(n, s)) {
                    Toast.makeText(this, "Đã thêm", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(this, "Thêm thất bại (có thể vi phạm NOT NULL)", Toast.LENGTH_LONG).show();
                }
            } else {
                name.setError("Nhập tên");
                salary.setError("Nhập lương");
            }
        });
    }
}

Bước 4: DatabaseHelper.java - Định nghĩa NOT NULL

package com.example.notnulldemo;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

class DatabaseHelper extends SQLiteOpenHelper {
    static final String DATABASE_NAME = "MyDBName";
    static final String TABLE_NAME = "SalaryDetails";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        // id, name, salary đều có NOT NULL
        db.execSQL("CREATE TABLE " + TABLE_NAME + 
            "(id INTEGER PRIMARY KEY NOT NULL, " +
            "name TEXT NOT NULL, " +
            "salary TEXT NOT NULL)");
    }

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

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

Cơ chế hoạt động

Khi cố tình truyền giá trị null hoặc rỗng cho cột có NOT NULL, SQLite sẽ ném ra exception SQLiteConstraintException và phương thức insert() trả về -1. Trong ví dụ, chúng ta kiểm tra rỗng ở tầng UI, nhưng ràng buộc ở DB vẫn là lớp bảo vệ cuối cùng.

Kiểm tra trong Android Studio

Sử dụng Device File Explorer → data/data/package.name/databases/ → Kéo file DB ra máy → Mở bằng DB Browser for SQLite để xem cấu trúc bảng.

Tóm tắt

  • NOT NULL ngăn chặn dữ liệu thiếu ở mức cơ sở dữ liệu.
  • Kết hợp với validation ở UI để trải nghiệm người dùng tốt hơn.
  • Primary key tự động có NOT NULL.