Android學習筆記(十三)——數據存儲(LitePal操作數據庫)

【第一部分】歷史文章:
Android學習筆記(一)——創建第一個Android項目
Android學習筆記(二)android studio基本控件及佈局(實現圖片查看器)
Android學習筆記(三)android studio中CheckBox自定義樣式(更換複選框左側的勾選圖像)
Android學習筆記(四)Android 中Activity頁面的跳轉及傳值
Android學習筆記(五)——Toast提示、Dialog對話框、Menu菜單
Android學習筆記(六)——自定義ListView佈局+AsyncTask異步任務
Android學習筆記(七)——數據存儲(共享參數SharedPreferences)
Android學習筆記(八)——數據存儲(SD卡文件操作)
Android學習筆記(九)——網絡技術
Android學習筆記(十)——實現新聞列表案例
Android學習筆記(十一)——一些高級控件的使用
Android學習筆記(十二)——數據存儲(SQLite數據庫)
【第二部分】主要問題解決:
Android Studio(存)讀取不了SD卡上的文件——【已解決】


LitePal是一款開源的Android數據庫框架,它採用了對象關係映射(ORM)的模式,並且將我們平時開發的最常用的一些數據庫操作功能進行了封裝,使得不用編寫一行SQL語句就可以完成各種表和CRUD的基本操作。
LitePal使用Github地址:https://github.com/LitePalFramework/LitePal

下面介紹LitePal的使用:
1、配置LitePal。
在項目的app/build.gradle文件中,在dependencies閉包中添加如下依賴:

 compile 'org.litepal.android:core:1.4.1'

如下:
在這裏插入圖片描述
注:1.4.1是版本號,最新的版本可以在Litepal的項目主頁上去查看。
2、配置litepal文件。
在工程裏的assets文件夾裏新建一個litepal.xml文件。
在這裏插入圖片描述
編輯litepal.xml文件中的內容,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="litepal" />
    <version value="1" />
    <list>
        <mapping class="cn.edu.hznu.litepal.bean.Messgae"></mapping>
    </list>
</litepal>
  • <dbname>標籤指定數據庫。
  • <version>標籤用於指定數據庫的版本號。
  • <list>標籤用於指定所有的映射模型。
  • <mapping>標籤聲明我們要配置的模型類,要使用完整的類名。

注意:我們經過配置以上的內容後,最後還要在AndroidManifest.xml中進行配置LitePalApplication。這樣才能讓LiteOal的所有的功能都可以正常的工作。
配置內容:

  android:name="org.litepal.LitePalApplication"

在這裏插入圖片描述
3、創建和升級數據庫。
經過上面的二步,我相信配置已經沒有問題了,下面我們就開始正式的使用它了。
我們之前創建數據庫時通過自定義一個類來繼承字SQLiteOpenHelper,然後在onCreate()方法中編寫建表語句來實現的,而使用LitePal就不用這麼的麻煩了。

  • LitePal採用的是對象關係映射(ORM)的模式。用面向對象的思維去操作數據庫,而不用再和SQL語句打交道了。
  • 把Java bean中的屬性 與數據庫表中的字段一一對應。

創建數據庫關鍵語句:

LitePal.getDatabase();

升級數據庫:
只需要將litepal.xml中的配置文件中的版本號加上1即可,然後,更改你想要改的內容。比如:想要添加一張Student表。就可以在litepal.xml文件中增加如下的內容以及編寫相應的Student類

<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="litepal" />
<version value="2" />
<list>
    <mapping class="cn.edu.hznu.litepal.bean.Messgae"></mapping>
    <mapping class="cn.edu.hznu.litepal.bean.Student"></mapping>
</list>
</litepal>

在這裏插入圖片描述
注意:我們要進行CRUD操作的時候,必須讓模型類繼承DataSupport類
在這裏插入圖片描述

4、添加數據。
創建一個數據模型類的對象,並調用set方法對數據進行設置,再調用save()方法即完成添加數據。

