当前位置:首页 > 问答 > 正文

安卓数据库怎么用?一步步教你搞定数据管理,别再头疼了

“安卓数据库怎么用?一步步教你搞定数据管理,别再头疼了”

你是不是也遇到过这样的问题?开发一个简单的安卓应用,比如记账本、购物清单或者个人通讯录,需要把用户输入的数据保存下来,即使关闭应用再打开,数据也不会丢失,这时候,你就需要用到数据库了,别一听到“数据库”就觉得是那种很复杂的东西,对于安卓开发来说,最常用、也是最入门级的工具就是 SQLite,它就像一个内置在你手机应用里的迷你Excel表格,帮你井井有条地管理数据。

我们就用最直白的话,一步步教你如何搞定它,我们的目标是:创建一个非常简单的“备忘录”应用,可以添加和显示备忘信息。

第一步:认识核心帮手 - SQLiteOpenHelper

想象一下,你要用一个保险箱存东西,首先你得有个保险箱,并且知道开锁密码,在安卓里,SQLiteOpenHelper 就是这个帮你创建和管理保险箱(数据库)的忠实管家,你不需要自己从零开始造保险箱,只需要告诉这个管家一些基本信息就行。

我们要做的是创建一个类,来继承 SQLiteOpenHelper,在这个类里,我们需要完成几件关键事情:

  1. 定义数据库结构:就像设计表格的表头,我们的备忘录很简单,只需要记录每条备忘的ID(主键,唯一标识)和内容。
  2. 创建数据库和表:告诉管家如何第一次搭建这个保险箱和里面的抽屉(表)。
  3. 处理数据库升级:万一以后我们想给备忘录加个“创建时间”的字段,就需要告诉管家如何改造保险箱。

具体代码看起来是这样的(别怕,我们逐行解释):

public class MyDatabaseHelper extends SQLiteOpenHelper {
    // 数据库信息
    private static final String DATABASE_NAME = "MyNotes.db"; // 数据库名字
    private static final int DATABASE_VERSION = 1; // 版本号,从1开始
    // 表名和列名
    public static final String TABLE_NOTES = "notes";
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_CONTENT = "content";
    // 构造方法,必须要有
    public MyDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    // 第一次创建数据库时会调用,在这里执行建表操作
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 组装一个创建表的SQL语句
        String CREATE_TABLE = "CREATE TABLE " + TABLE_NOTES + "("
                + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + COLUMN_CONTENT + " TEXT" + ")";
        // 执行SQL语句
        db.execSQL(CREATE_TABLE);
    }
    // 当数据库需要升级(版本号增加)时调用,比如要修改表结构
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 简单粗暴的做法:删除旧表,创建新表(注意这会丢失所有旧数据!)
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NOTES);
        onCreate(db);
    }
}

解释一下关键点:

  • DATABASE_NAME:你的数据库文件叫什么名字,MyNotes.db
  • TABLE_NOTES:表的名字,notes
  • COLUMN_IDCOLUMN_CONTENT:列的名字。_id 是主键,AUTOINCREMENT 表示它会自动增长,你不用管;content 是文本类型(TEXT),用来存备忘录内容。
  • onCreate 方法:只在第一次创建数据库时运行一次,就像初始化。
  • onUpgrade:当你的应用更新,数据库结构也需要变化时(比如增加了新字段),你需要提高 DATABASE_VERSION 的值,然后在这里写升级逻辑。

第二步:学会“增删改查”四门功课

数据库建好了,接下来就是最重要的操作:存数据(增)、删数据(删)、改数据(改)、取数据(查),这四大操作合称 CRUD

增 - 添加一条新备忘

当用户在输入框里写好内容,点击“保存”按钮时,我们就需要把数据插入到数据库里。

// 获取一个可写的数据库对象
MyDatabaseHelper dbHelper = new MyDatabaseHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 创建一个ContentValues对象,它就像是一个包裹,里面装着你要存的数据
ContentValues values = new ContentValues();
values.put(MyDatabaseHelper.COLUMN_CONTENT, "这是我的第一条备忘录!");
// 执行插入操作,返回新行的ID,如果失败返回-1
long newRowId = db.insert(MyDatabaseHelper.TABLE_NOTES, null, values);
// 操作完成后,记得关闭数据库连接,这是个好习惯
db.close();

