MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Android SQLite开发环境搭建与工具安装

2021-12-146.6k 阅读

一、Android 开发环境基础

在开始搭建 Android SQLite 开发环境之前,我们需要先确保具备基本的 Android 开发环境。这包括 Java 开发工具包(JDK)、Android 软件开发工具包(SDK)以及集成开发环境(IDE),如 Android Studio。

1.1 安装 JDK

JDK 是 Java 开发的基础,Android 应用开发基于 Java 语言,所以 JDK 是必不可少的。

  1. 下载 JDK
    • 访问 Oracle 官方网站的 JDK 下载页面(https://www.oracle.com/java/technologies/javase-downloads.html )。根据你的操作系统(如 Windows、Linux 或 macOS)选择合适的 JDK 版本进行下载。通常建议下载最新的长期支持(LTS)版本,以获得更好的稳定性和安全性。
    • 例如,在 Windows 系统上,点击对应的 Windows x64 安装包下载链接,下载.exe 文件。
  2. 安装 JDK
    • 运行下载的安装程序。在安装向导中,按照提示逐步进行操作。可以选择自定义安装路径,不过建议使用默认路径,这样便于后续配置环境变量。
    • 在 Windows 上,安装过程中会提示选择 JDK 的安装目录和 JRE(Java Runtime Environment)的安装目录,一般默认即可。安装完成后,JDK 会被安装到指定目录,例如 C:\Program Files\Java\jdk - <version>
  3. 配置环境变量
    • 在 Windows 系统中:
      • 右键点击“此电脑”,选择“属性”。
      • 在弹出的窗口中,点击“高级系统设置”。
      • 在“系统属性”窗口的“高级”选项卡下,点击“环境变量”按钮。
      • 在“系统变量”中,找到“Path”变量,点击“编辑”。
      • 点击“新建”,添加 JDK 的 bin 目录路径,例如 C:\Program Files\Java\jdk - <version>\bin
      • 还需要设置 JAVA_HOME 变量,新建系统变量 JAVA_HOME,变量值为 JDK 的安装目录,即 C:\Program Files\Java\jdk - <version>
    • 在 macOS 系统中:
      • 打开终端,编辑 ~/.bash_profile 文件(如果没有该文件,可以创建)。使用命令 open -e ~/.bash_profile
      • 在文件中添加以下内容:
        export JAVA_HOME = /Library/Java/JavaVirtualMachines/jdk - <version>.jdk/Contents/Home
        export PATH = $JAVA_HOME/bin:$PATH
        
      • 保存并关闭文件,然后在终端执行 source ~/.bash_profile 使配置生效。
    • 在 Linux 系统中(以 Ubuntu 为例):
      • 编辑 ~/.bashrc 文件,使用命令 nano ~/.bashrc
      • 在文件末尾添加:
        export JAVA_HOME = /usr/lib/jvm/java - <version> - openjdk - amd64
        export PATH = $JAVA_HOME/bin:$PATH
        
      • 保存并关闭文件,执行 source ~/.bashrc 使配置生效。

1.2 安装 Android SDK

Android SDK 包含了开发 Android 应用所需的各种工具、平台版本、系统镜像等。

  1. 下载 Android Studio
    • 访问 Android 开发者官网(https://developer.android.com/studio ),点击“Download Android Studio”按钮下载适合你操作系统的安装包。
    • 例如,在 Windows 系统下载 android - studio - <version>.exe 文件。
  2. 安装 Android Studio
    • 运行下载的安装程序,在安装向导中,按照提示逐步操作。可以选择自定义安装路径,但默认路径通常是不错的选择。
    • 在安装过程中,会提示选择 Android SDK 的安装位置。默认情况下,Android Studio 会创建一个 Android 目录,并在其中放置 SDK。例如,在 Windows 上可能是 C:\Users\YourUsername\Android\Sdk
  3. 安装 SDK 组件
    • 启动 Android Studio。第一次启动时,会弹出“Welcome to Android Studio”窗口。选择“Configure” -> “SDK Manager”。
    • 在“SDK Manager”窗口中,你可以看到多个选项卡。在“SDK Platforms”选项卡中,选择你想要开发支持的 Android 版本。例如,选择最新的稳定版本(如 Android 12),并确保勾选“Show Package Details”,然后在下方列表中选择所需的组件,如“Sources for Android ”(用于查看 Android 源码)。
    • 在“SDK Tools”选项卡中,确保安装了“Android SDK Build - Tools”(用于构建 Android 应用)、“Android SDK Platform - Tools”(包含重要的开发工具,如 adb)等常用工具。点击“Apply”按钮开始安装所选组件。

二、认识 SQLite 与 Android 的集成

SQLite 是一款轻量级的嵌入式数据库,它在 Android 系统中被广泛应用。Android 框架提供了一套 SQLite 数据库的 API,使得开发者可以方便地在 Android 应用中创建、操作数据库。

2.1 SQLite 特点

  1. 轻量级:SQLite 不需要独立的服务器进程,它直接读写磁盘文件,占用资源极少,非常适合移动设备等资源有限的环境。
  2. 开源:SQLite 是开源软件,任何人都可以免费使用和修改其源代码,这对于开发者来说成本较低。
  3. 支持标准 SQL:SQLite 支持大部分 SQL92 标准,开发者可以使用熟悉的 SQL 语句进行数据库操作,如 CREATE TABLEINSERTSELECTUPDATEDELETE 等。
  4. 事务支持:SQLite 支持事务处理,确保数据库操作的原子性、一致性、隔离性和持久性(ACID)特性。例如,在执行多个数据库操作时,如果其中一个操作失败,整个事务可以回滚,保证数据库状态的一致性。

2.2 Android 对 SQLite 的支持

Android 为 SQLite 提供了丰富的 API,主要集中在 android.database.sqlite 包中。以下是一些关键类:

  1. SQLiteOpenHelper:这是一个抽象类,用于帮助管理数据库的创建和版本管理。开发者通常需要继承这个类,并实现 onCreateonUpgrade 方法。
    • onCreate(SQLiteDatabase db):当数据库第一次被创建时调用,在这个方法中可以执行创建表、插入初始数据等操作。
    • onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion):当数据库版本发生变化时调用,例如应用升级需要更新数据库结构,就可以在这个方法中进行表的修改、数据迁移等操作。
  2. SQLiteDatabase:这个类提供了执行 SQL 语句、管理事务等方法,用于实际操作数据库。例如 execSQL(String sql) 方法可以执行任何 SQL 语句,insert(String table, String nullColumnHack, ContentValues values) 方法用于向表中插入数据。
  3. ContentValues:用于存储一组键值对,类似于 Map,通常用于插入或更新数据。例如:
    ContentValues values = new ContentValues();
    values.put("name", "John");
    values.put("age", 30);
    

三、搭建 Android SQLite 开发环境

在具备了基本的 Android 开发环境后,我们可以开始搭建专门用于 Android SQLite 开发的环境。

3.1 创建 Android 项目

  1. 启动 Android Studio:打开已安装好的 Android Studio。
  2. 创建新项目
    • 在“Welcome to Android Studio”窗口中,点击“New Project”。
    • 在“Create New Project”对话框中,选择项目模板。对于简单的 SQLite 示例,“Empty Activity”模板通常就足够了。点击“Next”。
    • 输入应用名称(如“SQLiteExample”),选择项目的保存位置,设置包名(如“com.example.sqliteexample”)。注意包名要遵循命名规范,一般采用反向域名的形式。点击“Finish”。
    • Android Studio 会自动创建一个基本的 Android 项目结构,包括 app 模块(包含应用代码、资源等)、gradle 配置文件等。

3.2 配置项目依赖

虽然 Android 内置了对 SQLite 的支持,但有时候可能需要一些额外的依赖来增强开发体验或使用特定功能。在项目的 build.gradle 文件(通常是 app/build.gradle)中,可以配置相关依赖。例如,如果需要使用 SQLite 的加密功能,可能会引入第三方加密库。不过对于基本的 SQLite 开发,默认的 Android 依赖已经足够。

3.3 创建 SQLite 数据库辅助类

  1. 创建类继承 SQLiteOpenHelper
    • 在项目的 java 目录下,找到你的包名对应的目录(如 com.example.sqliteexample)。右键点击该目录,选择“New” -> “Java Class”。
    • 输入类名,例如“DatabaseHelper”,并点击“OK”。
    • DatabaseHelper 类中,继承 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 = "example.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) {
            String createTableQuery = "CREATE TABLE users (" +
                    "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    "name TEXT, " +
                    "age INTEGER)";
            db.execSQL(createTableQuery);
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // 这里简单示例,如果版本变化,删除旧表并重新创建
            db.execSQL("DROP TABLE IF EXISTS users");
            onCreate(db);
        }
    }
    
    • 在上述代码中:
      • DATABASE_NAME 定义了数据库的名称为“example.db”。
      • DATABASE_VERSION 定义了数据库的版本为 1。
      • onCreate 方法中,使用 execSQL 方法执行 SQL 语句创建了一个名为“users”的表,该表包含“id”(自增长主键)、“name”(文本类型)和“age”(整数类型)字段。
      • onUpgrade 方法中,简单地删除旧的“users”表并重新调用 onCreate 方法创建新表。在实际应用中,可能需要更复杂的数据迁移操作。