示例代碼:

 Book book = new Book();
                book.setName("The Da Vinci Code");
                book.setAuthor("Dan Brown");
                book.setPages(454);
                book.setPrice(16.96);
                book.setPress("Unknow");
                book.save();

5、修改數據。
創建一個數據模型類的對象,並調用set方法對數據進行設置,再調用updateAll()方法即完成更新數據。注意在updateAll()方法中,可以指定一個約束條件,和sql語句中的where子句相似。用法與刪除數據相似。
示例代碼:

 Book book = new Book();
                book.setPrice(14.95);
                book.setPress("Anchor");
                book.updateAll("name = ? and author = ?", "The Lost Symbol", "Dan Brown");

上述表示:將所有書名是The Lost Symbol並且作者是Dan Brown的書價格修改爲14.95,出版社修改爲Anchor。
6、刪除數據。

  • 調用public static int deleteAll(Class<?> modelClass, String… conditions)方法。
    該方法第一個參數指定刪除哪張表中的數據,第二個參數指定約束條件。
  • 調用public static int delete(Class<?> modelClass, long id)方法。
    該方法第一個參數指定刪除哪張表中的數據,第二個參數是一個指定的id,表示我們要刪除哪一行的數據。
    示例代碼:
 DataSupport.deleteAll(Book.class, "price < ?", "15");

7、查找數據。

  • 查找全部:DataSupport.findAll(表名),參數爲查找的數據表(數據模型類)。
  • 按條件查找:DataSupport.where(條件).find(表名)。

注:

  • 以上查詢返回的是List類型的對象。
  • 使用原生SQl語句查詢:DataSupport.findBySQL(原生SQL語句)。返回的是Cursor對象。
    示例代碼:
 List<Book> books = DataSupport.findAll(Book.class);
                for (Book book: books) {
                
                }

下面是一個具體的小案例來運用LitePal操作的數據庫的具體知識點:

關鍵詞:LitePal操作數據庫、自定義適配器、菜單、三級聯動城市選擇器、跑馬燈效果、頁面之間的跳轉傳值等。

具體的效果如下:
在這裏插入圖片描述
在這裏插入圖片描述
具體實現代碼:
工程結構:
在這裏插入圖片描述
下面是項目的準備工作:

  • app/build.gradle中添加依賴。
     compile 'org.litepal.android:core:1.4.1'
     compile 'liji.library.dev:citypickerview:1.1.0'

注:第二個依賴是實現三級城市的聯動選擇。

  • AndroidManifest.xml中添加:
 android:name="org.litepal.LitePalApplication"

一、編寫填寫信息的佈局文件。

activity_main.xml

<?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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="cn.edu.hznu.litepal.MainActivity">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="請正確填寫如下信息,請正確填寫如下信息!"
        android:textSize="32sp"
        android:textColor="#ff0000"
        android:ellipsize="marquee"
        android:marqueeRepeatLimit="marquee_forever"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:singleLine="true"
        />
    />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="text"
        android:ems="10"
        android:hint="請輸入你的姓名"
        android:textSize="22sp"
        android:id="@+id/edit_name" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:ems="10"
        android:hint="請輸入你今天的體溫"
        android:textSize="22sp"
        android:id="@+id/edit_temp" />
    <TextView
        android:text="*你目前所在的城市"
        android:textSize="22sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

    <TextView
        android:text="選擇城市                        >>>"
        android:textColor="#b56464"
        android:textSize="22sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/text_city" />

    <TextView
        android:text="*你的健康碼"
        android:textSize="22sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView2" />

    <RadioGroup
        android:id="@+id/radioGroup1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <RadioButton
            android:text="綠碼"
            android:textSize="28sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/radioButton1"
            android:layout_weight="1" />

        <RadioButton
            android:text="黃碼"
            android:textSize="28sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/radioButton2"
            android:layout_weight="1" />

        <RadioButton
            android:text="紅碼"
            android:textSize="28sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/radioButton3"
            android:layout_weight="1" />
    </RadioGroup>

    <Button
        android:text="提交"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="28sp"
        android:id="@+id/button"
        android:onClick="login"
        />