查 - 读取并显示所有备忘

我们要把存进去的数据读出来,显示在列表里(比如用 ListViewRecyclerView)。

// 获取一个可读的数据库对象
MyDatabaseHelper dbHelper = new MyDatabaseHelper(this);
SQLiteDatabase db = dbHelper.getReadableDatabase();
// 定义你要查询哪些列
String[] projection = {
        MyDatabaseHelper.COLUMN_ID,
        MyDatabaseHelper.COLUMN_CONTENT
};
// 执行查询,得到一个Cursor(游标)对象,你可以把它想象成指向结果集第一行之前的指针
Cursor cursor = db.query(
        MyDatabaseHelper.TABLE_NOTES, // 表名
        projection,                   // 要返回的列
        null,             // WHERE条件(这里不过滤,查全部)
        null,          // WHERE条件的参数
        null,             // GROUP BY分组
        null,              // HAVING过滤分组
        null               // ORDER BY排序
);
// 遍历Cursor,取出数据
List<String> notesList = new ArrayList<>();
while (cursor.moveToNext()) {
    // 通过列名获取索引,再通过索引获取值
    long itemId = cursor.getLong(cursor.getColumnIndexOrThrow(MyDatabaseHelper.COLUMN_ID));
    String content = cursor.getString(cursor.getColumnIndexOrThrow(MyDatabaseHelper.COLUMN_CONTENT));
    notesList.add("ID:" + itemId + ", 内容:" + content);
}
// 非常重要!用完Cursor一定要关闭
cursor.close();
db.close();
// 现在notesList里就有了所有备忘数据,你可以把它设置给ListView的适配器了

改 - 更新某条备忘

比如用户想修改某条已经存在的备忘。

MyDatabaseHelper dbHelper = new MyDatabaseHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(MyDatabaseHelper.COLUMN_CONTENT, "这是我修改后的备忘录内容!");
// 指定要更新哪一行,这里更新ID为1的那一行
String selection = MyDatabaseHelper.COLUMN_ID + " = ?";
String[] selectionArgs = { "1" };
int count = db.update(
        MyDatabaseHelper.TABLE_NOTES,
        values,
        selection,
        selectionArgs
);
db.close();

删 - 删除一条备忘

MyDatabaseHelper dbHelper = new MyDatabaseHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 指定要删除哪一行,这里删除ID为1的那一行
String selection = MyDatabaseHelper.COLUMN_ID + " = ?";
String[] selectionArgs = { "1" };
int deletedRows = db.delete(MyDatabaseHelper.TABLE_NOTES, selection, selectionArgs);
db.close();

总结与提醒

看,是不是没有想象中那么难?整个过程就像是在管理一个结构清晰的表格,我们来回顾一下关键步骤:

  1. 请个管家:创建 SQLiteOpenHelper 子类,定义好数据库和表的结构。
  2. 开门:在需要操作数据库的地方,通过 getWritableDatabase()getReadableDatabase() 获取数据库对象。
  3. 干活:使用 insert, query, update, delete 方法进行增删改查。
  4. 关门:操作完成后,记得调用 close() 方法关闭数据库连接,释放资源。

最后给你几个小贴士,避免踩坑:

  • 别在主线程操作数据库:复杂的数据库查询可能会耗时,导致界面卡顿(ANR),一定要在子线程(比如用 AsyncTaskThreadRxJava)中执行数据库操作。
  • Cursor必须关闭:查询得到的 Cursor 对象是个资源消耗大户,用完不关很容易导致内存泄漏。
  • onUpgrade 要小心:上面的例子为了简单直接删表重建,这在真实项目中会使用户数据丢失,正确的做法是使用 ALTER TABLE 语句来增量升级。

先从这个小例子开始动手试试吧!当你成功运行起一个可以保存数据的备忘录时,你就会发现,安卓数据库管理这座小山头,已经被你轻松拿下了。

安卓数据库怎么用?一步步教你搞定数据管理,别再头疼了