Android移動應用開發
課程設計報告
(2019—2020學年 第Ⅰ學期)
電子詞典
系 別 信息與控制工程
專 業 計算機科學與技術
班 級 1701
姓 名 高興
指導教師 郭 丹
目錄
一、需求分析
1.1引言
1.1.1編寫目的
1.1.2項目背景
1.2功能需求分析
1.2.1功能描述
1.3系統功能用例圖
1.4系統開發及運行環境
二、功能設計
2.1系統詳細設計
2.1.1進入界面
2.1.2主界面
2.1.3添加界面
2.1.4刪除界面
2.2數據庫
2.2.1表名
2.2.2表結構
2.2.3數據庫的創建
三、關鍵源代碼
四、實際測試
五、項目總結
一、需求分析
1.1引言
21世紀以來,科技發展勢頭迅猛,電子行業更可以說得上是日新月異。從各個方面來看,由於智能手機的普及,手機APP已然成為了電子行業中的領頭羊。
1.1.1編寫目的
詞典對於人們學習知識,認識世界有着不可估量的價值,可以說是每一個人開啟學習殿堂的第一扇門。但是傳統的詞典有着體積大,不便於攜帶的劣勢,在如今飛速發展的現代社會,這顯然並不會成為大多數人的最佳選擇。於是電子詞典手機APP就如雨后春筍般層出不窮,成為了詞典這個大家族中不可或缺的一員。
1.1.2項目背景
比起傳統詞典,手機電子詞典具備了便於攜帶、操作簡單、方便快捷等優點。如今市面上各大應用市場中的電子詞典大多占用內存大,對手機的硬件配置要求也比較高,運行起來需要占用的資源較大。所以本項目意在開發出一款占用內存小,適用度較高,便於操作,能被大部分用戶所接受的手機APP軟件。
本文詳細介紹了開發軟件所用到的的數據庫的創建過程、開發軟件的環境配置過程、以及細致地分析了整個軟件的功能性與實用性。
本項目基於Android平台,使用了SQLite輕量級數據庫實現了本地查詢,單詞本,單詞釋義等功能,研究方法和技術主要涉及Android操作系統應用層開發,經過反復測試,該項目現已研發完成。
1.2功能需求分析
1.2.1功能描述
1.2.1.1主要功能
通過開發前期對於各大手機軟件應用市場進行市場調研,得到了一份基本功能數據匯總,確定了大部分電子詞典軟件都包含着的基本功能,也就是用戶對於電子詞典手機APP的主要需求。在仔細研究以及分析這些數據之后,以下是電子詞典這個軟件所需要基本的功能:
(1)檢索功能,這個最核心的功能,實現了單詞的查詢操作。
(2)添加功能,實現生詞的添加。
(3)刪除功能,實現錯誤輸入單詞的刪除。
1.3.系統功能用例圖
圖1.3系統功能用例圖
1.4系統開發及運行環境
開發環境:android studio
運行環境:Android智能手機/模擬器
二、功能設計
2.1系統詳細設計
2.1.1進入界面
圖2.1.1 進入界面
2.1.2主界面
圖2.1.2主界面
2.1.3添加界面
圖2.1.3 添加界面
2.1.4刪除界面
2.1.4刪除界面
2.2數據庫
2.2.1表名tb_dict
2.2.2表結構
2.2.3數據庫的創建
package com.example;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import androidx.annotation.Nullable;
public class DBOpenHelper extends SQLiteOpenHelper {
final String CREATE_TABLE_SQL="create table tb_dict(_id integer primary key autoincrement,word,detail)";
public DBOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_SQL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i("詞典","--版本更新"+oldVersion+"-->"+newVersion);
}
}
三、關鍵源代碼
3.1.1進入界面布局代碼
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg"
tools:context=".LoadingActivity">
<Button
android:id="@+id/Loading"
android:layout_width="150dp"
android:layout_height="79dp"
android:layout_marginBottom="92dp"
android:background="@drawable/shape"
android:text="進入"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:textSize="40dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
3.1.2進入界面activity代碼
package com.example;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class LoadingActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loading);
Button button=findViewById(R.id.Loading);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(LoadingActivity.this, "正在進入", Toast.LENGTH_SHORT).show();
Intent intent=new Intent(LoadingActivity.this, MainActivity.class);
startActivity(intent);
}
});
}
}
3.2.1主界面布局代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/main"
tools:context=".MainActivity"
android:orientation="vertical">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:gravity="center"
android:text="電子詞典"
android:textStyle="bold"
android:textColor="#87CEFA"
android:textSize="50dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/search_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:hint="單詞"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/search_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:background="#80000000"
android:textColor="#FFFFFF"
android:text="查詢"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/btn_add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:background="#80000000"
android:textColor="#FFFFFF"
android:text="添加" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/btn_delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:background="#80000000"
android:textColor="#FFFFFF"
android:text="刪除" />
</LinearLayout>
</LinearLayout>
<ListView
android:id="@+id/result_listView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
3.2.2主界面activity代碼
package com.example;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private DBOpenHelper dbOpenHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbOpenHelper = new DBOpenHelper(MainActivity.this, "db_dict", null, 1);
final ListView listView = findViewById(R.id.result_listView);
final EditText etsearch = findViewById(R.id.search_et);
Button btn_search = findViewById(R.id.search_btn);
Button btn_add = findViewById(R.id.btn_add);
Button btn_delete = findViewById(R.id.btn_delete);
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AddActivity.class);
startActivity(intent);
}
});
btn_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, DeleteActivity.class);
startActivity(intent);
}
});
btn_search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String key = etsearch.getText().toString();
Cursor cursor = dbOpenHelper.getReadableDatabase().query("tb_dict", null, "word=?", new String[]{key}, null, null, null);
ArrayList<Map<String, String>> resultlist = new ArrayList<Map<String, String>>();
while (cursor.moveToNext()) {
Map<String, String> map = new HashMap<String, String>();
map.put("word", cursor.getString(1));
map.put("interpret", cursor.getString(2));
resultlist.add(map);
}
if (resultlist == null || resultlist.size() == 0) {
Toast.makeText(MainActivity.this, "很遺憾,沒有記錄", Toast.LENGTH_LONG).show();
} else {
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultlist,
R.layout.result_main,
new String[]{"word", "interpret"}, new int[]{
R.id.result_word, R.id.result_interpret});
listView.setAdapter(simpleAdapter);
}
}
});
}
protected void onDestroy(){
super.onDestroy();
if (dbOpenHelper != null) {
dbOpenHelper.close();
}
}}
3.3.1添加界面布局代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/add"
android:orientation="vertical"
tools:context="com.example.AddActivity">
<EditText
android:id="@+id/add_word"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:hint="單詞" />
<EditText
android:id="@+id/add_interpret"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:hint="翻譯" />
<Button
android:id="@+id/save_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:background="#80000000"
android:textColor="#FFFFFF"
android:text="保存" />
<Button
android:id="@+id/cancel_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:background="#80000000"
android:textColor="#FFFFFF"
android:text="取消" />
</LinearLayout>
3.3.2添加界面activity代碼
package com.example;
import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class AddActivity extends AppCompatActivity {
private DBOpenHelper dbOpenHelper;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
dbOpenHelper=new DBOpenHelper(AddActivity.this,"db_dict",null,1);
final EditText etword=findViewById(R.id.add_word);
final EditText etinterpret=findViewById(R.id.add_interpret);
Button btn_save=findViewById(R.id.save_btn);
Button btn_cancel=findViewById(R.id.cancel_btn);
btn_save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String word=etword.getText().toString();
String interpret=etinterpret.getText().toString();
if(word.equals("")||interpret.equals("")){
Toast.makeText(AddActivity.this,"填寫的單詞或解釋為空",Toast.LENGTH_SHORT).show();
}else{
insertData(dbOpenHelper.getReadableDatabase(),word,interpret);
Toast.makeText(AddActivity.this,"添加生詞成功",Toast.LENGTH_SHORT).show();
}
}
});
btn_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(AddActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
private void insertData(SQLiteDatabase sqLiteDatabase,String word,String interpret){
ContentValues values=new ContentValues();
values.put("word",word);
values.put("detail",interpret);
sqLiteDatabase.insert("tb_dict",null,values);
}
protected void onDestroy(){
super.onDestroy();
if(dbOpenHelper!=null){
dbOpenHelper.close();
}}
}
3.4.1刪除界面布局代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/delete"
android:orientation="vertical"
tools:context="com.example.AddActivity">
<EditText
android:id="@+id/delete_word"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:hint="單詞" />
<EditText
android:id="@+id/delete_interpret"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:hint="翻譯" />
<Button
android:id="@+id/delete_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:background="#80000000"
android:textColor="#FFFFFF"
android:text="刪除" />
<Button
android:id="@+id/cancel_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:background="#80000000"
android:textColor="#FFFFFF"
android:text="取消" />
</LinearLayout>
3.4.2刪除界面activity代碼
package com.example;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AppCompatActivity;
public class DeleteActivity extends AppCompatActivity {
private DBOpenHelper dbOpenHelper;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_delete);
dbOpenHelper=new DBOpenHelper(DeleteActivity.this,"db_dict",null,1);
final EditText scword=findViewById(R.id.delete_word);
final EditText scinterpret=findViewById(R.id.delete_interpret);
Button btn_delete=findViewById(R.id.delete_btn);
Button btn_cancel=findViewById(R.id.cancel_btn);
btn_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String word=scword.getText().toString();
String interpret=scinterpret.getText().toString();
if(word.equals("")||interpret.equals("")){
Toast.makeText(DeleteActivity.this,"填寫的單詞或解釋為空",Toast.LENGTH_SHORT).show();
}else{
deleteData(dbOpenHelper.getReadableDatabase(),word,interpret);
Toast.makeText(DeleteActivity.this,"刪除成功",Toast.LENGTH_SHORT).show();
}
}
});
btn_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(DeleteActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
private void deleteData(SQLiteDatabase sqLiteDatabase,String word,String interpret){
sqLiteDatabase.delete("tb_dict","word=?",new String[]{word+""});
}
protected void onDestroy(){
super.onDestroy();
if(dbOpenHelper!=null){
dbOpenHelper.close();
}}
}
3.5.1listview顯示代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="單詞:"
android:textColor=" #000000"
android:textSize="50dp"/>
<TextView
android:id="@+id/result_word"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor=" #000000"
android:textSize="50dp"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor=" #000000"
android:text="翻譯:"
android:textSize="50dp"/>
<TextView
android:id="@+id/result_interpret"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor=" #000000"
android:textSize="50dp"/>
</LinearLayout>
</LinearLayout>
四、實際測試
4.1添加測試
4.2查詢測試
4.3刪除測試
五、項目總結
本文闡述了電子行業的現狀、發展歷史以及未來的廣闊的市場前景、表明了電子詞典在詞典行業中的重要性、詳細講解了手機電子詞典APP的整個開發到實現的過程,以及具體的功能分析、需求分析、工作原理等等。其實我在數據庫的創建實現過程中一開始也是遇到了一些困難,不知道該從哪里下手才好。后來找來相關資料仔細鑽研學習,最終做出了這個電子詞典軟件。