</LinearLayout>

二、編寫展示數據的頁面。

activity_main2.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="cn.edu.hznu.litepal.Main2Activity">
<ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</ListView>
</RelativeLayout>

三、編寫列表項佈局文件。

item_layout.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"
    android:padding="10dp">
    <!--<TextView-->
        <!--android:id="@+id/text_content"-->
        <!--android:layout_width="0dp"-->
        <!--android:layout_height="wrap_content"-->
        <!--android:layout_weight="1"-->
        <!--android:text="具體內容"-->
        <!--android:textColor="#000000"-->
        <!--android:textSize="20sp"-->
        <!--/>-->
    <TextView
        android:id="@+id/text_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="具體內容"
        android:textColor="#000000"
        android:textSize="20sp"
        />
    <TextView
        android:id="@+id/text_temp"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="具體內容"
        android:textColor="#000000"
        android:textSize="20sp"
        />
    <TextView
        android:id="@+id/text_city"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="具體內容"
        android:textColor="#000000"
        android:textSize="20sp"
        />
    <TextView
        android:id="@+id/text_code"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="具體內容"
        android:textColor="#000000"
        android:textSize="20sp"
        />
    <TextView
        android:id="@+id/text_time"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="具體內容"
        android:textColor="#000000"
        android:textSize="20sp"
        />
    <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

        <ImageView
            android:id="@+id/img_look"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/ic_menu_view"
            />
    </LinearLayout>
       <ImageView
            android:id="@+id/img_edit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/ic_menu_agenda"
        />
      <ImageView
            android:id="@+id/img_del"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/ic_menu_delete"
        />
</LinearLayout>

四、編寫修改信息的頁面。

activity_main_edit.xml

<?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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="cn.edu.hznu.litepal.MainEditActivity">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="請正確填寫如下信息,請正確填寫如下信息!"
        android:textSize="32sp"
        android:textColor="#ff0000"
        android:ellipsize="marquee"
        android:marqueeRepeatLimit="marquee_forever"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:singleLine="true"
        />
    />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="text"
        android:ems="10"
        android:hint="請輸入你的姓名"
        android:textSize="22sp"
        android:id="@+id/edit_name" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:ems="10"
        android:hint="請輸入你今天的體溫"
        android:textSize="22sp"
        android:id="@+id/edit_temp" />
    <TextView
        android:text="*你目前所在的城市"
        android:textSize="22sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

    <TextView
        android:text="選擇城市                        >>>"
        android:textColor="#b56464"
        android:textSize="22sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/text_city" />

    <TextView
        android:text="*你的健康碼"
        android:textSize="22sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView2" />

    <RadioGroup
        android:id="@+id/radioGroup1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <RadioButton
            android:text="綠碼"
            android:textSize="28sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/radioButton1"
            android:layout_weight="1" />

        <RadioButton
            android:text="黃碼"
            android:textSize="28sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/radioButton2"
            android:layout_weight="1" />

        <RadioButton
            android:text="紅碼"
            android:textSize="28sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/radioButton3"
            android:layout_weight="1" />
    </RadioGroup>

    <Button
        android:text="確定修改"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="28sp"
        android:id="@+id/button"
        android:onClick="login"
        />

</LinearLayout>

五、編寫顯示詳情頁面。

activity_main_show.xml

<?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:id="@+id/activity_main_show"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="cn.edu.hznu.litepal.MainShowActivity">
    <TextView
       android:id="@+id/text_name"
       android:text="姓名"
       android:textSize="28sp"
       android:textColor="#FF0000"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/text_temp"
        android:text="體溫"
        android:textSize="28sp"
        android:textColor="#FF0000"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/text_city"
        android:text="所在城市"
        android:textSize="28sp"
        android:textColor="#FF0000"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/text_code"
        android:text="健康碼"
        android:textSize="28sp"
        android:textColor="#FF0000"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/text_time"
        android:text="填寫時間"
        android:textSize="28sp"
        android:textColor="#FF0000"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

