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

Android SQLite应用实例:Seinfeld应用展示

2023-08-287.9k 阅读

项目背景与目标

在Android应用开发中,数据的存储和管理是至关重要的环节。SQLite作为一款轻量级的嵌入式数据库,被广泛应用于Android平台,为应用提供高效、可靠的数据持久化解决方案。本次我们将通过开发一个名为Seinfeld的应用,深入探讨SQLite在Android应用中的实际应用。Seinfeld应用旨在为用户提供一个简单的电视剧信息管理平台,用户可以添加、查看、编辑和删除关于电视剧《宋飞正传》(Seinfeld)相关的剧集信息,如剧集名称、季数、首播日期等。通过这个实例,我们不仅可以学习到SQLite在Android中的基本操作,还能了解如何将数据库操作与Android的用户界面进行结合,打造出一个功能完整的应用。

项目搭建

创建Android项目

首先,我们需要在Android Studio中创建一个新的Android项目。打开Android Studio,选择“Start a new Android Studio project”,在“Create New Project”对话框中,填写应用名称(如Seinfeld),选择项目路径,并根据需求选择合适的项目模板。这里我们可以选择“Empty Activity”模板,然后点击“Next”。在接下来的页面中,设置最低支持的Android版本等选项,最后点击“Finish”完成项目创建。

配置权限

在AndroidManifest.xml文件中,我们不需要额外配置特殊权限来使用SQLite,因为SQLite数据库是存储在应用的私有目录下,Android系统默认应用具有对自身私有目录的读写权限。

依赖库

Android项目默认已经包含了SQLite的支持,无需额外添加特定的依赖库。SQLite是Android系统框架的一部分,通过Android SDK提供的API即可进行数据库操作。

SQLite数据库设计

数据库结构规划

对于Seinfeld应用,我们需要设计一个简单的数据库来存储剧集信息。数据库中只需要一个表,我们命名为“episodes”。该表将包含以下几个字段:

  • “id”:剧集的唯一标识符,使用整数类型,并且设置为主键,自增长。
  • “episode_name”:剧集名称,使用字符串类型。
  • “season_number”:季数,使用整数类型。
  • “air_date”:首播日期,使用字符串类型(这里为了简化,不使用日期类型,实际应用中可以根据需求转换为日期类型进行处理)。

创建数据库和表

在Android中,我们通过创建一个继承自SQLiteOpenHelper的类来管理数据库的创建和版本更新。创建一个名为“SeinfeldDatabaseHelper”的类,代码如下:

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

public class SeinfeldDatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "seinfeld.db";
    private static final int DATABASE_VERSION = 1;
    public static final String TABLE_NAME = "episodes";
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_EPISODE_NAME = "episode_name";
    public static final String COLUMN_SEASON_NUMBER = "season_number";
    public static final String COLUMN_AIR_DATE = "air_date";

    private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" +
            COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COLUMN_EPISODE_NAME + " TEXT, " +
            COLUMN_SEASON_NUMBER + " INTEGER, " +
            COLUMN_AIR_DATE + " TEXT)";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 这里简单处理版本升级,直接删除旧表并创建新表,实际应用中应更谨慎处理
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}

在上述代码中:

  1. 定义了数据库名称“seinfeld.db”和版本号“1”。
  2. 定义了表名“episodes”以及各个字段名。
  3. onCreate方法中,通过执行SQL语句创建了“episodes”表。
  4. onUpgrade方法用于处理数据库版本升级,这里简单地删除旧表并重新创建新表。实际应用中,应该根据具体需求进行更细致的处理,比如数据迁移等。

数据库操作

添加剧集信息

添加剧集信息到数据库中,我们需要在“SeinfeldDatabaseHelper”类中添加一个方法。在类中添加如下方法:

public long addEpisode(String episodeName, int seasonNumber, String airDate) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(COLUMN_EPISODE_NAME, episodeName);
    values.put(COLUMN_SEASON_NUMBER, seasonNumber);
    values.put(COLUMN_AIR_DATE, airDate);
    long newRowId = db.insert(TABLE_NAME, null, values);
    db.close();
    return newRowId;
}

在这个方法中:

  1. 首先通过getWritableDatabase方法获取一个可写的数据库实例。
  2. 创建一个ContentValues对象,用于存储要插入的数据。将剧集名称、季数和首播日期分别放入ContentValues对象中。
  3. 使用db.insert方法将数据插入到“episodes”表中,insert方法的第一个参数是表名,第二个参数是如果ContentValues为空时,指定的空列的名称(这里设置为null),第三个参数是包含数据的ContentValues对象。该方法返回插入数据的行ID,如果插入失败则返回 -1。
  4. 最后关闭数据库。

