在 Android 中使用 SQLite 数据库及其操作详解

在 Android 开发中,使用 SQLite 数据库是一种常见的持久化数据存储方式。本文将通过代码示例详细讲解如何在 Android 中创建数据库表、插入数据、执行查询操作以及验证查询结果。

1. 创建数据库表

首先,我们需要定义数据库表的结构。在 Android 中,这通常通过 SQL 语句来实现。在 SQLiteOpenHelperonCreate() 方法中执行 SQL 语句来创建表。

java 复制代码
String sql = "create table notepad(id integer primary key autoincrement, content text, time text)";
db.execSQL(sql);
  • id 是主键,类型为 INTEGER,并且通过 AUTOINCREMENT 自动递增。
  • content 是用于存储笔记内容的文本字段。
  • time 是用于存储时间信息的文本字段。

当应用程序第一次运行时,数据库会通过执行这条 CREATE TABLE 语句来创建 notepad 表。

2. 插入数据到数据库

接下来,我们定义一个方法,将数据插入到 notepad 表中。我们使用 execSQL() 方法来执行 INSERT 语句。

java 复制代码
public void insertNotepad(SQLiteDatabase db, String content, String time) {
    String sql = "insert into notepad (content, time) values (?, ?)";
    db.execSQL(sql, new Object[]{content, time});
}
  • insert into notepad (content, time):指定要插入的表名和列名。
  • values (?, ?) :占位符 ? 用于安全地插入数据。这个写法能有效防止 SQL 注入攻击。
  • new Object[]{content, time} :创建一个 Object 数组,将 contenttime 作为参数传递,依次替换 SQL 语句中的占位符 ?

该方法会将指定的笔记内容和时间插入到 notepad 表中,数据库会自动生成唯一的 id 值。

3. 执行查询操作

我们还需要从数据库中查询数据。下面的方法用于根据 id 查询 notepad 表中的记录。

java 复制代码
public Cursor getNotepad(SQLiteDatabase db, int id) {
    return db.rawQuery("select * from notepad where id = ?", new String[]{String.valueOf(id)});
}
  • select * from notepad where id = ? :这是一条 SELECT 查询语句,用于检索 id 等于特定值的记录。? 是占位符。
  • new String[]{String.valueOf(id)} :将 id 转换为字符串,并通过数组传递给 SQL 语句以替换占位符 ?

调用此方法时,会返回一个 Cursor 对象,它包含查询到的结果集。

4. 验证查询结果

查询到结果后,我们可以使用 Cursor 对象来遍历结果并提取字段数据。

java 复制代码
Cursor cursor = dbHelper.getNotepad(db, 1);
System.out.println("Query executed for record with id 1.");

if (cursor.moveToFirst()) {
    int id = cursor.getInt(cursor.getColumnIndex("id"));
    String content = cursor.getString(cursor.getColumnIndex("content"));
    String time = cursor.getString(cursor.getColumnIndex("time"));

    System.out.println("Record found: ID = " + id + ", Content = " + content + ", Time = " + time);

    assertEquals(1, id);
    assertEquals("Test content", content);
    assertEquals("2024-08-23 12:00", time);
} else {
    System.out.println("No record found.");
}
  • cursor.moveToFirst() :将 Cursor 移动到第一条记录。如果有记录存在,则返回 true
  • cursor.getInt(cursor.getColumnIndex("id")) :通过列名获取 id 列的值。
  • cursor.getString(cursor.getColumnIndex("content"))cursor.getString(cursor.getColumnIndex("time")) :分别获取 contenttime 列的值。

通过这些方法,我们可以提取查询结果并输出到控制台。同时,使用 assertEquals 方法来验证结果是否与预期一致。

5. 参数化查询的安全性

在上述的 SQL 查询语句中,我们使用了占位符 ?,并将实际参数通过数组传递到 SQL 语句中。这是一种参数化查询的方式,可以有效防止 SQL 注入攻击。通过参数化查询,你无需手动拼接 SQL 语句,可以确保输入的数据不会被恶意利用来修改 SQL 逻辑。

例如:

java 复制代码
String sql = "select * from notepad where id = ?";
db.rawQuery(sql, new String[]{String.valueOf(id)});

这里的 new String[]{String.valueOf(id)} 创建了一个字符串数组,其中包含 id 的字符串形式。这个数组会替换 SQL 语句中的占位符 ?

6. 代码总结

通过这篇文章的示例,我们展示了如何在 Android 中使用 SQLite 数据库,创建表、插入数据、查询数据,并对查询结果进行验证。以下是代码的完整实现:

java 复制代码
public class MyDbHelper extends SQLiteOpenHelper {

    public MyDbHelper(Context context) {
        super(context, "mydatabase.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table notepad(id integer primary key autoincrement, content text, time text)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS notepad");
        onCreate(db);
    }

    public void insertNotepad(SQLiteDatabase db, String content, String time) {
        String sql = "insert into notepad (content, time) values (?, ?)";
        db.execSQL(sql, new Object[]{content, time});
    }

    public Cursor getNotepad(SQLiteDatabase db, int id) {
        return db.rawQuery("select * from notepad where id = ?", new String[]{String.valueOf(id)});
    }
}

通过这个简单的示例,你可以掌握在 Android 应用中如何使用 SQLite 来执行数据库操作。你可以进一步扩展这些代码来实现更多功能,比如更新和删除记录、复杂查询等。

7. 小结

SQLite 是 Android 中非常强大且轻量的内置数据库引擎,适合处理小型的持久化数据。通过本文的代码示例,你可以快速上手并在实际项目中使用 SQLite 来管理和操作数据。在实际开发中,务必采用参数化查询等安全手段来防止 SQL 注入攻击,确保数据的安全性。

如果你有更复杂的需求,例如需要处理大量数据、关系复杂的数据操作,可能需要考虑其他数据库解决方案,如使用 Room 或者将数据存储到云端。希望本文能够帮助你更好地理解 SQLite 在 Android 中的使用,提升开发效率和数据管理能力。

相关推荐
掘根12 分钟前
【微服务即时通讯】消息转发子服务
数据库·oracle
喜欢喝果茶.14 分钟前
SQL 预处理
数据库·sql
gregmankiw1 小时前
Nemotron架构(Mamba3+Transformer+Moe)
android·深度学习·transformer
数据科学小丫2 小时前
Python 数据存储操作_数据存储、补充知识点:Python 与 MySQL交互
数据库·python·mysql
Knight_AL2 小时前
Nacos 启动问题 Failed to create database ’D:\nacos\nacos\data\derby-data’
开发语言·数据库·python
xianjian09123 小时前
MySQL 的 INSERT(插入数据)详解
android·数据库·mysql
知识分享小能手3 小时前
MongoDB入门学习教程,从入门到精通,MongoDB入门指南 —— 知识点详解(2)
数据库·学习·mongodb
what_20184 小时前
PostgreSQL 索引
数据库·postgresql
麦聪聊数据4 小时前
跨云与多区服游戏架构下的数据库运维:基于webSQL的访问实践
数据库·sql·低代码·游戏·restful
欧简墨4 小时前
kotlin Android Extensions插件迁移到viewbinding总结
android·trae