六、編寫菜單佈局文件。
在項目的res文件夾下創建menu/menu_mainxml文件。

menu_mainxml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
   >
    <item
        android:id="@+id/all"
        android:orderInCategory="100"
        android:title="查看全部"
        app:showAsAction="never" />

</menu>

七、自定義數據適配器。

MessageAdapter .java

package cn.edu.hznu.litepal.adapter;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import org.litepal.crud.DataSupport;
import java.util.ArrayList;
import java.util.List;
import cn.edu.hznu.litepal.Main2Activity;
import cn.edu.hznu.litepal.MainActivity;
import cn.edu.hznu.litepal.MainEditActivity;
import cn.edu.hznu.litepal.MainShowActivity;
import cn.edu.hznu.litepal.R;
import cn.edu.hznu.litepal.bean.Messgae;
public class MessageAdapter  extends ArrayAdapter<Messgae>{
    private int item_layout_id;
    private Context con;
    List<Messgae> list;
    public MessageAdapter(Context context, int resource, ArrayList<Messgae> objects) {
        super(context, resource, objects);
        item_layout_id=resource;
        con=context;
        list=objects;
    }
    @NonNull
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view=null;  //當前列表項的子視圖
        ViewHolder  holder;
        if(convertView==null){//回收站爲空\
            /**
             * LayoutInflater.from()得到佈局填充器對象
             * getContext()獲取當前上下文
             * inflate() 加載填充佈局
             */
            view= LayoutInflater.from(getContext())
                    .inflate(item_layout_id,parent,false);
            holder=new ViewHolder(view);
            view.setTag(holder);

        }else {//顯示後續的列表項
            view=convertView;
            holder= (ViewHolder) view.getTag();
        }
        final Messgae itemData=getItem(position);
        holder.text_name.setText(itemData.getName());
        holder.text_temp.setText(itemData.getTemp());
        holder.text_city.setText(itemData.getCity());
        holder.text_code.setText(itemData.getCode());
        holder.text_time.setText(itemData.getTime());

        //刪除操作
        holder.img_del.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DataSupport.deleteAll(Messgae.class,"name=?",itemData.getName().toString());
                list.remove(itemData);
                notifyDataSetChanged();
                Toast.makeText(con, itemData.getName()+"刪除成功!!", Toast.LENGTH_SHORT).show();
            }
        });
        //修改操作、跳轉頁面、傳值
        holder.img_edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(con, MainEditActivity.class);
                intent.putExtra("name",itemData.getName());
                intent.putExtra("temp",itemData.getTemp());
                intent.putExtra("city",itemData.getCity());
                intent.putExtra("code",itemData.getCode());
                intent.putExtra("time",itemData.getTime());
                view.getContext().startActivity(intent);

            }
        });
        //查看詳情頁面
        holder.img_look.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(con, MainShowActivity.class);
                intent.putExtra("name",itemData.getName());
                intent.putExtra("temp",itemData.getTemp());
                intent.putExtra("city",itemData.getCity());
                intent.putExtra("code",itemData.getCode());
                intent.putExtra("time",itemData.getTime());
                view.getContext().startActivity(intent);
            }
        });
        return view;
    }
    class  ViewHolder{
        TextView text_name;
        TextView  text_temp;
        TextView  text_city;
        TextView  text_code;
        TextView  text_time;
        ImageView img_look;
        ImageView  img_edit;
        ImageView  img_del;
        public ViewHolder(View view){
            text_name= (TextView) view.findViewById(R.id.text_name);
            text_temp= (TextView) view.findViewById(R.id.text_temp);
            text_city= (TextView) view.findViewById(R.id.text_city);
            text_code= (TextView) view.findViewById(R.id.text_code);
            text_time= (TextView) view.findViewById(R.id.text_time);
            img_look= (ImageView) view.findViewById(R.id.img_look);
            img_edit= (ImageView) view.findViewById(R.id.img_edit);
            img_del= (ImageView) view.findViewById(R.id.img_del);
        }
    }
}

