在本文中,将探讨如何在Android平台上使用SQLite数据库。尽管网络上有许多关于此主题的文章和演示,但它们往往对初学者来说过于复杂,或者假设读者已经对Android和SQL有深入的了解。本文假设读者已经具备Android的基础知识和基本的SQL命令知识。将通过一个简单的学生管理系统示例,展示如何在Android中对SQLite表执行基本的数据操作语言(DML)和查询操作。
本文创建的示例应用程序是一个简单的学生管理系统,它允许用户添加、删除、修改和查看学生详细信息。应用程序接受学生的学号、姓名和成绩,并将这些信息添加到一个名为student
的表中。为了简化,创建了所有字段的数据类型为VARCHAR
,这是一个可变长度的字符字符串。
在Android中,SQLiteDatabase
类来自android.database.sqlite
包,而Cursor
类来自android.database
包,它们提供了执行SQLite表上DML和查询操作所需的所有功能。
以下是创建SQLite数据库和表的代码示例:
db = openOrCreateDatabase("StudentDB", Context.MODE_PRIVATE, null);
db.execSQL("CREATE TABLE IF NOT EXISTS student(rollno VARCHAR, name VARCHAR, marks VARCHAR);");
在上面的代码中,openOrCreateDatabase()
函数用于打开StudentDB
数据库(如果存在)或创建一个新数据库(如果不存在)。此函数的第一个参数指定要打开或创建的数据库的名称。第二个参数Context.MODE_PRIVATE
指示数据库文件只能由调用应用程序或具有相同用户ID的所有应用程序访问。第三个参数是Cursor工厂对象,如果不要求,可以留空。
db.execSQL()
函数执行任何SQL命令。在这里,它用于创建student
表(如果数据库中尚不存在)。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 初始化控件
editRollno = (EditText) findViewById(R.id.editRollno);
editName = (EditText) findViewById(R.id.editName);
editMarks = (EditText) findViewById(R.id.editMarks);
btnAdd = (Button) findViewById(R.id.btnAdd);
btnDelete = (Button) findViewById(R.id.btnDelete);
btnModify = (Button) findViewById(R.id.btnModify);
btnView = (Button) findViewById(R.id.btnView);
btnViewAll = (Button) findViewById(R.id.btnViewAll);
btnShowInfo = (Button) findViewById(R.id.btnShowInfo);
// 注册事件处理器
btnAdd.setOnClickListener(this);
btnDelete.setOnClickListener(this);
btnModify.setOnClickListener(this);
btnView.setOnClickListener(this);
btnViewAll.setOnClickListener(this);
btnShowInfo.setOnClickListener(this);
// 创建数据库和表
db = openOrCreateDatabase("StudentDB", Context.MODE_PRIVATE, null);
db.execSQL("CREATE TABLE IF NOT EXISTS student(rollno VARCHAR, name VARCHAR, marks VARCHAR);");
}
在onClick()
事件处理器中,可以编写添加、删除、修改和查看记录所需的代码。
db.execSQL("INSERT INTO student VALUES('" + editRollno.getText() + "','" + editName.getText() + "','" + editMarks.getText() + "');");
上述代码通过将可编辑字段的内容附加到字符串中生成一个INSERT
语句,并执行该INSERT
语句。
db.execSQL("DELETE FROM student WHERE rollno='" + editRollno.getText() + "'");
上述代码删除了在可编辑字段中输入的学号对应的学生记录。
db.execSQL("UPDATE student SET name='" + editName.getText() + "', marks='" + editMarks.getText() + "' WHERE rollno='" + editRollno.getText() + "'");
上述代码更新了在可编辑字段中输入的学号对应的学生的记录。
Cursor c = db.rawQuery("SELECT * FROM student WHERE rollno='" + editRollno.getText() + "'", null);
if (c.moveToFirst()) {
editName.setText(c.getString(1));
editMarks.setText(c.getString(2));
}
上述代码使用SQLiteDatabase
类的rawQuery()
方法执行一个SELECT
语句来选择记录,然后使用Cursor
类的moveToFirst()
方法检查是否找到了记录,并在相应的可编辑字段中显示姓名和成绩。
Cursor c = db.rawQuery("SELECT * FROM student", null);
if (c.getCount() == 0) {
showMessage("Error", "No records found");
return;
}
StringBuffer buffer = new StringBuffer();
while (c.moveToNext()) {
buffer.append("\nRollno: " + c.getString(0) + "\n");
buffer.append("Name: " + c.getString(1) + "\n");
buffer.append("Marks: " + c.getString(2) + "\n\n");
}
showMessage("Student Details", buffer.toString());
上述代码执行SELECT
命令以检索所有学生的记录,并将它们追加到一个字符串缓冲区中。最后,使用用户定义的showMessage()
函数显示学生详细信息。
public void onClick(View view) {
// 添加记录
if (view == btnAdd) {
// 检查空字段
if (editRollno.getText().toString().trim().length() == 0 ||
editName.getText().toString().trim().length() == 0 ||
editMarks.getText().toString().trim().length() == 0) {
showMessage("Error", "Please enter all values");
return;
}
// 插入记录
db.execSQL("INSERT INTO student VALUES('" + editRollno.getText() + "','" + editName.getText() + "','" + editMarks.getText() + "');");
showMessage("Success", "Record added");
clearText();
}
// 删除记录
if (view == btnDelete) {
// 检查空学号
if (editRollno.getText().toString().trim().length() == 0) {
showMessage("Error", "Please enter Rollno");
return;
}
// 搜索学号
Cursor c = db.rawQuery("SELECT * FROM student WHERE rollno='" + editRollno.getText() + "'", null);
if (c.moveToFirst()) {
// 如果找到则删除记录
db.execSQL("DELETE FROM student WHERE rollno='" + editRollno.getText() + "'");
showMessage("Success", "Record Deleted");
} else {
showMessage("Error", "Invalid Rollno");
}
clearText();
}
// 修改记录
if (view == btnModify) {
// 检查空学号
if (editRollno.getText().toString().trim().length() == 0) {
showMessage("Error", "Please enter Rollno");
return;
}
// 搜索学号
Cursor c = db.rawQuery("SELECT * FROM student WHERE rollno='" + editRollno.getText() + "'", null);
if (c.moveToFirst()) {
// 如果找到则修改记录
db.execSQL("UPDATE student SET name='" + editName.getText() + "',marks='" + editMarks.getText() + "' WHERE rollno='" + editRollno.getText() + "'");
showMessage("Success", "Record Modified");
} else {
showMessage("Error", "Invalid Rollno");
}
clearText();
}
// 查看记录
if (view == btnView) {
// 检查空学号
if (editRollno.getText().toString().trim().length() == 0) {
showMessage("Error", "Please enter Rollno");
return;
}
// 搜索学号
Cursor c = db.rawQuery("SELECT * FROM student WHERE rollno='" + editRollno.getText() + "'", null);
if (c.moveToFirst()) {
// 如果找到则显示记录
editName.setText(c.getString(1));
editMarks.setText(c.getString(2));
} else {
showMessage("Error", "Invalid Rollno");
clearText();
}
}
// 查看所有记录
if (view == btnViewAll) {
// 检索所有记录
Cursor c = db.rawQuery("SELECT * FROM student", null);
// 检查是否没有找到记录
if (c.getCount() == 0) {
showMessage("Error", "No records found");
return;
}
// 将记录追加到字符串缓冲区
StringBuffer buffer = new StringBuffer();
while (c.moveToNext()) {
buffer.append("\nRollno: " + c.getString(0) + "\n");
buffer.append("Name: " + c.getString(1) + "\n");
buffer.append("Marks: " + c.getString(2) + "\n\n");
}
// 显示所有记录
showMessage("Student Details", buffer.toString());
}
// 显示信息
if (view == btnShowInfo) {
showMessage("Student Management Application", "Developed By Azim");
}
}
以下是用于向用户显示消息的用户定义函数:
public void showMessage(String title, String message) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(true);
builder.setTitle(title);
builder.setMessage(message);
builder.show();
}
public void clearText() {
editRollno.setText("");
editName.setText("");
editMarks.setText("");
editRollno.requestFocus();
}