Trước khi vào ví dụ, cần hiểu SQLite trong Android: 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 quan hệ. Truy cập không cần kết nối JDBC, ODBC.
Ví dụ này minh họa cách lưu dữ liệu vào SQLite Android bằng cú pháp SQL trực tiếp (không dùng ContentValues).
Bước 1: Tạo dự án mới
Tạo dự án mới trong Android Studio: File → New Project, điền thông tin cần thiết.
Bước 2: Thiết kế 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" />
<Button
android:id = "@+id/save"
android:text = "Lưu"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content" />
</LinearLayout>
Giao diện có tên, lương (EditText). Nhấn Lưu để lưu vào SQLite.
Bước 3: Code MainActivity.java
package com.example.andy.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
Button save;
EditText name, salary;
@Override
protected void onCreate(Bundle readdInstanceState) {
super.onCreate(readdInstanceState);
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(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!name.getText().toString().isEmpty() && !salary.getText().toString().isEmpty()) {
if (helper.insert(name.getText().toString(), salary.getText().toString())) {
Toast.makeText(MainActivity.this, "Đã thêm", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "Không thêm được", Toast.LENGTH_LONG).show();
}
} else {
name.setError("Nhập TÊN");
salary.setError("Nhập LƯƠNG");
}
}
});
}
}
Bước 4: Code DatabaseHelper.java
package com.example.andy.myapplication;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "salaryDatabase1";
public static final String CONTACTS_TABLE_NAME = "SalaryDetails";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + CONTACTS_TABLE_NAME + "(id INTEGER PRIMARY KEY AUTOINCREMENT, name text, salary text, CHECK (salary >= 10000) )");
}
@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 s, String s1) {
SQLiteDatabase db = this.getWritableDatabase();
// Chèn dữ liệu bằng câu lệnh SQL INSERT trực tiếp thay vì ContentValues
db.execSQL("INSERT INTO " + CONTACTS_TABLE_NAME + "(id, name, salary) VALUES (1, '" + s + "', '" + s1 + "')");
/* Cách dùng ContentValues (đã comment):
ContentValues contentValues = new ContentValues();
contentValues.put("name", s);
contentValues.put("salary", s1);
db.insert(CONTACTS_TABLE_NAME, null, contentValues);
*/
return true;
}
}
Chạy ứng dụng
Kết nối thiết bị, chạy từ Android Studio. Màn hình hiển thị giao diện mặc định.

Nhập giá trị như hình dưới và nhấn nút:

Kiểm tra kết quả trong Android Studio (Device File Explorer):

Lưu ý: Ví dụ này dùng ID cứng (1) trong câu INSERT, thực tế nên dùng AUTOINCREMENT và không chỉ định ID. Cách dùng ContentValues an toàn hơn chống SQL Injection.