移动技术开发:备忘录

发布于:2024-10-15 ⋅ 阅读:(4) ⋅ 点赞:(0)

1 实验名称

       备忘录

2 实验目的

       掌握SQLite数据库的基本操作,实现备忘录基本功能。

3 实验源代码

布局文件代码:

(1)activity_main.xml

<?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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TableRow>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:text="主题:"
                android:textSize="20sp" />
            <EditText
                android:id="@+id/et_subject"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>
        </TableRow>

        <TableRow>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:text="内容:"
                android:textSize="20sp" />

            <EditText
                android:id="@+id/et_content"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:minLines="4"/>
        </TableRow>

        <TableRow>

            <Button
                android:id="@+id/btn_chooseDate"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="选择时间"/>

            <EditText
                android:id="@+id/et_data"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:editable="false"/>
        </TableRow>
    </TableLayout>
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal">
        
        <Button
            android:id="@+id/btn_add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="添加"/>

        <Button
            android:id="@+id/btn_query"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="查询"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            style="@style/TextView"
            android:layout_width="40dp"
            android:text="序号"
            android:textColor="#000000"/>

        <TextView
            style="@style/TextView"
            android:layout_width="50dp"
            android:text="主题"
            android:textColor="#000000"/>

        <TextView
            style="@style/TextView"
            android:layout_width="110dp"
            android:text="内容"
            android:textColor="#000000"/>

        <TextView
            style="@style/TextView"
            android:layout_width="100dp"
            android:text="时间"
            android:textColor="#000000"/>
    </LinearLayout>

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

</LinearLayout>

(2)result.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="horizontal">
    <TextView
        android:id="@+id/tv_num"
        android:layout_width="40dp"
        style="@style/TextView"
        android:text="序号"/>
    <TextView
        android:id="@+id/tv_subject"
        android:layout_width="50dp"
        style="@style/TextView"
        android:text="主题"/>
    <TextView
        android:id="@+id/tv_content"
        android:layout_width="40dp"
        style="@style/TextView"
        android:text="内容"/>
    <TextView
        android:id="@+id/tv_date"
        android:layout_width="40dp"
        style="@style/TextView"
        android:text="时间"/>

</LinearLayout>

Java代码:

(1)MainActivity

package com.example.memorandumtest;

import android.app.DatePickerDialog;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import java.util.Calendar;

public class MainActivity extends AppCompatActivity {

    private EditText et_subject = null;
    private EditText et_content = null;
    private EditText et_date = null;

    private Button btn_Choosedate = null;
    private Button btn_add = null;
    private Button btn_query = null;

    private LinearLayout title = null;
    private ListView lv_result = null;

    //定义数据库工具类对象
    private MyDatabaseHelper myDatabaseHelper = null;
    //定义数据库对象
    private SQLiteDatabase sqLiteDatabase = null;

    private MyListener myListener = null;

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

        et_subject = findViewById(R.id.et_subject);
        et_content = findViewById(R.id.et_content);
        et_date = findViewById(R.id.et_data);

        btn_Choosedate = findViewById(R.id.btn_chooseDate);
        btn_add = findViewById(R.id.btn_add);
        btn_query = findViewById(R.id.btn_query);

        title = findViewById(R.id.title);
        lv_result = findViewById(R.id.lv_result);

        btn_Choosedate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建一个日历的对象
                Calendar calendar = Calendar.getInstance();
                new DatePickerDialog(
                        MainActivity.this,
                        new DatePickerDialog.OnDateSetListener() {//日期选择监听器
                            @Override
                            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                                et_date.setText(year+"-"+(month+1)+"-"+dayOfMonth);
                            }
                        },
                        calendar.get(Calendar.YEAR),//设置当前的年份
                        calendar.get(Calendar.MONTH),//设置当前的月份
                        calendar.get(Calendar.DAY_OF_MONTH)//设置当前的日期
                ).show();
            }
        });

        //为添加和查询按钮绑定监听器对象
        myListener =new MyListener();
        btn_add.setOnClickListener(myListener);
        btn_query.setOnClickListener(myListener);

    }

    private class MyListener implements View.OnClickListener{
        @Override
        public void onClick(View v) {

            //创建数据库工具类对象
            myDatabaseHelper = new MyDatabaseHelper(MainActivity.this,
                    "memento.db",
                    null, 1);
            //创建数据库对象
            sqLiteDatabase = myDatabaseHelper.getReadableDatabase();

            //把用户输入的数据取出来
            String subjectStr = et_subject.getText().toString().trim();
            String contentStr = et_content.getText().toString().trim();
            String dateStr = et_date.getText().toString().trim();


            if (v.getId() == R.id.btn_add) {
                //调用向数据库中添加记录的方法
                addMemento(sqLiteDatabase, subjectStr, contentStr, dateStr);
            } else if (v.getId() == R.id.btn_query) {

                //调用查询数据库中的记录的方法
                Cursor cursor = queryMemento(sqLiteDatabase, subjectStr, contentStr, dateStr);
                //将查询结果在列表中显示
                //创建一个简单游标适配器对象
                SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(
                        MainActivity.this,
                        R.layout.result,//列表中每一项的布局文件
                        cursor,
                        new String[]{"_id", "subject", "content", "date"},//数据表中的字段信息
                        new int[]{R.id.tv_num, R.id.tv_subject, R.id.tv_content, R.id.tv_date}
                );
                //让列表适用适配器对象
                lv_result.setAdapter(simpleCursorAdapter);

            }
        }
    }

    //向数据库添加记录的方法
    private void addMemento(SQLiteDatabase database,String subject,String content,String date){
        database.execSQL("insert into memento_tb values(null,?,?,?)",
                new String[]{subject,content,date});

        //清空数据方便用户下一次输入
        et_subject.setText("");
        et_content.setText("");
        et_date.setText("");
    }

    //查询数据库记录的方法
    private Cursor queryMemento(SQLiteDatabase sqLiteDatabase,String subject,String content,String date){
        Cursor cursor = sqLiteDatabase.rawQuery("select * from memento_tb where subject like ? and content like ? and date like ?",
                new String[]{"%"+subject+"%","%"+content+"%","%"+date+"%"});
        return cursor;
    }
}

(2)MyDatabaseHelper

package com.example.memorandumtest;

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

import androidx.annotation.Nullable;

public class MyDatabaseHelper extends SQLiteOpenHelper {

    //建表语句
    final String CREATE_TABLE_SQL = "create table memento_tb (_id integer primary key autoincrement,subject,content,date)";
    public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //执行建表语句,创建memento表
        db.execSQL(CREATE_TABLE_SQL);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        System.out.println("------"+oldVersion+"-------->"+newVersion);
    }
}

4 实验运行结果图

5 实验总结

       首先还是敲定布局文件,一共两个布局文件,第一个是备忘录的整体布局文件,第二个是显示查询结果的布局文件。

       接着完成Java代码。在写Java代码的过程中,在选择时间按钮的实现时,先创建一个日历对象,创建日期选择监听器,然后设置当前的年月日,其中月份是从0开始的,所以写代码的时候要加1;关于数据的存储与查找,先创建数据库类工具对象和数据库对象,然后通过调用数据库中添加记录和查询记录的方法来实现;对于查询结果在列表中的显示,创建一个简单游标适配器对象,让列表适用适配器对象。

       这个实验还存在一个问题,那就是备忘录的输入只能用英文,而无法采用中文输入,这个问题尚未解决。