八、編寫對應的實體類。

Message.java

package cn.edu.hznu.litepal.bean;
import org.litepal.crud.DataSupport;
public class Messgae  extends DataSupport{
    private int id;
    private  String name;
    private String  temp;
    private String city;
    private String code;
    private String time;
    public Messgae() {
    }
    public Messgae(int id, String name, String temp, String city, String code, String time) {
        this.id = id;
        this.name = name;
        this.temp = temp;
        this.city = city;
        this.code = code;
        this.time = time;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTemp() {
        return temp;
    }

    public void setTemp(String temp) {
        this.temp = temp;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
}

九、編寫MainActivity.java代碼。

MainActivity.java

package cn.edu.hznu.litepal;
import android.content.Intent;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.view.Menu;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.lljjcoder.citypickerview.widget.CityPicker;
import org.litepal.LitePal;
import cn.edu.hznu.litepal.bean.Messgae;
public class MainActivity extends AppCompatActivity {
    private EditText edit_name, edit_temp;
    private TextView text_city;
    private RadioGroup radioGroup;
    private RadioButton rb;
    private Button button;
    private CityPicker cityPicker;
    String name, temp, city, code, time;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edit_name = (EditText) findViewById(R.id.edit_name);
        edit_temp = (EditText) findViewById(R.id.edit_temp);
        text_city = (TextView) findViewById(R.id.text_city);
        radioGroup = (RadioGroup) findViewById(R.id.radioGroup1);
        button = (Button) findViewById(R.id.button);

         //button的點擊事件
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LitePal.getDatabase();   //創建數據庫
                //獲取值
                name = edit_name.getText().toString().trim();
                temp = edit_temp.getText().toString().trim();
                city = text_city.getText().toString().trim();
                //獲取當前時間
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設置日期格式
                time = df.format(new Date()).toString();// new Date()爲獲取當前系統時間
                for(int i = 0 ;i < radioGroup.getChildCount();i++){
                    RadioButton rb = (RadioButton)radioGroup.getChildAt(i);
                    if(rb.isChecked()){
                        code=rb.getText().toString().trim();
                        break;
                    }
                }
                if (TextUtils.isEmpty(name) || TextUtils.isEmpty(temp) || TextUtils.isEmpty(city) || TextUtils.isEmpty(code)) {
                    Toast.makeText(MainActivity.this, "請填寫完整信息!!", Toast.LENGTH_SHORT).show();
                    return;
                } else {
                    Messgae message = new Messgae();
                    message.setName(name);
                    message.setTemp(temp);
                    message.setCity(city);
                    message.setCode(code);
                    message.setTime(time);  //保存當前時間
                    message.save();
                    Toast.makeText(MainActivity.this, "信息提交成功!!", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(MainActivity.this, Main2Activity.class);
                    startActivity(intent);
                }
            }
        });

        //選擇地址的點擊事件
        text_city.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                initCityPicker();
                cityPicker.show();
            }
            private void initCityPicker() {
                cityPicker=new CityPicker.Builder(MainActivity.this)
                        .textSize(20)
                        .title("選擇地址")
                        .backgroundPop(0xa0000000)
                        .titleBackgroundColor("#0CB6CA")
                        .titleTextColor("#000000")
                        .cancelTextColor("#000000")
                        .confirTextColor("#000000")
                        .province("xx省")
                        .city("xx市")
                        .district("xx區")
                        .textColor(Color.parseColor("#000000"))
                        .provinceCyclic(true)
                        .cityCyclic(false)
                        .districtCyclic(false)
                        .visibleItemsCount(7)
                        .itemPadding(10)
                        .onlyShowProvinceAndCity(false)
                        .build();
                cityPicker.setOnCityItemClickListener(new CityPicker.OnCityItemClickListener() {
                    @Override
                    public void onSelected(String... strings) {
                        String province=strings[0];
                        String city=strings[1];
                        String dist=strings[2];
                        String code=strings[3];
                        text_city.setText(province+","+city+","+dist);
                    }
                    @Override
                    public void onCancel() {
                    }
                });
            }
        });
    }
   //菜單
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main,menu);//獲取當前菜單對象,加載菜單佈局文件
        return true;//顯示菜單
    }
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.all:
                Intent intent = new Intent(MainActivity.this, Main2Activity.class);
                startActivity(intent);
                break;

            default:
        }
        return true;
    }

}

