《移動應用程式設計基礎》期末報告
課題名稱:
《移動應用開發基礎》上機考核
所使用的工具軟體及環境:
JDK,Android Studio
一、課題背景
期末上機考核,將實驗四中的內容和實驗五的內容以及上課所完成的小實驗相互結合,完成最后的考核,
二、任務內容
考核內容:上機單獨完成一個簡單日記本程式的撰寫,界面包括:用戶登錄,用戶注冊,日記本主頁,新增編輯日記,
注意:以下***為您姓名的拼音單詞第一個字母(如俞成海——ych),
1.用戶登錄
布局:activity_login.xml, 布局如下圖,資源圖片username.png和password.png,布局要求左邊內嵌圖片,提示如圖,(10分)

圖1 登錄界面布局
實作功能:LoginActivity.java
- 輸入欄位包括用戶名(username),密碼(password)和確定(ok)按鈕,點擊確定(ok)按鈕(10分)
- 如果用戶名(username)和密碼(password)在SharedPreferences中存在的話,則跳轉DiaryActivity;
- 點擊注冊,跳轉用戶注冊界面RegisterActivity
- 如果用戶名(username)和密碼(password)在SharedPreferences中不存在或不一致,則跳轉用戶注冊界面RegisterActivity,同時Toast提示“username,請先注冊您的資訊,***程式友情提示!“如下圖,

注意:
- 注冊時,寫入SharePreferences,檔案名user,保存值username和password;
- 登錄時,讀出SharePreferences(檔案名為user)中的username和password
2.用戶注冊
界面布局:activity_register.xml, 布局如下圖,資源圖片username.png和password.png,布局要求左邊內嵌圖片,提示如下中間圖,(10分)

功能實作:RegisterActivity.java,點擊注冊(register),將用戶名(username)和密碼(password)插入到寫入SharePreferences中(檔案名user,保存值username和password),回傳到登錄界面,Toast彈出“注冊成功,請登陸,***程式友情提示!”,如上圖,(10分)
3.日記主頁
界面布局:activity_diary.xml, 布局如下圖,包括AppBarLayout,Listview和FloatingActionButton,(10分)

功能實作:DiaryActivity.java,
- 獲取資料庫***_DiaryDB.db中的表diary的資訊,并將日記資料顯示在listview中,(10分)
- 點擊串列項中的編輯圖片按鈕,界面跳轉到日記新增編輯界面(DiaryInfoActivity),(5分)
- 點擊AppBar上的編輯(edit_tv)串列項中的編輯圖片按鈕(bianji.png)替換成洗掉圖片(delete.png),編輯改成取消,如下圖,點擊洗掉圖片按鈕,洗掉串列中的這一項,同時洗掉資料庫中的該條資料,點擊取消,取消改回為編輯,串列項中的洗掉圖片(delete.png)替換成編輯圖片按鈕(bianji.png),(10分)
三、界面設計與實作(描述設計思想和理念的加分)
登錄界面采用簡單而常用的linerLayout布局,注冊界面同樣也是


日記本主界面采用CoordinatorLayout布局、listview采用RelativeLayout布局


編輯日記界面與采用CoordinatorLayout布局

四、功能流程與實作(使用設計思想、設計模式、UML圖和流程圖加分)
流程圖:

核心的java代碼檔案,以及根據實驗5之后多出來的登錄界面的布局檔案,如下圖為所有的檔案詳情,
代碼檔案:(代碼檔案有資源包,下載鏈接在文章最后)
//AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.sqlitedemo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".Login"
android:label="每日記"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Register"/>
<activity android:name=".MainActivity"/>
<activity android:name=".DiaryInfoActivity"/>
</application>
</manifest>
//Login.java
package com.example.sqlitedemo;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
public class Login extends AppCompatActivity {
static int p=0;
static public EditText usenameEdtxt,passwordEdtxt;
public Button registerButton,submitbutton;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
usenameEdtxt=(EditText)findViewById(R.id.usename_edtxt);
passwordEdtxt=(EditText)findViewById(R.id.password_edtxt);
submitbutton=(Button)findViewById(R.id.submit_button);
registerButton=(Button)findViewById(R.id.register_button);
//登錄按鈕監控
submitbutton.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.GINGERBREAD)
@Override
public void onClick(View v) {
String usename=usenameEdtxt.getText().toString();
String password=passwordEdtxt.getText().toString();
if(usename.isEmpty()){
usenameEdtxt.setError("用戶名不能為空");
usenameEdtxt.requestFocus();
return;
}
if(password.isEmpty()){
passwordEdtxt.setError("密碼不能為空");
passwordEdtxt.requestFocus();
return;
}
if(p==0){
Toast.makeText(com.example.sqlitedemo.Login.this, usename+"請先注冊您的資訊,邵永剛程式友情提示!", Toast.LENGTH_SHORT).show();
Intent it=new Intent();
Context packageContext;
it.setClass(com.example.sqlitedemo.Login.this, Register.class);
com.example.sqlitedemo.Login.this.startActivity(it);
return;
}
if(usename.length()>0&&password.length()>0&&usename.equals(Register.usenameEdtxt1.getText().toString())&&p==1&&password.equals(Register.passwordEdtxt1.getText().toString())){
Toast.makeText(com.example.sqlitedemo.Login.this, "登錄成功", Toast.LENGTH_SHORT).show();
Intent it=new Intent();
Context packageContext;
it.setClass(com.example.sqlitedemo.Login.this, MainActivity.class);
com.example.sqlitedemo.Login.this.startActivity(it);
}
else {
Toast.makeText(com.example.sqlitedemo.Login.this, usename+"請先注冊您的資訊,邵永剛程式友情提示!", Toast.LENGTH_SHORT).show();
Intent it=new Intent();
Context packageContext;
it.setClass(com.example.sqlitedemo.Login.this, Register.class);
com.example.sqlitedemo.Login.this.startActivity(it);
}
}
});
registerButton.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.GINGERBREAD)
@Override
public void onClick(View v) {
Toast.makeText(com.example.sqlitedemo.Login.this, "進行注冊", Toast.LENGTH_SHORT).show();
Intent it=new Intent();
Context packageContext;
it.setClass(com.example.sqlitedemo.Login.this, Register.class);
com.example.sqlitedemo.Login.this.startActivity(it);
}
});
}
}
//Register.java
package com.example.sqlitedemo;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
public class Register extends AppCompatActivity {
static public EditText usenameEdtxt1,passwordEdtxt1;
public Button registerButton;
protected void onCreate(Bundle savedInstanceState) {
Login.p=1;
super.onCreate(savedInstanceState);
setContentView(R.layout.register);
usenameEdtxt1=(EditText)findViewById(R.id.usename_edtxt);
passwordEdtxt1=(EditText)findViewById(R.id.password_edtxt);
registerButton=(Button)findViewById(R.id.register_button);
registerButton.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.GINGERBREAD)
@Override
public void onClick(View v) {
String usename=usenameEdtxt1.getText().toString();
String password=passwordEdtxt1.getText().toString();
if(usename.isEmpty()){
usenameEdtxt1.setError("用戶名不能為空");
usenameEdtxt1.requestFocus();
return;
}
if(password.isEmpty()){
passwordEdtxt1.setError("密碼不能為空");
passwordEdtxt1.requestFocus();
return;
}
if(usename.length()>0&&password.length()>0){
Toast.makeText(com.example.sqlitedemo.Register.this, "注冊成功,請登陸,邵永剛程式友情提示!", Toast.LENGTH_SHORT).show();
Intent it=new Intent();
Context packageContext;
it.setClass(com.example.sqlitedemo.Register.this, com.example.sqlitedemo.Login.class);
com.example.sqlitedemo.Register.this.startActivity(it);
}
}
});
}
}
//MainActivity.java
package com.example.sqlitedemo;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.os.Bundle;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static android.os.Build.VERSION.SDK_INT;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private TextView editTv;
private ListView diaryList;
private FloatingActionButton fab;
private List<Map<String, String>> listData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
listData = new ArrayList<>();
fab = (FloatingActionButton) findViewById(R.id.fab);
editTv = (TextView) findViewById(R.id.edit_tv);
diaryList = (ListView) findViewById(R.id.list_view);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e(TAG, "onClick: " );
Intent intent = new Intent(MainActivity.this, DiaryInfoActivity.class);
intent.putExtra("FLAG", 0);
startActivity(intent);
}
});
editTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e(TAG, "on" );
int length = queryData().size();
if (editTv.getText().toString().equals("取消")){
editTv.setText("編輯");
for (int i = 0;i<length;i++){
diaryList.getChildAt(i).findViewById(R.id.edit_ib).setVisibility(View.VISIBLE);
diaryList.getChildAt(i).findViewById(R.id.delete_ib).setVisibility( View.INVISIBLE);
}
}
else {
editTv.setText("取消");
for (int i = 0;i<length;i++){
diaryList.getChildAt(i).findViewById(R.id.edit_ib).setVisibility(View.INVISIBLE);
diaryList.getChildAt(i).findViewById(R.id.delete_ib).setVisibility( View.VISIBLE);
}
}
}
});
diaryList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MainActivity.this,DiaryInfoActivity.class);
intent.putExtra("FLAG",1);
intent.putExtra(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE,listData.get(position).get(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE));
intent.putExtra(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT,listData.get(position).get(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT ));
startActivity(intent);
}
});
diaryList.setAdapter(new DiaryListAdapter(MainActivity.this,queryData()));
}
@Override
protected void onResume() {
super.onResume();
//重新查詢適配
diaryList.setAdapter(new DiaryListAdapter(MainActivity.this,queryData()));
}
/**
* 從Sqlite中查詢所有資料
*
* @return 資料串列
*/
public List<Map<String,String>> queryData(){
listData = new ArrayList<>();
DiaryDbHelper dbHelper = new DiaryDbHelper(this);
SQLiteDatabase db = dbHelper.getReadableDatabase();
String[] projection = {
SQLiteContract.DiaryEntry._ID,SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE,
SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT,SQLiteContract.DiaryEntry.COLUMN_NAME_TIME };
String sortOrder = SQLiteContract.DiaryEntry.COLUMN_NAME_TIME+" DESC";
Cursor c = db.query(SQLiteContract.DiaryEntry.TABLE_NAME,projection,null,null, null,null,sortOrder);
while (c.moveToNext()){
Map<String,String> map = new HashMap<>();
map.put(SQLiteContract.DiaryEntry._ID,c.getString(c.getColumnIndex( SQLiteContract.DiaryEntry._ID)));
map.put(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE,c.getString(c.getColumnIndex(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE)));
map.put(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT,c.getString(c .getColumnIndex(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT)));
map.put(SQLiteContract.DiaryEntry.COLUMN_NAME_TIME,c.getString(c.getColumnIndex(SQLiteContract.DiaryEntry.COLUMN_NAME_TIME)));
listData.add(map);
}
c.close();
db.close();
return listData;
}
}
//DiaryInfoActivity.java
package com.example.sqlitedemo;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.Toolbar;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import static android.os.Build.VERSION.SDK_INT;
public class DiaryInfoActivity extends AppCompatActivity {
private TextView titleTv,contentTv;
private EditText titleEt,contentEt;
private ImageButton submitIb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_diary_info);
Log.e("TAG","onResume()");
androidx.appcompat.widget.Toolbar toolbar = (androidx.appcompat.widget.Toolbar) findViewById(R.id.toolbar_info);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
//添加回傳按鈕
actionBar.setDisplayHomeAsUpEnabled(true);
//隱藏標題
actionBar.setDisplayShowTitleEnabled(false);
titleTv = (TextView)findViewById(R.id.info_title_tv);
contentTv = (TextView)findViewById(R.id.info_content_tv);
titleEt = (EditText)findViewById(R.id.info_title_et);
contentEt = (EditText)findViewById(R.id.info_content_et);
submitIb = (ImageButton)findViewById(R.id.submit_ib);
//獲取傳遞的引數
int flag = getIntent().getIntExtra("FLAG",-1);
final String id = getIntent().getStringExtra(SQLiteContract.DiaryEntry._ID);
final String title = getIntent().getStringExtra(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE);
String content = getIntent().getStringExtra(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT);
//新建日記
if(flag==0){
submitIb.setVisibility(View.VISIBLE);
titleTv.setVisibility(View.INVISIBLE);
contentTv.setVisibility(View.INVISIBLE);
titleEt.setVisibility(View.VISIBLE);
contentEt.setVisibility(View.VISIBLE);
submitIb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(titleEt==null
|| titleEt.getText().toString().trim().equals("")){
Toast.makeText(DiaryInfoActivity.this, "請輸入標題",
Toast.LENGTH_LONG).show();
return;
}
if(contentEt==null
|| contentEt.getText().toString().trim().equals("")){
Toast.makeText(DiaryInfoActivity.this, "請輸入內容",
Toast.LENGTH_LONG).show();
return;
}
//向Sqlite中插入一條資訊
DiaryDbHelper dbHelper = new DiaryDbHelper(DiaryInfoActivity.this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
//格式化時間
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String date = sd.format(new Date());
//設定插入值
ContentValues values = new ContentValues();
values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE,
titleEt.getText().toString());
values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT,
contentEt.getText().toString());
values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_TIME, date);
//執行插入方法
long newRowId = db.insert(SQLiteContract.DiaryEntry.TABLE_NAME, null, values);
DiaryInfoActivity.this.finish();
}
});
}
//查看日記
else if(flag==1){
submitIb.setVisibility(View.INVISIBLE);
titleTv.setVisibility(View.VISIBLE);
contentTv.setVisibility(View.VISIBLE);
titleEt.setVisibility(View.INVISIBLE);
contentEt.setVisibility(View.INVISIBLE);
titleTv.setText(title);
contentTv.setText(content);
}
//修改日記
else if(flag==2){
submitIb.setVisibility(View.VISIBLE);
titleTv.setVisibility(View.INVISIBLE);
contentTv.setVisibility(View.INVISIBLE);
titleEt.setVisibility(View.VISIBLE);
contentEt.setVisibility(View.VISIBLE);
titleEt.setText(title);
contentEt.setText(content);
submitIb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(titleEt==null || titleEt.getText().toString().trim().equals("")){
Toast.makeText(DiaryInfoActivity.this, "請輸入標題",
Toast.LENGTH_LONG).show();
return;
}
if(contentEt==null || contentEt.getText().toString().trim().equals("")){
Toast.makeText(DiaryInfoActivity.this, "請輸入內容",
Toast.LENGTH_LONG).show();
return;
}
//從Sqlite中更新一條資訊
DiaryDbHelper dbHelper = new DiaryDbHelper(DiaryInfoActivity.this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
//格式化時間
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String date = sd.format(new Date());
ContentValues values = new ContentValues();
values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE,titleEt.getText().toString());
values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT,contentEt. getText().toString());
values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_TIME,date);
//執行更新方法
String selection = SQLiteContract.DiaryEntry._ID+"=?"; String[] selectionArgs = {id};
int count = db.update( SQLiteContract.DiaryEntry.TABLE_NAME, values, selection,selectionArgs );
DiaryInfoActivity.this.finish();
}
});
}
}
private void setSupportActionBar(Toolbar toolbar) {
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
//重寫 ToolBar 回傳按鈕的行為,關閉此 Activity
case android.R.id.home: finish(); return true; }return super.onOptionsItemSelected(item);
}
}
//DiaryListAdapter.java
package com.example.sqlitedemo;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.TextView;
import java.util.List;
import java.util.Map;
public class DiaryListAdapter extends BaseAdapter {
private static final String TAG="DiaryListAdapter";
private Context context;
private List<Map<String, String>> list;
public DiaryListAdapter(Context context, List<Map<String, String>> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.listview_item,null);
holder = new ViewHolder();
holder.titleTv = (TextView) convertView.findViewById(R.id.title_tv);
holder.timeTv = (TextView) convertView.findViewById(R.id.time_tv);
holder.editIb = (ImageButton) convertView.findViewById(R.id.edit_ib);
holder.deleteIb = (ImageButton) convertView.findViewById(R.id.delete_ib);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.titleTv.setText(list.get(position).get(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE));
holder.timeTv.setText(list.get(position).get(SQLiteContract.DiaryEntry.COLUMN_NAME_TIME));
holder.editIb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Intent intent = new Intent(context, DiaryInfoActivity.class);
Intent intent = new Intent(context,DiaryInfoActivity.class);
intent.putExtra("FLAG",2);
intent.putExtra(SQLiteContract.DiaryEntry._ID,list.get(position).get(SQLiteContract.DiaryEntry._ID));
intent.putExtra(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE,list.get(position).get(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE));
intent.putExtra(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT,list. get(position).get(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT));
context.startActivity(intent);
}
});
holder.deleteIb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog. Builder (context);
builder.setTitle("提示")
.setMessage("確認洗掉?")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DiaryDbHelper dbHelper = new DiaryDbHelper(context);
SQLiteDatabase db = dbHelper.getWritableDatabase();
String selection = SQLiteContract.DiaryEntry._ID+" = ?";
String[] selectionArgs = {
list.get(position).get(SQLiteContract.DiaryEntry._ID)
};
db.delete(SQLiteContract.DiaryEntry.TABLE_NAME,selection,selectionArgs);
db.close();
list.remove(position);
notifyDataSetChanged();
}
})
.setNegativeButton("取消", null);
builder.show();
}
});
return convertView;
}
static class ViewHolder {
TextView titleTv, timeTv;
ImageButton editIb, deleteIb;
}
}
//DiaryDbHelper.java
package com.example.sqlitedemo;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DiaryDbHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "DiaryDB.db";
private static final String TEXT_TYPE = " TEXT";
private static final String DATE_TYPE = " DATE";
private static final String COMMA_SEP = ",";
private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE " + SQLiteContract.DiaryEntry.TABLE_NAME+"("+ SQLiteContract.DiaryEntry._ID+ " " +
"INTEGER PRIMARY KEY AUTOINCREMENT,"+ SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE+ TEXT_TYPE+COMMA_SEP+
SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT+ TEXT_TYPE+COMMA_SEP+ SQLiteContract.DiaryEntry.COLUMN_NAME_TIME+
DATE_TYPE+")";
private static final String SQL_DELETE_ENTRIES =
"DROP TABLE IF EXISTS " + SQLiteContract.DiaryEntry.TABLE_NAME;
public DiaryDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_ENTRIES);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(SQL_DELETE_ENTRIES);
onCreate(db);
}
}
//SQLiteContract.java
package com.example.sqlitedemo;
import android.provider.BaseColumns;
public final class SQLiteContract {
//為了防止使用者不小心實體化類的構造方法,
//使建構式私有化
private SQLiteContract() {}
//此內部類定義表的內容
public static class DiaryEntry implements BaseColumns {
public static final String TABLE_NAME = "diary";
public static final String COLUMN_NAME_TITLE = "title";
public static final String COLUMN_NAME_CONTENT = "content";
public static final String COLUMN_NAME_TIME = "time";
}
}
//activity_login.xml
<?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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Space
android:layout_width="match_parent"
android:layout_height="197dp" />
<EditText
android:id="@+id/usename_edtxt"
android:layout_width="275dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:drawableLeft="@drawable/username"
android:drawablePadding="12dp"
android:gravity="center|left"
android:hint="請輸入用戶名"
android:textColorHint="@android:color/darker_gray"
android:textSize="24sp"
tools:ignore="MissingConstraints" />
<Space
android:layout_width="match_parent"
android:layout_height="46dp" />
<EditText
android:id="@+id/password_edtxt"
android:layout_width="272dp"
android:layout_height="55dp"
android:drawableLeft="@drawable/password"
android:drawablePadding="12dp"
android:gravity="center|left"
android:hint="請輸入密碼"
android:layout_gravity="center"
android:inputType="textPassword"
android:textColorHint="@android:color/darker_gray"
android:textSize="24sp"
tools:ignore="MissingConstraints" />
<Space
android:layout_width="match_parent"
android:layout_height="60dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Space
android:layout_width="47dp"
android:layout_height="50dp" />
<Button
android:id="@+id/submit_button"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:backgroundTint="@color/white"
android:text="確定"
tools:ignore="MissingConstraints" />
<Space
android:layout_width="150dp"
android:layout_height="53dp" />
<Button
android:id="@+id/register_button"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:backgroundTint="@color/white"
android:text="注冊"
tools:ignore="DuplicateIds,MissingConstraints" />
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
//register.xml
<?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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Space
android:layout_width="match_parent"
android:layout_height="197dp" />
<EditText
android:id="@+id/usename_edtxt"
android:layout_width="275dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:drawableLeft="@drawable/username"
android:drawablePadding="12dp"
android:gravity="center|left"
android:hint="請輸入用戶名"
android:textColorHint="@android:color/darker_gray"
android:textSize="24sp"
tools:ignore="MissingConstraints" />
<Space
android:layout_width="match_parent"
android:layout_height="46dp" />
<EditText
android:id="@+id/password_edtxt"
android:layout_width="272dp"
android:layout_height="55dp"
android:drawableLeft="@drawable/password"
android:drawablePadding="12dp"
android:gravity="center|left"
android:hint="請輸入密碼"
android:layout_gravity="center"
android:inputType="textPassword"
android:textColorHint="@android:color/darker_gray"
android:textSize="24sp"
tools:ignore="MissingConstraints" />
<Space
android:layout_width="match_parent"
android:layout_height="60dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Space
android:layout_width="150dp"
android:layout_height="53dp" />
<Button
android:id="@+id/register_button"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:backgroundTint="@color/white"
android:text="注冊"
tools:ignore="DuplicateIds,MissingConstraints" />
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
五、課題實作展示