四、Android SQLite 开发工具安装与使用

除了在代码中操作 SQLite 数据库,还有一些工具可以帮助我们更好地开发和调试 SQLite 相关功能。

4.1 Android Device Monitor 中的 SQLite 查看器(旧版工具)

在较旧版本的 Android 开发环境中,Android Device Monitor 提供了 SQLite 查看器功能。

  1. 启动 Android Device Monitor
    • 在 Android Studio 中,点击菜单栏的“Tools” -> “Android” -> “Android Device Monitor”。
    • 如果没有看到该选项,可能需要手动启动 monitor 工具。在 Android SDK 的 tools 目录下,找到 monitor.bat(Windows)或 monitor(Linux / macOS)文件并运行。
  2. 连接设备或模拟器:确保你的 Android 设备已通过 USB 连接到电脑并开启 USB 调试,或者启动了 Android 模拟器。在 Android Device Monitor 的“Devices”面板中,应该能看到设备或模拟器的列表。
  3. 找到 SQLite 数据库文件
    • 在“Devices”面板中,展开设备节点,找到应用的包名对应的节点(如 com.example.sqliteexample)。
    • 点击“data” -> “data” -> “com.example.sqliteexample” -> “databases”,可以看到项目创建的 SQLite 数据库文件(如“example.db”)。
  4. 使用 SQLite 查看器
    • 双击数据库文件,会弹出 SQLite 查看器窗口。在该窗口中,可以查看表结构、执行 SQL 查询、插入、更新和删除数据等操作。例如,在“SQL Query”标签页中输入“SELECT * FROM users”,点击“Execute”按钮,就可以查看“users”表中的所有数据。

