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 NULLngă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.