進入登錄界面,輸入用戶名和密碼,此處不能為空,此時輸入的用戶名沒有進行注冊,所以會進入注冊界面顯示(請先注冊)或者直接點擊注冊按鈕進入注冊界面顯示(進行注冊),注冊輸入用戶名和密碼點擊注冊按鈕顯示(注冊成功),會回傳到登錄界面,輸入之前注冊的用戶名和密碼,會進入到日記本主界面,顯示(登錄成功),


點擊編輯,可以洗掉所寫的日記內容,點擊加號按鈕,可添加日記內容,點擊勾保存,


點擊日記標題右邊的編輯圖片按鈕,可進入修改界面,


點擊日記標題一行可以查看日記內容,點擊編輯可洗掉日記,點擊×會出現洗掉提示,
六、總結與體會
本次上機考核,通過高級控制元件進行設計登錄與注冊界面,同時運用SQLiteOpenHelper抽象類以及契約類SQLiteContract,創建SQLiteOpenHelper的子類并覆寫onCreate方法,本次考核內容基本完成,學習到資料庫的使用,使我更好掌握了安卓資料庫的應用,通過查找資料以及學習,完成最后先登錄在跳轉進入日記本的制作,通過本次實驗,識訓頗多,復習了以前的知識,也學習到了新的內容,對今后的學習有了很大的幫助,
下載資源包:
https://download.csdn.net/download/weixin_48388330/76315152
資源中的圖片以及內容只適用與學習
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/413942.html
標籤:其他