查询剧集信息

查询操作可以获取数据库中的剧集信息。我们在“SeinfeldDatabaseHelper”类中添加查询方法,例如查询所有剧集信息:

public Cursor getAllEpisodes() {
    SQLiteDatabase db = this.getReadableDatabase();
    String[] projection = {
            COLUMN_ID,
            COLUMN_EPISODE_NAME,
            COLUMN_SEASON_NUMBER,
            COLUMN_AIR_DATE
    };
    Cursor cursor = db.query(
            TABLE_NAME,
            projection,
            null,
            null,
            null,
            null,
            null
    );
    return cursor;
}

在上述代码中:

  1. 通过getReadableDatabase方法获取一个可读的数据库实例。
  2. 定义了一个投影数组projection,指定要查询的列。
  3. 使用db.query方法进行查询。query方法的第一个参数是表名;第二个参数是投影数组,即要返回的列;第三个参数是选择条件(这里设置为null,表示查询所有行);第四个参数是选择条件的参数(与第三个参数配合使用,这里也为null);第五个参数是分组依据(null表示不分组);第六个参数是分组过滤条件(null表示不过滤);第七个参数是排序方式(null表示按默认顺序)。
  4. 最后返回查询结果的Cursor对象,Cursor对象可以用于遍历查询结果集。

更新剧集信息

更新剧集信息同样在“SeinfeldDatabaseHelper”类中添加方法。例如更新某一集的首播日期:

public int updateEpisodeAirDate(long id, String newAirDate) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(COLUMN_AIR_DATE, newAirDate);
    String selection = COLUMN_ID + " =?";
    String[] selectionArgs = {String.valueOf(id)};
    int count = db.update(
            TABLE_NAME,
            values,
            selection,
            selectionArgs
    );
    db.close();
    return count;
}

在这个方法中:

  1. 获取可写数据库实例。
  2. 创建ContentValues对象,将新的首播日期放入其中。
  3. 定义选择条件selection和选择条件的参数selectionArgs,这里根据剧集的ID来确定要更新的行。
  4. 使用db.update方法进行更新操作。update方法的第一个参数是表名;第二个参数是包含更新数据的ContentValues对象;第三个参数是选择条件;第四个参数是选择条件的参数。该方法返回受影响的行数。
  5. 关闭数据库并返回受影响的行数。

删除剧集信息

删除剧集信息也在“SeinfeldDatabaseHelper”类中添加方法。比如根据剧集ID删除某一集:

public int deleteEpisode(long id) {
    SQLiteDatabase db = this.getWritableDatabase();
    String selection = COLUMN_ID + " =?";
    String[] selectionArgs = {String.valueOf(id)};
    int count = db.delete(
            TABLE_NAME,
            selection,
            selectionArgs
    );
    db.close();
    return count;
}

在上述代码中:

  1. 获取可写数据库实例。
  2. 定义选择条件和选择条件的参数,根据剧集ID来确定要删除的行。
  3. 使用db.delete方法进行删除操作。delete方法的第一个参数是表名;第二个参数是选择条件;第三个参数是选择条件的参数。该方法返回受影响的行数。
  4. 关闭数据库并返回受影响的行数。

用户界面设计与数据库交互

布局设计

我们需要设计几个界面来与数据库进行交互。首先是主界面,用于展示所有剧集列表,并提供添加新剧集的入口。在res/layout目录下创建一个名为“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">

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

    <Button
        android:id="@+id/button_add_episode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="添加剧集" />
</LinearLayout>

在这个布局中,包含一个ListView用于显示剧集列表,以及一个Button用于跳转到添加剧集的界面。

接下来创建添加剧集的界面布局,在res/layout目录下创建“activity_add_episode.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/edit_text_episode_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="剧集名称" />

    <EditText
        android:id="@+id/edit_text_season_number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="季数"
        android:inputType="number" />

    <EditText
        android:id="@+id/edit_text_air_date"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="首播日期" />

    <Button
        android:id="@+id/button_save_episode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="保存剧集" />
</LinearLayout>

此布局包含三个EditText用于输入剧集名称、季数和首播日期,以及一个Button用于保存输入的数据到数据库。

主界面逻辑

在MainActivity.java中编写主界面的逻辑代码,如下:

