Bài viết này minh họa cách triển khai chức năng thu thập thông tin từ người dùng qua giao diện ứng dụng và lưu trữ thông tin đó vào cơ sở dữ liệu SQLite cục bộ trên thiết bị Android.
Cấu trúc ứng dụng
Để hoàn thành chức năng nhập liệu và lưu trữ dữ liệu, chúng ta sẽ cần ba thành phần Java chính:
- Một Activity để quản lý giao diện người dùng, thu thập dữ liệu nhập vào và kích hoạt thao tác lưu trữ.
- Một Lớp mô hình dữ liệu (POJO) để đại diện cho cấu trúc dữ liệu sẽ được lưu trữ.
- Một Lớp hỗ trợ cơ sở dữ liệu SQLite để xử lý việc tạo, nâng cấp và các thao tác CRUD (tạo, đọc, cập nhật, xóa) với dữ liệu.
1. Lớp Hoạt động chính: EntryFormActivity.java
Lớp này chịu trách nhiệm hiển thị biểu mẫu, lấy dữ liệu từ các trường nhập liệu và xử lý sự kiện khi người dùng nhấn nút lưu. Chúng ta sẽ liên kết các trường EditText để nhập ngày, tiêu đề và nội dung, cùng với một nút để lưu thông tin.
package com.example.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class EntryFormActivity extends Activity {
private AppDatabaseHelper appDbHelper;
private EditText inputDate;
private EditText inputTitle;
private EditText inputContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_entry_form); // Giả định layout của bạn có tên là activity_entry_form
// Khởi tạo đối tượng hỗ trợ cơ sở dữ liệu
appDbHelper = new AppDatabaseHelper(this);
// Liên kết các thành phần UI từ layout
inputDate = this.findViewById(R.id.edit_date); // Giả định ID là edit_date
inputTitle = this.findViewById(R.id.edit_title); // Giả định ID là edit_title
inputContent = this.findViewById(R.id.edit_content); // Giả định ID là edit_content
// Thiết lập lắng nghe sự kiện cho nút lưu
Button saveEntryButton = this.findViewById(R.id.btn_save_entry); // Giả định ID là btn_save_entry
saveEntryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String strDate = inputDate.getText().toString().trim();
String strTitle = inputTitle.getText().toString().trim();
String strContent = inputContent.getText().toString().trim();
// Kiểm tra xem các trường có trống không
if (strDate.isEmpty() || strTitle.isEmpty() || strContent.isEmpty()) {
Toast.makeText(EntryFormActivity.this, "Vui lòng điền đầy đủ thông tin!", Toast.LENGTH_SHORT).show();
return;
}
// Tạo đối tượng NoteEntry từ dữ liệu nhập vào
NoteEntry newNote = new NoteEntry(strDate, strTitle, strContent);
// Chèn dữ liệu vào cơ sở dữ liệu
long result = appDbHelper.insertNote(newNote);
if (result != -1) {
Toast.makeText(EntryFormActivity.this, "Lưu dữ liệu thành công!", Toast.LENGTH_SHORT).show();
// Tùy chọn: Xóa nội dung các trường sau khi lưu thành công
inputDate.setText("");
inputTitle.setText("");
inputContent.setText("");
} else {
Toast.makeText(EntryFormActivity.this, "Lưu dữ liệu thất bại!", Toast.LENGTH_SHORT).show();
}
}
});
}
}
2. Lớp Mô hình Dữ liệu: NoteEntry.java
Lớp này là một đối tượng Java thuần túy (POJO) đại diện cho một bản ghi dữ liệu duy nhất mà chúng ta muốn lưu trữ. Nó chứa các thuộc tính (trường) tương ứng với các cột trong bảng cơ sở dữ liệu, cùng với các phương thức getter và setter để truy cập và sửa đổi dữ liệu.
package com.example.myapplication;
public class NoteEntry {
private String entryDate;
private String entryTitle;
private String entryContent;
public NoteEntry(String entryDate, String entryTitle, String entryContent) {
this.entryDate = entryDate;
this.entryTitle = entryTitle;
this.entryContent = entryContent;
}
// Getters
public String getEntryDate() {
return entryDate;
}
public String getEntryTitle() {
return entryTitle;
}
public String getEntryContent() {
return entryContent;
}
// Setters
public void setEntryDate(String entryDate) {
this.entryDate = entryDate;
}
public void setEntryTitle(String entryTitle) {
this.entryTitle = entryTitle;
}
public void setEntryContent(String entryContent) {
this.entryContent = entryContent;
}
@Override
public String toString() {
return "NoteEntry{" +
"date='" + entryDate + '\'' +
", title='" + entryTitle + '\'' +
", content='" + entryContent + '\'' +
'}';
}
}
3. Lớp Hỗ trợ Cơ sở dữ liệu: AppDatabaseHelper.java
Lớp này mở rộng SQLiteOpenHelper, cung cấp các phương thức để tạo cơ sở dữ liệu khi ứng dụng được cài đặt lần đầu (onCreate), nâng cấp nó khi phiên bản thay đổi (onUpgrade), và thực hiện các thao tác thêm (insertNote) và truy vấn (getAllNotes) dữ liệu.
package com.example.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;
import java.util.List;
public class AppDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "app_notes_db";
private static final int DATABASE_VERSION = 2; // Tăng phiên bản để kích hoạt onUpgrade khi có thay đổi cấu trúc DB
private static final String TABLE_NOTES = "notes_table";
// Tên các cột trong bảng
private static final String KEY_ID = "_id";
private static final String KEY_DATE = "entry_date";
private static final String KEY_TITLE = "entry_title";
private static final String KEY_CONTENT = "entry_content";
public AppDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_NOTES_TABLE = "CREATE TABLE " + TABLE_NOTES + "("
+ KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ KEY_DATE + " TEXT,"
+ KEY_TITLE + " TEXT,"
+ KEY_CONTENT + " TEXT" + ")";
db.execSQL(CREATE_NOTES_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Xóa bảng cũ nếu tồn tại
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NOTES);
// Tạo lại bảng
onCreate(db);
}
/**
* Chèn một NoteEntry mới vào cơ sở dữ liệu.
* @param note Đối tượng NoteEntry cần chèn.
* @return ID hàng của bản ghi mới được chèn, hoặc -1 nếu có lỗi xảy ra.
*/
public long insertNote(NoteEntry note) {
SQLiteDatabase db = this.getWritableDatabase(); // Lấy đối tượng cơ sở dữ liệu có thể ghi
ContentValues values = new ContentValues();
values.put(KEY_DATE, note.getEntryDate());
values.put(KEY_TITLE, note.getEntryTitle());
values.put(KEY_CONTENT, note.getEntryContent());
// Chèn hàng
long rowId = db.insert(TABLE_NOTES, null, values);
db.close(); // Đóng kết nối cơ sở dữ liệu
return rowId;
}
/**
* Truy xuất tất cả các ghi chú từ cơ sở dữ liệu.
* @return Một danh sách các đối tượng NoteEntry.
*/
public List<NoteEntry> getAllNotes() {
List<NoteEntry> noteList = new ArrayList<>();
// Truy vấn chọn tất cả
String selectQuery = "SELECT * FROM " + TABLE_NOTES + " ORDER BY " + KEY_ID + " DESC"; // Sắp xếp theo ID giảm dần để lấy các bản ghi mới nhất trước
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// Lặp qua tất cả các hàng và thêm vào danh sách
if (cursor.moveToFirst()) {
do {
// Sử dụng getColumnIndexOrThrow để đảm bảo an toàn khi truy cập cột
String date = cursor.getString(cursor.getColumnIndexOrThrow(KEY_DATE));
String title = cursor.getString(cursor.getColumnIndexOrThrow(KEY_TITLE));
String content = cursor.getString(cursor.getColumnIndexOrThrow(KEY_CONTENT));
NoteEntry note = new NoteEntry(date, title, content);
noteList.add(note);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return noteList;
}
}