第一步:创建基础数据库
首先,我们创建一个简单的 SQLite 数据库和一个表。
DBHelper.kt:
package com.example.myapplication45
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
class DBHelper(context: Context) :
SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
companion object {
private const val DATABASE_NAME = "MyDatabase.db"
private const val DATABASE_VERSION = 1
}
/*
_id INTEGER PRIMARY KEY AUTOINCREMENT:
定义了表中的一个名为 _id 的列
INTEGER:指定该列的数据类型为整数。
PRIMARY KEY:将该列设置为表的主键,保证每条记录在该列上的值唯一。
AUTOINCREMENT:表示新插入记录时,该主键的值会自动增长,不需要手动指定。
*/
override fun onCreate(db: SQLiteDatabase) {
val createTableUser = """
CREATE TABLE IF NOT EXISTS Users (
_id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
password TEXT NOT NULL
);
""".trimIndent()
db.execSQL(createTableUser)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL("DROP TABLE IF EXISTS Users")
onCreate(db)
}
}
第二步:创建数据访问对象 (DAO)
我们创建一个 UserDAO
类,用于插入和查询用户数据。
package com.example.myapplication45
import android.content.ContentValues
import android.content.Context
import android.database.Cursor
/*
class UserDAO(context: Context) 定义了一个数据操作对象(DAO),用于对用户数据进行数据库增删查改操作。
在构造函数中,使用传入的 Context 创建了一个 DBHelper 实例
(在这个实例中,DBHelper 继承自 SQLiteOpenHelper,用于管理数据库的创建和升级)。
*/
class UserDAO(context: Context) {
private val dbHelper = DBHelper(context)
//定义了接收用户名和密码的参数,并返回插入的行 ID。
fun insertUser(username: String, password: String): Long {
//调用 dbHelper.writableDatabase 获取一个可写的数据库实例。
val database = dbHelper.writableDatabase
//使用 ContentValues 存储列名和值,其中 put("username", username) 表示插入 "username" 列的值(密码同理)。
val values = ContentValues().apply {
put("username", username)
put("password", password)
}
//最后调用 database.insert 方法将数据插入到 "Users" 表中,并返回新插入记录的行 ID,如果插入失败,则返回 -1。
return database.insert("Users", null, values)
}
//方法签名 fun getAllUsers(): Cursor 定义了从数据库中读取所有用户数据,并返回一个 Cursor 对象。
fun getAllUsers(): Cursor {
//调用 dbHelper.readableDatabase 获取一个只读的数据库实例。
val database = dbHelper.readableDatabase
// 将 userId 别名为 _id
/*
使用 rawQuery 执行 SQL 查询,查询语句中 "SELECT userId AS _id, username, password FROM Users"
将表中的 userId 列别名为 _id。这是为了满足 Android 中一些基于 Cursor 的适配器
(例如 SimpleCursorAdapter)规定每行数据必须含有一个 _id 列的要求, 否则可能会报错无法找到 _id 列。
查询结果通过一个 Cursor 对象返回,供其他代码(例如在 Activity 中使用 CursorAdapter)进一步处理和显示数据。
*/
return database.rawQuery("SELECT userId AS _id, username, password FROM Users", null)
}
}
第三步:创建用户界面
我们创建一个简单的用户界面,包含文本框用于输入用户名和密码,以及一个按钮用于提交数据。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<EditText
android:id="@+id/usernameEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Username" />
<EditText
android:id="@+id/passwordEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Password"
android:inputType="textPassword" />
<Button
android:id="@+id/submitButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Submit" />
<ListView
android:id="@+id/userListView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
第四步:实现数据添加和显示
在 MainActivity
中实现数据的添加和显示。
package com.example.myapplication45
import android.database.Cursor
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.EditText
import android.widget.ListView
import android.widget.SimpleCursorAdapter
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var userDAO: UserDAO
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// this 指的是当前的 Activity 的实例,也就是当前的上下文(Context)
userDAO = UserDAO(this)
val usernameEditText = findViewById<EditText>(R.id.usernameEditText)
val passwordEditText = findViewById<EditText>(R.id.passwordEditText)
val submitButton = findViewById<Button>(R.id.submitButton)
val userListView = findViewById<ListView>(R.id.userListView)
submitButton.setOnClickListener {
val username = usernameEditText.text.toString()
val password = passwordEditText.text.toString()
if (username.isNotEmpty() && password.isNotEmpty()) {
val newRowId = userDAO.insertUser(username, password)
Log.d("SQLiteExample", "新记录插入成功, ID: $newRowId")
loadUsers()
}
}
loadUsers()
}
private fun loadUsers() {
val cursor: Cursor = userDAO.getAllUsers()
val fromColumns = arrayOf("username", "password")
// 定义一个整数数组,指定布局文件中对应控件的 ID,这里使用系统预定义的 simple_list_item_2 布局,
/*
系统预定义的 simple_list_item_2 布局是 Android 提供的一个内置布局资源,位于 android.R.layout.simple_list_item_2
它主要用于 ListView 或其他列表控件中,每一行可以显示两行文本
该布局包含两个 TextView,分别对应资源 ID 为 android.R.id.text1 和 android.R.id.text2。
*/
val toViews = intArrayOf(android.R.id.text1, android.R.id.text2)
// 创建一个 SimpleCursorAdapter 适配器,将 Cursor 中的数据和布局中的控件绑定起来。
// 参数说明:
// 1. 第一个参数是上下文,这里用的是当前 Activity 的上下文(this);
// 2. 第二个参数指定了行布局,这里是 android.R.layout.simple_list_item_2;
// 3. 第三个参数是数据源 Cursor;
// 4. 第四个参数是要显示的列名数组;
// 5. 第五个参数是对应列要绑定的控件 ID 数组;
// 6. 第六个参数为标志,一般传 0 表示默认行为。
val adapter = SimpleCursorAdapter(
this,
android.R.layout.simple_list_item_2,
cursor,
fromColumns,
toViews,
0
)
val userListView = findViewById<ListView>(R.id.userListView)
userListView.adapter = adapter
}
}
-
创建数据库:
DBHelper
类继承SQLiteOpenHelper
,实现了onCreate
方法创建基础数据库和Users
表。onUpgrade
方法用于在数据库版本变化时更新数据库结构。
-
数据访问对象 (DAO):
UserDAO
类提供了插入用户和获取所有用户的方法。- 使用
ContentValues
插入数据,使用query
方法获取所有用户数据。
-
用户界面:
activity_main.xml
文件定义了布局,包括两个EditText
、一个Button
和一个ListView
。
-
实现数据添加和显示:
- 在
MainActivity
中,通过点击按钮获取输入的用户名和密码,并插入到数据库中。 loadUsers
方法用于从数据库中获取所有用户数据,并使用SimpleCursorAdapter
将数据显示在ListView
中。
- 在
工作流程说明如下:
- 用户在 EditText 中输入账号和密码后,点击“提交”按钮。
- MainActivity 的点击监听器读取输入内容,通过调用 userDAO.insertUser 将账号和密码存储进 SQLite 数据库中的 Users 表。
- 插入数据后,在 loadUsers 方法中,调用 userDAO.getAllUsers 获取所有存储的用户信息。getAllUsers 方法返回一个 Cursor 对象,其中包含查询出的每条记录。
- 使用 SimpleCursorAdapter,将 Cursor 对象中的 "username" 和 "password" 数据绑定到 ListView 中预定义的布局 simple_list_item_2 对应的 TextView 上(分别为 android.R.id.text1 和 android.R.id.text2)。
- ListView 显示出所有用户的账号和密码信息,实现了输入后自动显示的效果。