首页 > 其他分享 >57.添加数据

57.添加数据

时间:2025-02-08 11:27:44浏览次数:5  
标签:username val 57 Cursor 添加 import android 数据 id

第一步:创建基础数据库

首先,我们创建一个简单的 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
    }
}
  1. 创建数据库

    • DBHelper 类继承 SQLiteOpenHelper,实现了 onCreate 方法创建基础数据库和 Users 表。
    • onUpgrade 方法用于在数据库版本变化时更新数据库结构。
  2. 数据访问对象 (DAO)

    • UserDAO 类提供了插入用户和获取所有用户的方法。
    • 使用 ContentValues 插入数据,使用 query 方法获取所有用户数据。
  3. 用户界面

    • activity_main.xml 文件定义了布局,包括两个 EditText、一个 Button 和一个 ListView
  4. 实现数据添加和显示

    • 在 MainActivity 中,通过点击按钮获取输入的用户名和密码,并插入到数据库中。
    • loadUsers 方法用于从数据库中获取所有用户数据,并使用 SimpleCursorAdapter 将数据显示在 ListView 中。

工作流程说明如下:

  1. 用户在 EditText 中输入账号和密码后,点击“提交”按钮。
  2. MainActivity 的点击监听器读取输入内容,通过调用 userDAO.insertUser 将账号和密码存储进 SQLite 数据库中的 Users 表。
  3. 插入数据后,在 loadUsers 方法中,调用 userDAO.getAllUsers 获取所有存储的用户信息。getAllUsers 方法返回一个 Cursor 对象,其中包含查询出的每条记录。
  4. 使用 SimpleCursorAdapter,将 Cursor 对象中的 "username" 和 "password" 数据绑定到 ListView 中预定义的布局 simple_list_item_2 对应的 TextView 上(分别为 android.R.id.text1 和 android.R.id.text2)。
  5. ListView 显示出所有用户的账号和密码信息,实现了输入后自动显示的效果。

标签:username,val,57,Cursor,添加,import,android,数据,id
From: https://blog.csdn.net/2303_79132118/article/details/145504967

相关文章