十、編寫 MainEditActivity.java代碼。

MainEditActivity.java

package cn.edu.hznu.litepal;
import android.content.Intent;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.lljjcoder.citypickerview.widget.CityPicker;
import java.text.SimpleDateFormat;
import java.util.Date;
import cn.edu.hznu.litepal.bean.Messgae;
public class MainEditActivity extends AppCompatActivity {
    private CityPicker cityPicker;
    private String name,temp,city,code,time;
    private String name_next,temp_next,city_next,code_next,time_next;
    private EditText edit_name, edit_temp;
    private TextView text_city;
    private RadioGroup radioGroup;
    private RadioButton rb[] =new RadioButton[3];
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_edit);
        text_city=(TextView)findViewById(R.id.text_city) ;
        radioGroup = (RadioGroup) findViewById(R.id.radioGroup1);
        Bundle bundle=getIntent().getExtras();
        name=bundle.getString("name");
        temp=bundle.getString("temp");
        city=bundle.getString("city");
        code=bundle.getString("code");
         time=bundle.getString("time");
        init();
        edit_name.setText(name);
        edit_temp.setText(temp);
        text_city.setText(city);
        if(code.equals("綠碼")){
            rb[0].setChecked(true);
        }
        if(code.equals("黃碼")){
            rb[1].setChecked(true);
        }
        if(code.equals("紅碼")){
            rb[2].setChecked(true);
        }
        edit_name.setFocusable(false);
        edit_name. setFocusableInTouchMode(false);
        text_city.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                initCityPicker();
                cityPicker.show();
            }
        });
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //獲取值
                name_next = edit_name.getText().toString().trim();

                temp_next = edit_temp.getText().toString().trim();
                city_next = text_city.getText().toString().trim();

                //獲取當前時間
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設置日期格式
                time_next = df.format(new Date()).toString();// new Date()爲獲取當前系統時間

                for(int i = 0 ;i < radioGroup.getChildCount();i++){
                    RadioButton rb = (RadioButton)radioGroup.getChildAt(i);
                    if(rb.isChecked()){
                        code_next=rb.getText().toString().trim();
                        break;
                    }
                }
                    Messgae message = new Messgae();
                    message.setTemp(temp_next);
                    message.setCity(city_next);
                    message.setCode(code_next);
                    message.setTime(time_next);
                    message.updateAll("name=?",name);
                    Toast.makeText(MainEditActivity.this, "信息修改成功!!", Toast.LENGTH_SHORT).show();
                 Intent intent = new Intent(MainEditActivity.this, Main2Activity.class);
                   startActivity(intent);
                      }
        });
    }

    private void initCityPicker() {
        cityPicker=new CityPicker.Builder(MainEditActivity.this)
                .textSize(20)
                .title("選擇地址")
                .backgroundPop(0xa0000000)
                .titleBackgroundColor("#0CB6CA")
                .titleTextColor("#000000")
                .cancelTextColor("#000000")
                .confirTextColor("#000000")
                .province("xx省")
                .city("xx市")
                .district("xx區")
                .textColor(Color.parseColor("#000000"))
                .provinceCyclic(true)
                .cityCyclic(false)
                .districtCyclic(false)
                .visibleItemsCount(7)
                .itemPadding(10)
                .onlyShowProvinceAndCity(false)
                .build();
        cityPicker.setOnCityItemClickListener(new CityPicker.OnCityItemClickListener() {
            @Override
            public void onSelected(String... strings) {
                String province=strings[0];
                String city=strings[1];
                String dist=strings[2];
                String code=strings[3];
                text_city.setText(province+","+city+","+dist);
            }
            @Override
            public void onCancel() {
            }
        });
    }

    private void init() {
        edit_name = (EditText) findViewById(R.id.edit_name);
        edit_temp = (EditText) findViewById(R.id.edit_temp);
        text_city = (TextView) findViewById(R.id.text_city);
        rb[0] = (RadioButton) findViewById(R.id.radioButton1);
        rb[1] = (RadioButton) findViewById(R.id.radioButton2);
        rb[2] = (RadioButton) findViewById(R.id.radioButton3);
        button=(Button)findViewById(R.id.button);
    }

}

