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 NULL | Giá 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 NULLthay vì= NULLhoặc!= NULL(sai cú pháp SQL). - Kết hợp với
COALESCE()hoặcIFNULL()để 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.