Giới thiệu về SQLite trong Android
SQLite là cơ sở dữ liệu SQL mã nguồn mở, lưu trữ dữ liệu trong tệp văn bản trên thiết bị. Android tích hợp sẵn SQLite, hỗ trợ đầy đủ tính năng cơ sở dữ liệu quan hệ mà không cần kết nối JDBC/ODBC.
Ví dụ: Sử dụng typeof() để kiểm tra kiểu dữ liệu cột
Hàm typeof() trong SQLite trả về kiểu dữ liệu của một biểu thức (text, integer, real, blob, null). Ví dụ này demo việc kiểm tra kiểu của cột name.
Bước 1: Tạo dự án mới
File → New Project trong Android Studio, điền thông tin cần thiết.
Bước 2: Giao diện (res/layout/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">
<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" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<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" />
<Button android:id="@+id/delete" android:text="Xóa tất cả"
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">
</ListView>
</LinearLayout>
Bước 3: MainActivity.java (giống các ví dụ trước)
package com.example.andy.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
EditText name, salary;
ArrayAdapter<String> arrayAdapter;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final DatabaseHelper helper = new DatabaseHelper(this);
final ArrayList<String> array_list = helper.getAllContacts();
name = findViewById(R.id.name);
salary = findViewById(R.id.salary);
listView = findViewById(R.id.listView);
arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, array_list);
listView.setAdapter(arrayAdapter);
// Các listener cho delete, update, refresh, save tương tự bài trước...
// (Rút gọn để tránh lặp code)
}
}
Bước 4: DatabaseHelper.java - Quan trọng: typeof() trong truy vấn
package com.example.andy.myapplication;
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 {
public static final String DATABASE_NAME = "salaryDatabase9";
public static final String CONTACTS_TABLE_NAME = "SalaryDetails";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 2);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + CONTACTS_TABLE_NAME +
"(id INTEGER PRIMARY KEY, name TEXT, salary REAL, datetime DEFAULT CURRENT_TIMESTAMP)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + CONTACTS_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);
db.replace(CONTACTS_TABLE_NAME, null, cv);
return true;
}
// QUAN TRỌNG: Sử dụng typeof(name) để lấy kiểu dữ liệu của cột name
public ArrayList<String> getAllContacts() {
SQLiteDatabase db = getReadableDatabase();
ArrayList<String> array_list = new ArrayList<>();
Cursor res = db.rawQuery("SELECT typeof(name) AS fullname FROM " + CONTACTS_TABLE_NAME, null);
res.moveToFirst();
while (!res.isAfterLast()) {
if (res != null && res.getCount() > 0) {
array_list.add(res.getString(res.getColumnIndex("fullname")));
}
res.moveToNext();
}
res.close();
return array_list;
}
public boolean update(String name, String salary) {
SQLiteDatabase db = getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("name", name);
cv.put("salary", salary);
return db.update(CONTACTS_TABLE_NAME, cv, "name = ?", new String[]{name}) > 0;
}
public boolean delete() {
getWritableDatabase().execSQL("DELETE FROM " + CONTACTS_TABLE_NAME);
return true;
}
}
Kết quả

Kết quả hiển thị kiểu dữ liệu của cột name là text.