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

相关推荐
恪心与java17 分钟前
mysql
数据库·mysql·oracle
EQ-雪梨蛋花汤42 分钟前
【Part 2安卓原生360°VR播放器开发实战】第四节|安卓VR播放器性能优化与设备适配
android·性能优化·vr
每次的天空1 小时前
Android学习总结之kotlin篇(二)
android·学习·kotlin
刘洋浪子1 小时前
Android Studio中Gradle中Task列表显示不全解决方案
android·ide·android studio
橙子199110161 小时前
Kotlin 中 infix 关键字的原理和使用场景
android·开发语言·kotlin
后端码匠8 小时前
MySQL 8.0安装(压缩包方式)
android·mysql·adb
梓仁沐白9 小时前
Android清单文件
android
欧先生^_^10 小时前
Linux内核可配置的参数
linux·服务器·数据库
问道飞鱼10 小时前
【数据库知识】Mysql进阶-高可用MHA(Master High Availability)方案
数据库·mysql·adb·高可用·mha
tiging10 小时前
centos7.x下,使用宝塔进行主从复制的原理和实践
数据库·mysql·adb·主从复制