import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private SeinfeldDatabaseHelper dbHelper;
    private ListView listViewEpisodes;
    private SimpleCursorAdapter adapter;

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

        dbHelper = new SeinfeldDatabaseHelper(this);
        listViewEpisodes = findViewById(R.id.list_view_episodes);
        Button buttonAddEpisode = findViewById(R.id.button_add_episode);

        buttonAddEpisode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, AddEpisodeActivity.class);
                startActivity(intent);
            }
        });

        displayEpisodes();

        listViewEpisodes.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // 这里可以添加点击剧集项后的操作,如跳转到详情界面或编辑界面
                Toast.makeText(MainActivity.this, "点击了第 " + position + " 项,ID为 " + id, Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void displayEpisodes() {
        Cursor cursor = dbHelper.getAllEpisodes();
        String[] fromColumns = {
                SeinfeldDatabaseHelper.COLUMN_EPISODE_NAME,
                SeinfeldDatabaseHelper.COLUMN_SEASON_NUMBER,
                SeinfeldDatabaseHelper.COLUMN_AIR_DATE
        };
        int[] toViews = {
                android.R.id.text1,
                android.R.id.text2,
                android.R.id.text3
        };
        adapter = new SimpleCursorAdapter(
                this,
                android.R.layout.simple_list_item_3,
                cursor,
                fromColumns,
                toViews,
                0
        );
        listViewEpisodes.setAdapter(adapter);
    }

    @Override
    protected void onResume() {
        super.onResume();
        displayEpisodes();
    }
}

在上述代码中:

  1. onCreate方法中,初始化了数据库帮助类SeinfeldDatabaseHelper,获取了布局中的ListView和“添加剧集”按钮。
  2. 为“添加剧集”按钮设置点击事件,点击后跳转到添加剧集的界面AddEpisodeActivity
  3. 调用displayEpisodes方法来显示剧集列表。在displayEpisodes方法中,通过数据库帮助类查询所有剧集信息,使用SimpleCursorAdapter将查询结果适配到ListView中进行显示。SimpleCursorAdapter的构造函数参数中,第一个参数是上下文;第二个参数是列表项的布局;第三个参数是查询结果的Cursor对象;第四个参数是要显示的列;第五个参数是布局中对应的视图ID;第六个参数是标志位(这里设置为0)。
  4. onResume方法中再次调用displayEpisodes方法,确保每次回到主界面时,剧集列表都是最新的。

添加剧集界面逻辑

