在 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 中的使用,提升开发效率和数据管理能力。

相关推荐
进击的丸子3 小时前
虹软人脸服务器版SDK(Linux/ARM Pro)多线程调用及性能优化
linux·数据库·后端
Kapaseker5 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴5 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭15 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab16 小时前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
NineData19 小时前
NineData智能数据管理平台新功能发布|2026年1-2月
数据库·sql·数据分析
IvorySQL20 小时前
双星闪耀温哥华:IvorySQL 社区两项议题入选 PGConf.dev 2026
数据库·postgresql·开源
BoomHe21 小时前
Now in Android 架构模式全面分析
android·android jetpack
ma_king1 天前
入门 java 和 数据库
java·数据库·后端
jiayou641 天前
KingbaseES 实战:审计追踪配置与运维实践
数据库