Android SQLite应用实例:Seinfeld应用展示
项目背景与目标
在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);
}
}
在上述代码中:
- 定义了数据库名称“seinfeld.db”和版本号“1”。
- 定义了表名“episodes”以及各个字段名。
- 在
onCreate
方法中,通过执行SQL语句创建了“episodes”表。 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;
}
在这个方法中:
- 首先通过
getWritableDatabase
方法获取一个可写的数据库实例。 - 创建一个
ContentValues
对象,用于存储要插入的数据。将剧集名称、季数和首播日期分别放入ContentValues
对象中。 - 使用
db.insert
方法将数据插入到“episodes”表中,insert
方法的第一个参数是表名,第二个参数是如果ContentValues为空时,指定的空列的名称(这里设置为null
),第三个参数是包含数据的ContentValues
对象。该方法返回插入数据的行ID,如果插入失败则返回 -1。 - 最后关闭数据库。
查询剧集信息
查询操作可以获取数据库中的剧集信息。我们在“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;
}
在上述代码中:
- 通过
getReadableDatabase
方法获取一个可读的数据库实例。 - 定义了一个投影数组
projection
,指定要查询的列。 - 使用
db.query
方法进行查询。query
方法的第一个参数是表名;第二个参数是投影数组,即要返回的列;第三个参数是选择条件(这里设置为null
,表示查询所有行);第四个参数是选择条件的参数(与第三个参数配合使用,这里也为null
);第五个参数是分组依据(null
表示不分组);第六个参数是分组过滤条件(null
表示不过滤);第七个参数是排序方式(null
表示按默认顺序)。 - 最后返回查询结果的
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;
}
在这个方法中:
- 获取可写数据库实例。
- 创建
ContentValues
对象,将新的首播日期放入其中。 - 定义选择条件
selection
和选择条件的参数selectionArgs
,这里根据剧集的ID来确定要更新的行。 - 使用
db.update
方法进行更新操作。update
方法的第一个参数是表名;第二个参数是包含更新数据的ContentValues
对象;第三个参数是选择条件;第四个参数是选择条件的参数。该方法返回受影响的行数。 - 关闭数据库并返回受影响的行数。
删除剧集信息
删除剧集信息也在“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;
}
在上述代码中:
- 获取可写数据库实例。
- 定义选择条件和选择条件的参数,根据剧集ID来确定要删除的行。
- 使用
db.delete
方法进行删除操作。delete
方法的第一个参数是表名;第二个参数是选择条件;第三个参数是选择条件的参数。该方法返回受影响的行数。 - 关闭数据库并返回受影响的行数。
用户界面设计与数据库交互
布局设计
我们需要设计几个界面来与数据库进行交互。首先是主界面,用于展示所有剧集列表,并提供添加新剧集的入口。在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();
}
}
在上述代码中:
- 在
onCreate
方法中,初始化了数据库帮助类SeinfeldDatabaseHelper
,获取了布局中的ListView
和“添加剧集”按钮。 - 为“添加剧集”按钮设置点击事件,点击后跳转到添加剧集的界面
AddEpisodeActivity
。 - 调用
displayEpisodes
方法来显示剧集列表。在displayEpisodes
方法中,通过数据库帮助类查询所有剧集信息,使用SimpleCursorAdapter
将查询结果适配到ListView
中进行显示。SimpleCursorAdapter
的构造函数参数中,第一个参数是上下文;第二个参数是列表项的布局;第三个参数是查询结果的Cursor
对象;第四个参数是要显示的列;第五个参数是布局中对应的视图ID;第六个参数是标志位(这里设置为0)。 - 在
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();
}
}
});
}
}
在这段代码中:
- 在
onCreate
方法中,初始化了布局中的EditText
和“保存剧集”按钮,以及数据库帮助类SeinfeldDatabaseHelper
。 - 为“保存剧集”按钮设置点击事件。在点击事件中,获取用户在
EditText
中输入的剧集名称、季数和首播日期。对季数输入进行了简单的格式检查,确保输入为整数。 - 调用数据库帮助类的
addEpisode
方法将数据插入到数据库中。如果插入成功,显示“剧集添加成功”的提示,并跳转到主界面;如果插入失败,显示“剧集添加失败”的提示。
进一步优化与扩展
数据验证与错误处理
在数据插入和更新操作中,我们可以进一步增强数据验证。例如,对于剧集名称,我们可以限制其长度,确保不能为空且不超过一定字符数。在“SeinfeldDatabaseHelper”类的addEpisode
和updateEpisode
方法中添加如下验证逻辑:
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);
}
});
数据库性能优化
- 批量操作:在进行大量数据插入或更新时,可以使用事务来提高性能。例如,假设我们有一个剧集列表需要批量插入到数据库中,可以在“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);
- 索引优化:如果经常根据某个字段进行查询,可以为该字段创建索引。例如,我们经常根据首播日期查询剧集,在“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应用开发中。