(二十二)安卓开发中的数据存储之SQLite简单使用

发布于:2025-04-14 ⋅ 阅读:(27) ⋅ 点赞:(0)

在Android开发中,SQLite是一种非常常用的数据库存储方式。它轻量、简单,非常适合移动设备上的数据管理。本文将通过通俗易懂的语言,结合代码示例和具体场景,详细讲解SQLite在Android中的使用。


1. 什么是SQLite?

SQLite是一个开源的、嵌入式的关系型数据库。它不需要像MySQL那样运行一个独立的服务器,而是直接将数据存储在一个文件中。这个文件可以随着你的应用一起打包,方便管理。简单来说,SQLite就像一个“便携式笔记本”,你可以在里面记录和管理数据。


2. 为什么在Android中使用SQLite?

  • 轻量级: SQLite占用资源少,适合手机这种硬件资源有限的设备。
  • 无需服务器: 不需要额外的服务器支持,直接嵌入应用中使用。
  • 自包含: 数据库文件独立存在,易于备份和分发。
  • 支持SQL: 使用标准的SQL语法,如果你学过数据库,上手会很快。

总之,SQLite是Android开发中内置的“标配”数据库,特别适合存储结构化数据,比如用户信息、任务列表等。


3. SQLite在Android中的基本使用步骤

使用SQLite主要涉及以下几个步骤:

  1. 创建数据库: 通过SQLiteOpenHelper类来创建和管理数据库。
  2. 定义表结构: 在onCreate方法中用SQL语句创建表。
  3. 插入数据: 往表里添加数据。
  4. 查询数据: 从表中读取数据。
  5. 更新数据: 修改表中的数据。
  6. 删除数据: 删除表中的数据。

接下来,我们通过代码和一个具体的通讯录应用场景来详细讲解这些步骤。


4. 代码示例

4.1 创建数据库和表

首先,我们需要创建一个类继承SQLiteOpenHelper,用来管理数据库和表的创建。

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "my_database.db"; // 数据库文件名
    private static final int DATABASE_VERSION = 1; // 数据库版本号

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建表的SQL语句
        String createTableSQL = "CREATE TABLE users (" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT," + // 主键,自增
                "name TEXT," + // 姓名,文本类型
                "age INTEGER)"; // 年龄,整型
        db.execSQL(createTableSQL); // 执行SQL,创建表
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 数据库升级时执行,比如删除旧表并重建
        db.execSQL("DROP TABLE IF EXISTS users");
        onCreate(db);
    }
}
  • DATABASE_NAME: 数据库文件名,通常以.db结尾。
  • DATABASE_VERSION: 数据库版本号,如果表结构有变化,需要增加版本号。
  • onCreate: 第一次创建数据库时调用,定义表的结构。
  • onUpgrade: 当版本号变化时调用,用于处理旧数据迁移。

4.2 插入数据

插入数据可以用insert方法,简单高效。

import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;

public void insertUser(String name, int age) {
    SQLiteDatabase db = getWritableDatabase(); // 获取可写数据库对象
    ContentValues values = new ContentValues(); // 用于存放键值对
    values.put("name", name); // 插入姓名
    values.put("age", age); // 插入年龄
    db.insert("users", null, values); // 插入到users表
    db.close(); // 关闭数据库连接
}
  • getWritableDatabase(): 获取一个可以读写的数据库对象。
  • ContentValues: 像一个“包裹”,把要插入的数据装进去。
  • insert: 将数据插入表中。

4.3 查询数据

查询数据可以用query方法,返回一个Cursor对象,类似于指针,指向查询结果。

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.List;

class User {
    int id;
    String name;
    int age;

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}

public List<User> getAllUsers() {
    List<User> userList = new ArrayList<>();
    SQLiteDatabase db = getReadableDatabase(); // 获取只读数据库对象
    Cursor cursor = db.query("users", null, null, null, null, null, null); // 查询所有数据
    if (cursor.moveToFirst()) { // 移动到第一条数据
        do {
            int id = cursor.getInt(cursor.getColumnIndex("id"));
            String name = cursor.getString(cursor.getColumnIndex("name"));
            int age = cursor.getInt(cursor.getColumnIndex("age"));
            User user = new User(id, name, age);
            userList.add(user);
        } while (cursor.moveToNext()); // 移动到下一条数据
    }
    cursor.close(); // 关闭游标
    db.close(); // 关闭数据库
    return userList;
}
  • getReadableDatabase(): 获取只读数据库对象。
  • Cursor: 查询结果的“指针”,可以逐行读取数据。
  • moveToFirstmoveToNext: 控制游标移动,遍历所有数据。