4.2 SQLiteStudio(跨平台独立工具)

SQLiteStudio 是一款功能强大的跨平台 SQLite 数据库管理工具,可用于 Android SQLite 开发的调试和管理。

  1. 下载 SQLiteStudio
    • 访问 SQLiteStudio 官方网站(https://sqlitestudio.pl/ ),在下载页面选择适合你操作系统的安装包进行下载。例如,在 Windows 系统下载 SQLiteStudio - <version>.exe 文件。
  2. 安装 SQLiteStudio
    • 运行下载的安装程序,按照安装向导的提示进行操作。在安装过程中,可以选择安装路径等选项,一般默认设置即可。
  3. 连接 Android SQLite 数据库
    • 首先,需要从 Android 设备或模拟器中导出 SQLite 数据库文件。可以使用 adb 命令来完成。在命令行中输入以下命令(假设设备已连接且已开启 USB 调试):
      adb pull /data/data/com.example.sqliteexample/databases/example.db C:\temp
      
      上述命令将 example.db 文件从设备中拉取到本地的 C:\temp 目录。
    • 打开 SQLiteStudio,点击菜单栏的“Database” -> “Add a database”。
    • 在弹出的“Add a database”对话框中,点击“...”按钮,选择刚刚导出的 SQLite 数据库文件(如 C:\temp\example.db)。点击“OK”完成数据库连接。
  4. 使用 SQLiteStudio 操作数据库
    • 在 SQLiteStudio 的界面中,可以直观地查看数据库的表结构、执行 SQL 语句、管理数据等。例如,在“SQL editor”标签页中输入 SQL 语句,如“INSERT INTO users (name, age) VALUES ('Jane', 25)”,点击“Execute”按钮即可向“users”表中插入一条新数据。

4.3 Android Profiler 中的数据库分析(新版工具)

在新版的 Android Studio 中,Android Profiler 提供了数据库分析功能,可以帮助开发者了解应用中数据库操作的性能。

  1. 启动 Android Profiler
    • 在 Android Studio 中,点击菜单栏的“View” -> “Tool Windows” -> “Android Profiler”。
    • 确保你的应用在设备或模拟器上运行。在 Android Profiler 窗口中,选择对应的设备和应用进程。
  2. 查看数据库操作
    • 在 Android Profiler 窗口中,切换到“Database”标签页。这里可以看到应用中执行的 SQL 语句、执行时间、数据读写量等信息。例如,可以看到每次 INSERTSELECT 操作的具体时间和执行的 SQL 语句内容,有助于发现性能瓶颈。
    • 还可以通过点击具体的操作记录,查看更多详细信息,如绑定的参数值等。例如,如果执行了一个带参数的 SELECT 语句,在这里可以看到具体的参数值,方便调试和优化。

五、代码示例:Android SQLite 完整操作

以下是一个完整的 Android 应用代码示例,展示了如何使用 SQLite 进行数据的增、删、改、查操作。

5.1 布局文件(activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/editTextName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter name"/>

    <EditText
        android:id="@+id/editTextAge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter age"
        android:inputType="number"/>

    <Button
        android:id="@+id/buttonInsert"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Insert"/>

    <ListView
        android:id="@+id/listViewUsers"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/buttonDelete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Delete"/>

    <EditText
        android:id="@+id/editTextUpdateId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter id to update"/>

    <EditText
        android:id="@+id/editTextUpdateName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter new name"/>

    <EditText
        android:id="@+id/editTextUpdateAge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter new age"
        android:inputType="number"/>

    <Button
        android:id="@+id/buttonUpdate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Update"/>
</LinearLayout>

在上述布局文件中,定义了输入姓名、年龄的 EditText,用于插入、删除、更新操作的 Button,以及用于显示用户列表的 ListView

5.2 数据模型类(User.java)

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

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

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

User 类用于封装用户数据,包含 idnameage 字段及对应的访问方法。

5.3 数据库辅助类(DatabaseHelper.java)

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 = "example.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) {
        String createTableQuery = "CREATE TABLE users (" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "name TEXT, " +
                "age INTEGER)";
        db.execSQL(createTableQuery);
    }

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

该类继承自 SQLiteOpenHelper,负责数据库的创建和版本管理,之前已有详细介绍。

5.4 主活动类(MainActivity.java)

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private DatabaseHelper databaseHelper;
    private EditText editTextName, editTextAge, editTextUpdateId, editTextUpdateName, editTextUpdateAge;
    private Button buttonInsert, buttonDelete, buttonUpdate;
    private ListView listViewUsers;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        databaseHelper = new DatabaseHelper(this);
        editTextName = findViewById(R.id.editTextName);
        editTextAge = findViewById(R.id.editTextAge);
        buttonInsert = findViewById(R.id.buttonInsert);
        listViewUsers = findViewById(R.id.listViewUsers);
        buttonDelete = findViewById(R.id.buttonDelete);
        editTextUpdateId = findViewById(R.id.editTextUpdateId);
        editTextUpdateName = findViewById(R.id.editTextUpdateName);
        editTextUpdateAge = findViewById(R.id.editTextUpdateAge);
        buttonUpdate = findViewById(R.id.buttonUpdate);

        buttonInsert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = editTextName.getText().toString();
                int age = Integer.parseInt(editTextAge.getText().toString());
                insertData(name, age);
                displayData();
            }
        });

        buttonDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                displayData();
                deleteData();
            }
        });

        buttonUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int id = Integer.parseInt(editTextUpdateId.getText().toString());
                String name = editTextUpdateName.getText().toString();
                int age = Integer.parseInt(editTextUpdateAge.getText().toString());
                updateData(id, name, age);
                displayData();
            }
        });

        listViewUsers.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                User user = (User) parent.getItemAtPosition(position);
                editTextUpdateId.setText(String.valueOf(user.getId()));
                editTextUpdateName.setText(user.getName());
                editTextUpdateAge.setText(String.valueOf(user.getAge()));
            }
        });

        displayData();
    }

    private void insertData(String name, int age) {
        SQLiteDatabase db = databaseHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("age", age);
        long result = db.insert("users", null, values);
        if (result == -1) {
            Toast.makeText(this, "Insertion failed", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "Insertion successful", Toast.LENGTH_SHORT).show();
        }
        db.close();
    }

    private void displayData() {
        SQLiteDatabase db = databaseHelper.getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM users", null);
        List<User> userList = new ArrayList<>();
        if (cursor.moveToFirst()) {
            do {
                int id = cursor.getInt(0);
                String name = cursor.getString(1);
                int age = cursor.getInt(2);
                User user = new User(id, name, age);
                userList.add(user);
            } while (cursor.moveToNext());
        }
        cursor.close();
        db.close();

        ArrayAdapter<User> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, userList);
        listViewUsers.setAdapter(adapter);
    }

    private void deleteData() {
        SQLiteDatabase db = databaseHelper.getWritableDatabase();
        int result = db.delete("users", null, null);
        if (result == -1) {
            Toast.makeText(this, "Deletion failed", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "Deletion successful", Toast.LENGTH_SHORT).show();
        }
        db.close();
    }

    private void updateData(int id, String name, int age) {
        SQLiteDatabase db = databaseHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("age", age);
        int result = db.update("users", values, "id =?", new String[]{String.valueOf(id)});
        if (result == -1) {
            Toast.makeText(this, "Update failed", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "Update successful", Toast.LENGTH_SHORT).show();
        }
        db.close();
    }
}

MainActivity 类中:

  • onCreate 方法中,初始化了数据库辅助类和界面组件,并为按钮设置了点击事件。
  • insertData 方法用于向数据库中插入数据,使用 ContentValues 封装数据,调用 SQLiteDatabaseinsert 方法执行插入操作。
  • displayData 方法从数据库中查询数据,使用 Cursor 遍历结果集,将数据封装到 User 对象列表中,并通过 ArrayAdapter 显示在 ListView 中。
  • deleteData 方法调用 SQLiteDatabasedelete 方法删除表中的所有数据。
  • updateData 方法使用 ContentValues 封装更新的数据,调用 SQLiteDatabaseupdate 方法根据 id 更新指定的数据。

通过以上步骤和代码示例,我们完成了 Android SQLite 开发环境的搭建、工具的安装与使用,并展示了完整的 SQLite 数据库操作。在实际开发中,可以根据具体需求进一步优化和扩展这些功能。