十一、編寫MainShowActivity.java代碼。

MainShowActivity.java

package cn.edu.hznu.litepal;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainShowActivity extends AppCompatActivity {
    private TextView text_name,text_temp,text_city,text_code,text_time;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_show);
        text_name=(TextView)findViewById(R.id.text_name);
        text_temp=(TextView)findViewById(R.id.text_temp);
        text_city=(TextView)findViewById(R.id.text_city);
        text_code=(TextView)findViewById(R.id.text_code);
        text_time=(TextView)findViewById(R.id.text_time);
        Bundle bundle=getIntent().getExtras();
        String name=bundle.getString("name");
        String temp=bundle.getString("temp");
        String city=bundle.getString("city");
        String code=bundle.getString("code");
        String time=bundle.getString("time");
        text_name.setText("姓名:"+name);
        text_temp.setText("體溫:"+temp);
        text_city.setText("所在城市:"+city);
        text_code.setText("你的健康碼:"+code);
        text_time.setText("填寫時間:"+time);

    }
}

總結:通過本次的小案例,對LitePal操作數據庫,做了理解及使用,結合前幾次的其他知識的學習,做了一次階段性的小總結。但是,該案例還有需要更改的地方,有幾處需要改進。在後面時間也會進行改進擴充。

下面是 幾個具體的實現代碼:

  • 跑馬燈效果實現代碼。
android:ellipsize="marquee" //以滾動的形式顯示文字
android:singleLine="true"  //單行顯示
android:focusable="true" //獲得焦點
android:focusableInTouchMode="true" //獲得觸摸焦點
android:marqueeRepeatLimit="marquee_forever"//滾動模式

  • 用第三方庫實現三級聯動城市選擇器。

(1)導入依賴。

compile 'liji.library.dev:citypickerview:1.1.0'

(2)實現。

    private void initCityPicker() {
                cityPicker=new CityPicker.Builder(MainActivity.this)
                        .textSize(20)
                        .title("選擇地址")
                        .backgroundPop(0xa0000000)
                        .titleBackgroundColor("#0CB6CA")
                        .titleTextColor("#000000")
                        .cancelTextColor("#000000")
                        .confirTextColor("#000000")
                        .province("xx省")
                        .city("xx市")
                        .district("xx區")
                        .textColor(Color.parseColor("#000000"))
                        .provinceCyclic(true)
                        .cityCyclic(false)
                        .districtCyclic(false)
                        .visibleItemsCount(7)
                        .itemPadding(10)
                        .onlyShowProvinceAndCity(false)
                        .build();
                cityPicker.setOnCityItemClickListener(new CityPicker.OnCityItemClickListener() {
                    @Override
                    public void onSelected(String... strings) {
                        String province=strings[0];
                        String city=strings[1];
                        String dist=strings[2];
                        String code=strings[3];
                        text_city.setText(province+","+city+","+dist);
                    }
                    @Override
                    public void onCancel() {
                    }
                });
            }
        });
    }

若文章中有錯誤的地方歡迎大家反饋或者留言,十分感謝!!!


【關於本案例的源碼獲取】關注私信,回覆【十三——源碼】即可。
【關於上一篇案例的源碼獲取Android學習筆記(十二)—數據存儲(SQLite數據庫)
關注私信,回覆【十二——源碼】即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章