4.4 更新数据

更新数据可以用update方法。

import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;

public void updateUser(int id, String newName, int newAge) {
    SQLiteDatabase db = getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("name", newName);
    values.put("age", newAge);
    db.update("users", values, "id=?", new String[]{String.valueOf(id)}); // 根据id更新
    db.close();
}
  • update: 参数分别是表名、更新内容、条件和条件值。

4.5 删除数据

删除数据可以用delete方法。

import android.database.sqlite.SQLiteDatabase;

public void deleteUser(int id) {
    SQLiteDatabase db = getWritableDatabase();
    db.delete("users", "id=?", new String[]{String.valueOf(id)}); // 根据id删除
    db.close();
}
  • delete: 参数分别是表名、条件和条件值。

5. 具体使用场景:通讯录应用

假设我们要开发一个简单的通讯录应用,存储联系人的姓名和电话号码。以下是如何用SQLite实现这个功能。

5.1 创建数据库和表

修改DatabaseHelper中的表结构:

@Override
public void onCreate(SQLiteDatabase db) {
    String createTableSQL = "CREATE TABLE contacts (" +
            "id INTEGER PRIMARY KEY AUTOINCREMENT," +
            "name TEXT," +
            "phone TEXT)";
    db.execSQL(createTableSQL);
}

5.2 插入联系人

public void insertContact(String name, String phone) {
    SQLiteDatabase db = getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("name", name);
    values.put("phone", phone);
    db.insert("contacts", null, values);
    db.close();
}

5.3 查询所有联系人

class Contact {
    int id;
    String name;
    String phone;

    public Contact(int id, String name, String phone) {
        this.id = id;
        this.name = name;
        this.phone = phone;
    }
}

public List<Contact> getAllContacts() {
    List<Contact> contactList = new ArrayList<>();
    SQLiteDatabase db = getReadableDatabase();
    Cursor cursor = db.query("contacts", null, null, null, null, null, null);
    if (cursor.moveToFirst()) {
        do {
            int id = cursor.getInt(cursor.getColumnIndex("id"));
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String phone = cursor.getString(cursor.getColumnIndex("phone"));
            Contact contact = new Contact(id, name, phone);
            contactList.add(contact);
        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();
    return contactList;
}

5.4 更新联系人信息

public void updateContact(int id, String newName, String newPhone) {
    SQLiteDatabase db = getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("name", newName);
    values.put("phone", newPhone);
    db.update("contacts", values, "id=?", new String[]{String.valueOf(id)});
    db.close();
}

5.5 删除联系人

public void deleteContact(int id) {
    SQLiteDatabase db = getWritableDatabase();
    db.delete("contacts", "id=?", new String[]{String.valueOf(id)});
    db.close();
}

通过这些代码,我们可以实现一个简单的通讯录功能:添加联系人、查看所有联系人、修改联系人信息和删除联系人。


6. 注意事项

  1. 数据库版本管理: 如果表结构变了(比如增加字段),需要更新DATABASE_VERSION,并在onUpgrade中处理旧数据。
  2. 线程安全: 数据库操作不要阻塞主线程,可以用AsyncTask或线程池来处理。
  3. 关闭连接: 操作完数据库后,记得调用close()释放资源。
  4. 异常处理: 操作数据库时可能会出错,要用try-catch捕获异常,比如SQLiteException

7. 总结

SQLite是Android开发中强大又简单的数据库工具。通过SQLiteOpenHelperSQLiteDatabase,我们可以轻松实现数据的增删改查。结合通讯录这个例子,你应该已经掌握了SQLite的基本用法。在实际开发中,还可以根据需要使用更复杂的查询语句或事务管理,进一步提升应用的性能和功能。