在AddEpisodeActivity.java中编写添加剧集界面的逻辑代码,如下:

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class AddEpisodeActivity extends AppCompatActivity {
    private EditText editTextEpisodeName;
    private EditText editTextSeasonNumber;
    private EditText editTextAirDate;
    private SeinfeldDatabaseHelper dbHelper;

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

        editTextEpisodeName = findViewById(R.id.edit_text_episode_name);
        editTextSeasonNumber = findViewById(R.id.edit_text_season_number);
        editTextAirDate = findViewById(R.id.edit_text_air_date);
        Button buttonSaveEpisode = findViewById(R.id.button_save_episode);

        dbHelper = new SeinfeldDatabaseHelper(this);

        buttonSaveEpisode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String episodeName = editTextEpisodeName.getText().toString().trim();
                int seasonNumber = 0;
                try {
                    seasonNumber = Integer.parseInt(editTextSeasonNumber.getText().toString().trim());
                } catch (NumberFormatException e) {
                    Toast.makeText(AddEpisodeActivity.this, "季数输入错误", Toast.LENGTH_SHORT).show();
                    return;
                }
                String airDate = editTextAirDate.getText().toString().trim();

                long newRowId = dbHelper.addEpisode(episodeName, seasonNumber, airDate);
                if (newRowId != -1) {
                    Toast.makeText(AddEpisodeActivity.this, "剧集添加成功", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(AddEpisodeActivity.this, MainActivity.class);
                    startActivity(intent);
                    finish();
                } else {
                    Toast.makeText(AddEpisodeActivity.this, "剧集添加失败", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

在这段代码中:

  1. onCreate方法中,初始化了布局中的EditText和“保存剧集”按钮,以及数据库帮助类SeinfeldDatabaseHelper
  2. 为“保存剧集”按钮设置点击事件。在点击事件中,获取用户在EditText中输入的剧集名称、季数和首播日期。对季数输入进行了简单的格式检查,确保输入为整数。
  3. 调用数据库帮助类的addEpisode方法将数据插入到数据库中。如果插入成功,显示“剧集添加成功”的提示,并跳转到主界面;如果插入失败,显示“剧集添加失败”的提示。

进一步优化与扩展

数据验证与错误处理

在数据插入和更新操作中,我们可以进一步增强数据验证。例如,对于剧集名称,我们可以限制其长度,确保不能为空且不超过一定字符数。在“SeinfeldDatabaseHelper”类的addEpisodeupdateEpisode方法中添加如下验证逻辑:

public long addEpisode(String episodeName, int seasonNumber, String airDate) {
    if (episodeName == null || episodeName.length() == 0 || episodeName.length() > 100) {
        return -1; // 剧集名称不符合要求,返回 -1 表示失败
    }
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(COLUMN_EPISODE_NAME, episodeName);
    values.put(COLUMN_SEASON_NUMBER, seasonNumber);
    values.put(COLUMN_AIR_DATE, airDate);
    long newRowId = db.insert(TABLE_NAME, null, values);
    db.close();
    return newRowId;
}

public int updateEpisode(long id, String episodeName, int seasonNumber, String airDate) {
    if (episodeName == null || episodeName.length() == 0 || episodeName.length() > 100) {
        return -1; // 剧集名称不符合要求,返回 -1 表示失败
    }
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(COLUMN_EPISODE_NAME, episodeName);
    values.put(COLUMN_SEASON_NUMBER, seasonNumber);
    values.put(COLUMN_AIR_DATE, airDate);
    String selection = COLUMN_ID + " =?";
    String[] selectionArgs = {String.valueOf(id)};
    int count = db.update(
            TABLE_NAME,
            values,
            selection,
            selectionArgs
    );
    db.close();
    return count;
}

在错误处理方面,除了在数据库操作方法中返回错误标识外,我们可以在用户界面层进行更友好的提示。例如,在AddEpisodeActivity的addEpisode方法调用后,根据返回值显示更详细的错误信息:

buttonSaveEpisode.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String episodeName = editTextEpisodeName.getText().toString().trim();
        int seasonNumber = 0;
        try {
            seasonNumber = Integer.parseInt(editTextSeasonNumber.getText().toString().trim());
        } catch (NumberFormatException e) {
            Toast.makeText(AddEpisodeActivity.this, "季数输入错误", Toast.LENGTH_SHORT).show();
            return;
        }
        String airDate = editTextAirDate.getText().toString().trim();

        long newRowId = dbHelper.addEpisode(episodeName, seasonNumber, airDate);
        if (newRowId != -1) {
            Toast.makeText(AddEpisodeActivity.this, "剧集添加成功", Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(AddEpisodeActivity.this, MainActivity.class);
            startActivity(intent);
            finish();
        } else {
            Toast.makeText(AddEpisodeActivity.this, "剧集名称不符合要求,添加失败", Toast.LENGTH_SHORT).show();
        }
    }
});

数据排序与过滤

在查询操作中,我们可以根据用户需求对剧集信息进行排序和过滤。例如,在“SeinfeldDatabaseHelper”类中添加一个按季数升序查询剧集的方法:

public Cursor getEpisodesBySeasonAsc() {
    SQLiteDatabase db = this.getReadableDatabase();
    String[] projection = {
            COLUMN_ID,
            COLUMN_EPISODE_NAME,
            COLUMN_SEASON_NUMBER,
            COLUMN_AIR_DATE
    };
    Cursor cursor = db.query(
            TABLE_NAME,
            projection,
            null,
            null,
            null,
            null,
            COLUMN_SEASON_NUMBER + " ASC"
    );
    return cursor;
}

在MainActivity中,我们可以添加一个按钮来触发按季数升序查询并显示剧集列表:

<Button
    android:id="@+id/button_sort_by_season"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="按季数升序排序" />

在MainActivity.java中添加按钮点击事件处理:

Button buttonSortBySeason = findViewById(R.id.button_sort_by_season);
buttonSortBySeason.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Cursor cursor = dbHelper.getEpisodesBySeasonAsc();
        String[] fromColumns = {
                SeinfeldDatabaseHelper.COLUMN_EPISODE_NAME,
                SeinfeldDatabaseHelper.COLUMN_SEASON_NUMBER,
                SeinfeldDatabaseHelper.COLUMN_AIR_DATE
        };
        int[] toViews = {
                android.R.id.text1,
                android.R.id.text2,
                android.R.id.text3
        };
        adapter = new SimpleCursorAdapter(
                MainActivity.this,
                android.R.layout.simple_list_item_3,
                cursor,
                fromColumns,
                toViews,
                0
        );
        listViewEpisodes.setAdapter(adapter);
    }
});

对于过滤操作,例如按首播日期范围过滤剧集。在“SeinfeldDatabaseHelper”类中添加方法:

public Cursor getEpisodesByAirDateRange(String startDate, String endDate) {
    SQLiteDatabase db = this.getReadableDatabase();
    String[] projection = {
            COLUMN_ID,
            COLUMN_EPISODE_NAME,
            COLUMN_SEASON_NUMBER,
            COLUMN_AIR_DATE
    };
    String selection = COLUMN_AIR_DATE + " BETWEEN? AND?";
    String[] selectionArgs = {startDate, endDate};
    Cursor cursor = db.query(
            TABLE_NAME,
            projection,
            selection,
            selectionArgs,
            null,
            null,
            null
    );
    return cursor;
}

在MainActivity中添加界面元素和逻辑来触发过滤查询:

<EditText
    android:id="@+id/edit_text_start_date"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="开始日期" />
<EditText
    android:id="@+id/edit_text_end_date"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="结束日期" />
<Button
    android:id="@+id/button_filter_by_air_date"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="按首播日期范围过滤" />

在MainActivity.java中添加按钮点击事件处理:

Button buttonFilterByAirDate = findViewById(R.id.button_filter_by_air_date);
EditText editTextStartDate = findViewById(R.id.edit_text_start_date);
EditText editTextEndDate = findViewById(R.id.edit_text_end_date);
buttonFilterByAirDate.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String startDate = editTextStartDate.getText().toString().trim();
        String endDate = editTextEndDate.getText().toString().trim();
        Cursor cursor = dbHelper.getEpisodesByAirDateRange(startDate, endDate);
        String[] fromColumns = {
                SeinfeldDatabaseHelper.COLUMN_EPISODE_NAME,
                SeinfeldDatabaseHelper.COLUMN_SEASON_NUMBER,
                SeinfeldDatabaseHelper.COLUMN_AIR_DATE
        };
        int[] toViews = {
                android.R.id.text1,
                android.R.id.text2,
                android.R.id.text3
        };
        adapter = new SimpleCursorAdapter(
                MainActivity.this,
                android.R.layout.simple_list_item_3,
                cursor,
                fromColumns,
                toViews,
                0
        );
        listViewEpisodes.setAdapter(adapter);
    }
});

数据库性能优化

  1. 批量操作:在进行大量数据插入或更新时,可以使用事务来提高性能。例如,假设我们有一个剧集列表需要批量插入到数据库中,可以在“SeinfeldDatabaseHelper”类中添加如下方法:
public void batchAddEpisodes(List<Episode> episodeList) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.beginTransaction();
    try {
        for (Episode episode : episodeList) {
            ContentValues values = new ContentValues();
            values.put(COLUMN_EPISODE_NAME, episode.getEpisodeName());
            values.put(COLUMN_SEASON_NUMBER, episode.getSeasonNumber());
            values.put(COLUMN_AIR_DATE, episode.getAirDate());
            db.insert(TABLE_NAME, null, values);
        }
        db.setTransactionSuccessful();
    } finally {
        db.endTransaction();
    }
    db.close();
}

这里Episode是一个自定义的类,用于封装剧集信息。

public class Episode {
    private long id;
    private String episodeName;
    private int seasonNumber;
    private String airDate;

    public Episode(String episodeName, int seasonNumber, String airDate) {
        this.episodeName = episodeName;
        this.seasonNumber = seasonNumber;
        this.airDate = airDate;
    }

    // Getter 和 Setter 方法
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getEpisodeName() {
        return episodeName;
    }

    public void setEpisodeName(String episodeName) {
        this.episodeName = episodeName;
    }

    public int getSeasonNumber() {
        return seasonNumber;
    }

    public void setSeasonNumber(int seasonNumber) {
        this.seasonNumber = seasonNumber;
    }

    public String getAirDate() {
        return airDate;
    }

    public void setAirDate(String airDate) {
        this.airDate = airDate;
    }
}

在需要批量插入的地方,例如在一个新的Activity中:

List<Episode> episodeList = new ArrayList<>();
episodeList.add(new Episode("Episode 1", 1, "1989-07-05"));
episodeList.add(new Episode("Episode 2", 1, "1989-07-12"));
// 添加更多剧集
SeinfeldDatabaseHelper dbHelper = new SeinfeldDatabaseHelper(this);
dbHelper.batchAddEpisodes(episodeList);
  1. 索引优化:如果经常根据某个字段进行查询,可以为该字段创建索引。例如,我们经常根据首播日期查询剧集,在“SeinfeldDatabaseHelper”类的onCreate方法中添加索引创建语句:
@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE);
    db.execSQL("CREATE INDEX idx_air_date ON " + TABLE_NAME + " (" + COLUMN_AIR_DATE + ")");
}

这样在执行基于首播日期的查询时,数据库的查询效率会得到提升。

通过以上优化和扩展,我们的Seinfeld应用在功能和性能上都得到了进一步提升,能够更好地满足用户对电视剧集信息管理的需求。同时,这些优化和扩展方法也可以应用到其他使用SQLite数据库的Android应用开发中。