實驗十一:待辦事項程式 (儲存在手機上).

Slides:



Advertisements
Similar presentations
开发入门 一个 android 初学者的心得与体会. 前言 两周前张老师通知我说,让我根据教练助手的学习与开发的过程讲下 android 开发的心得与体会,我觉得自己在这么多 Android 前辈大佬面前讲 android 简 直是班门弄斧。由于是刚入门的初学者,水平有限,很多方面还很不足,对 错误或不周到之处欢迎批评指正。顺便还得提下,我这个标题有抄袭积聚童.
Advertisements

Android ADT + Android SDK Eclipse Eclipse 編輯器 JAVA JAVA 開發工具.
数据存储.
第2章  Android应用的界面编程.
第13章 繪圖與多媒體 13-1 顯示圖檔-行動相簿 13-2 音樂播放-音樂播放器 13-3 影片播放-視訊播放器
1 實驗十二:待辦事項程式 ( 儲存在遠端伺服器上 ). 實驗十二 2  主題  本實驗為練習使用 Web Service 操作資料庫  使用資料庫用來建立、新增、刪除、修改資料等功能  目的  學習如何使用 Web Service 的連線  了解與遠端伺服器的參數傳遞  環境需求 
實驗五:多媒體播放器選單介面.
Part 2 開發Android應用程式的流程
位置與地圖應用 此投影片為講解Android如何取得定位經緯度和使用Google Map地圖.
Android + Web Service 建國科技大學 資管系 饒瑞佶 2017/3 V1.
ArrayAdapter & Spinner
Location Based Services - LBS
Android App 系統開發教學 Luna 陳雯琳 2014/12/18
建立Android新專案 建國科技大學 資管系 饒瑞佶 2010/10.
厦门大学数据库实验室 报告人:谢荣东 导师:林子雨 2014年8月30日
實驗四:單位轉換程式.
第2章 建立Android應用程式 2-1 Java語言、XML文件與Android 2-2 建立第一個Android應用程式
第7章 Android文件与本地数据库(SQLite)
Chapter 13 Android 實戰演練.
Android + JUnit 單元測試 建國科技大學資管系 饒瑞佶 2012/8/19V4.
實驗十三:顯示目前經緯度位置.
其他視窗.
Ch06 再談選單元件 物件導向系統實務.
使用Android控制Arduino 史先强
7.3 Intent传值.
第10章 App微信分享的实现 倚动实验室.
Android資料庫處理 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
第一个Android程序 本讲大纲: 1、创建Android应用程序 2、Android项目结构说明 3、运行Android应用程序
第8章 Android内容提供者(ContentProvider)应用
Chapter 6 Advanced UI Design.
Android智慧型手機程式設計實務應用班
Chapter 7 Android應用元件 Android應用元件可以幫助我們獲得系統資源訊息(ActivityManager)、提供系統服務(Service)、搜尋系統服務(SearchManager)、監聽Intent訊息(Broadcast Receiver)以及資料共享(ContentProvider和ContentResolver)。
Android介面設計 Android智慧型手機程式設計 建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2
Chapter 6 進階UI設計.
第4章 Android生命周期.
ContentProvider與資料共享
第9章 使用意圖啟動活動與內建應用程式 9-1 意圖的基礎 9-2 使用意圖啟動活動
ANDROID PROGRAMMING2.
CH7 佈局、按鈕與文字編輯元件.
Android + Service 建國科技大學 資管系 饒瑞佶.
Android 基礎.
第10章 儲存偏好設定、檔案與資料庫 10-1 存取偏好設定 10-2 檔案存取 10-3 關聯式資料庫與SQLite
實驗十四:顯示與控制地圖.
第2讲 移动应用开发基础知识(二) 宋婕
建立Android新專案 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
多視窗資料傳遞.
第6章 建立Android使用介面 6-1 介面元件的基礎 6-2 Android的事件處理 6-3 按鈕元件 6-4 文字元件
Android 视频教程简介.
主编:钟元生 赵圣鲁.
第11章 ListView延迟加载效果 授课老师:高成珍 QQ号: QQ群: 、
Android Studio介面設計 建國科技大學資管系 饒瑞佶 2016/3 V1.
Chapter 5 Basic UI Design.
Android視窗介面 建國科技大學 資管系 饒瑞佶 2010/10.
實驗九:延續實驗八, 製作一個完整音樂播放器
Location Based Services - LBS
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
補間動畫 (Tween Animation) 靜宜大學資管系 楊子青
第二章 Java语法基础.
Android視窗介面 建國科技大學 資管系 饒瑞佶 2010/10.
實驗十六:匯出APK安裝檔與軟體上架.
第二章 Java基本语法 讲师:复凡.
進階UI元件:ListView元件以及複選 靜宜大學資管系 楊子青
RecyclerView and CardView
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
Android Speech To Text(STT)
用Intent啟動程式中的其他Activity、運用WebView顯示網頁 靜宜大學資管系 楊子青
第2章 Java语言基础.
加速感測器 靜宜大學資管系 楊子青.
SQLite資料庫 靜宜大學資管系 楊子青.
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
Presentation transcript:

實驗十一:待辦事項程式 (儲存在手機上)

實驗十一 主題 目的 環境需求 本實驗為練習使用Android系統中操作SQLite 使用資料庫用來建立、新增、刪除、修改資料等功能 Java SE Development Kit (JDK) Android SDK Eclipse ADT 此實驗將使用Android系統中的資料庫,用來熟悉資料庫的操作。

實驗十一範例 將製作一個行程事項列表應用程式 按下新增後,會將輸入的資訊存入資料庫 列表處會顯示今天和今天之後的行程事項 此實驗將製作一個行程事項列表應用程式,行程事項需輸入日期、時間和標題,按下新增後,會將輸入的資訊存入資料庫,在上圖左的列表處,會顯示今天和今天之後的行程事項,點選列表中選項,會進入修改和刪除頁面,如上圖右,可進行資料修改和刪除。

範例使用的資料庫 資料庫名稱:schedule 資料表名稱:todolist 欄位名稱 資料型態 預設 備註 _id Integer primary key Autoincrement 流水號 (系統自動新增) date Text 日期 time 時間 title 標題 範例中使用的資料庫檔案名稱為schedule,資料表名稱為todolist,具有4個欄位: _id、date、time、title,分別儲存流水號(系統自動新增)、日期、時間、標題。

res/layout/activity_main.xml <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:orientation="vertical" > <LinearLayout android:layout_height="wrap_content" > <EditText android:id=“@+id/editText1” android:layout_weight=“1” android:layout_height="wrap_content" android:hint=“輸入日期” android:inputType="date" /> android:id=“@+id/editText2” android:layout_weight=“1” android:hint=“輸入時間” android:inputType="time" /> </LinearLayout> //接下頁 1 輸入日期和時間的編輯框 1. res/layout/activity_main.xml,將其佈局改為垂直線性佈局,在垂直線性佈局中拖入兩個水平線性佈局和一個ListView元件,在兩個水平線性佈局中,分別拖入兩個EditText和一個EditText與按鈕

res/layout/activity_main.xml <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <EditText android:id=“@+id/editText3” android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="輸入標題" /> <Button android:id="@+id/button1" android:text="新增" /> </LinearLayout> <ListView android:id="@+id/listView1" android:layout_height="wrap_content" /> 2 輸入標題的編輯框和新增的按鈕 2. res/layout/activity_main.xml,將其佈局改為垂直線性佈局,在垂直線性佈局中拖入兩個水平線性佈局和一個ListView元件,在兩個水平線性佈局中,分別拖入兩個EditText和一個EditText與按鈕

新增res/layout/list.xml 在layout按右鍵→新建→Android XML File XML名稱 3

res/layout/list.xml <?xml version="1.0" encoding="utf-8"?> 4 <?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" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" </LinearLayout> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" android:layout_gravity="center_vertical" android:layout_weight="1" /> 4.一列列表選項佈局檔 一列列表選項佈局

新增DBAccess類別 套件名稱按右鍵→新建→類別 5 類別名稱 5.新增DBAccess類別,首先套件名稱按右鍵→新建→類別

src/DBAccess.java 繼承SQLiteOpenHelper 新增DBAccess建構子 DBAccess建構子 6 7 6.DBAccess類別繼承SQLiteOpenHelper,將滑鼠移到SQLiteOpenHelper,會跳出修正視窗,選擇匯入SQLiteOpenHelper(import android.database.sqlite.SQLiteOpenHelper;) 7.將滑鼠移到DBAccess,會跳出修正視窗,新增DBAccess類別的建構子

src/DBAccess.java 將滑鼠移到DBAccess 新增未實作方法 建立資料表 更新資料表 8 8.再將滑鼠移到DBAccess,會跳出修正視窗,選取新增未實作方法onCreate()和onUpgrade(),onCreate()方法中建立資料表,onUpgrade()方法用來更新資料表,在此方法中先將資料表刪除,再重新建立 更新資料表

src/DBAccess.java public class DBAccess extends SQLiteOpenHelper{ protected final static String TABLE_NAME="todolist";//定義資料表名稱 protected final static String ID_FIELD="_id";//定義_id欄位 protected final static String DATE_FIELD="date";//定義date欄位 protected final static String TIME_FIELD="time";//定義time欄位 protected final static String TITLE_FIELD="title";//定義title欄位 public DBAccess(Context context, String name, CursorFactory factory,int version) { super(context, name, factory, version); } 9 建立資料表的SQL語法 10 @Override public void onCreate(SQLiteDatabase db) { String sql="create table "+TABLE_NAME+"(" +ID_FIELD+" integer primary key autoincrement," +DATE_FIELD+" text, " +TIME_FIELD+" text, " +TITLE_FIELD+" text)"; db.execSQL(sql); } 9.建立資料表名稱、_id欄位、date欄位、time欄位和title欄位的變數 10.在onCreate()方法中建立資料表並執行建立資料表的SQL語法 執行SQL語法

src/DBAccess.java 若建立此DBAccess物件時,傳入的版本與應用程式中存在的資料庫版本不同時,會執行此方法 11 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop table if exists "+TABLE_NAME); onCreate(db); } 將資料表刪除 重新建立資料表 自訂新增資料方法,傳入參數為:日期、時間、標題 12 long add(String date, String time, String title) { SQLiteDatabase db=this.getWritableDatabase();//取得讀寫資料表物件 ContentValues values =new ContentValues(); values.put(DATE_FIELD, date); values.put(TIME_FIELD, time); values.put(TITLE_FIELD, title); long result=db.insert(TABLE_NAME, null, values);//執行新增資料 db.close(); return result;//回傳新資料的row ID,若為-1表示新增失敗 } 11. onUpgrade()方法若建立此DBAccess物件時,傳入的版本與應用程式中存在的資料庫版本不同時,會執行此方法,將舊的資料表刪除再重新建立新的資料表 12. long add(String date, String time, String title)為自訂新增資料方法,傳入參數為:日期、時間、標題

src/DBAccess.java 自訂修改資料方法,傳入參數為:日期、時間、標題、更新條件,無須修改則傳入null 13 long update(String date, String time, String title,String whereClause) { SQLiteDatabase db=this.getWritableDatabase();//取得讀寫資料表物件 ContentValues values =new ContentValues(); if(date!=null) values.put(DATE_FIELD, date); if(time!=null) values.put(TIME_FIELD, time); if(title!=null) values.put(TITLE_FIELD, title); //執行更新資料 long result=db.update(TABLE_NAME, values, whereClause, null); db.close(); return result;//回傳更新資料筆數 } 14 自訂刪除資料方法,傳入參數為:欲刪除資料的_id欄位值 13. long update(String date, String time, String title,String whereClause)為自訂修改資料方法,傳入參數為:日期、時間、標題、更新條件,無須修改則傳入null,將滑鼠移到ContentValues,跳出修正視窗,選取匯入ContentValues(import android.content.ContentValues;) 14. int delete(String _id)為自訂刪除資料方法,傳入參數為:欲刪除資料的_id欄位值 int delete(String _id){ SQLiteDatabase db=this.getWritableDatabase();//取得讀寫資料表物件 int result=db.delete(TABLE_NAME, ID_FIELD+" ="+_id, null); //進行刪除 db.close(); return result;//回傳刪除筆數 }

src/DBAccess.java 自訂查詢資料方法,傳入參數為:查詢條件、排序欄位 15 自訂查詢資料方法,傳入參數為:查詢條件、排序欄位 Cursor getData(String whereClause, String orderBy){ SQLiteDatabase db=this.getReadableDatabase();//取得讀寫資料表物件 Cursor c=db.query(TABLE_NAME, new String[]{ID_FIELD,DATE_FIELD,TIME_FIELD,TITLE_FIELD}, whereClause, null, null, null, orderBy); //進行查詢 return c; } 15. Cursor getData(String whereClause, String orderBy)為自訂查詢資料方法,傳入參數為:查詢條件、排序欄位,將滑鼠移到Cursor,跳出修正視窗,匯入Cursor(import android.database.Cursor;)

src/MainActivity.java public class MainActivity extends Activity { DBAccess access; ListView lv; SimpleCursorAdapter adapter=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv=(ListView)findViewById(R.id.listView1); Button btn=(Button)findViewById(R.id.button1); btn.setOnClickListener(this); lv.setOnItemClickListener(this); access=new DBAccess(this, "schedule", null, 1); } 16 cursor資料指標物件與ListView連接的adapter,cursor中必須要有_id欄位資料 產生自訂DBAccess物件,以建立資料庫、 表和進行資料表操作 資料庫檔案名稱為schedule,版本為1 17 16.建立全域變數,cursor資料指標物件與ListView連接的adapter,cursor中必須要有_id欄位資料 17. findViewById()找到視窗上的ListView和Button,監聽Button按紐,將滑鼠移到setOnClickLinstener,跳出修正視窗,選取讓MainActivity實作tOnClickLinstener,監聽ListView,將滑鼠移到setOnItemClickListener,跳出修正視窗,選取讓MainActivity實作OnItemClickListener。 access=new DBAccess(this, “schedule”, null, 1)產生自訂DBAccess物件,以建立資料庫、表和進行資料表操作,資料庫檔案名稱為schedule,版本為1

src/MainActivity.java 18 將滑鼠移到MainActivity,選取新增未實作方法 18.將滑鼠移到MainActivity,跳出修正視窗,選取新增未實作方法,實作onItemClick()和onClick()

src/MainActivity.java 當列表資料點選時會執行此方法,arg3為此筆資料的_id值 @Override 19 當列表資料點選時會執行此方法,arg3為此筆資料的_id值 @Override public void onItemClick(AdapterView<?> arg0, View arg1,int arg2,long arg3) { Intent intent=new Intent(); intent.setClass(this, modify.class); //設定新活動視窗類別 Bundle bdl=new Bundle(); bdl.putString("id", arg3+"");//將arg3傳遞到新的活動視窗中 intent.putExtras(bdl); startActivity(intent); //開啟新的活動視窗 } 19. 當列表資料點選時會執行onItemClick()方法,arg3為此筆資料的_id值,將選取到的資料_id值綁在Bundle傳遞給modify活動視窗

src/MainActivity.java 找出輸入日期、時間、標題的文字框物件和取得輸入的文字 @Override public void onClick(View v) { EditText ed=(EditText)findViewById(R.id.editText1); String date=ed.getText()+""; ed=(EditText)findViewById(R.id.editText2); String time=ed.getText()+""; ed=(EditText)findViewById(R.id.editText3); String title=ed.getText()+""; long result=access.add(date, time, title);//執行新增資料操作 if(result>=0) {//新增成功 Toast.makeText(this, "新增成功", Toast.LENGTH_LONG).show(); Cursor c=access.getData( DBAccess.DATE_FIELD+">= strftime('%Y-%m-%d','now')", DBAccess.DATE_FIELD+" ,"+DBAccess.TIME_FIELD); adapter.changeCursor(c);//更新ListView呈現的資料 }else//失敗 Toast.makeText(this, "新增資料失敗", Toast.LENGTH_LONG).show(); } 找出輸入日期、時間、標題的文字框物件和取得輸入的文字 20 20.當點選新增按鈕會執行OnClick()方法,找出輸入日期、時間、標題的文字框物件和取得輸入的文字,使用DBAccess類別

src/MainActivity.java @Override protected void onResume() { Cursor c=access.getData( DBAccess.DATE_FIELD+">= strftime('%Y-%m-%d','now')", DBAccess.DATE_FIELD+" ,"+DBAccess.TIME_FIELD); if(adapter==null){ //表示第一次執行,需建立SimpleCursorAdapter物件 adapter=new SimpleCursorAdapter(this, R.layout.list,c, new String[]{DBAccess.DATE_FIELD, DBAccess.TIME_FIELD, DBAccess.TITLE_FIELD}, new int[]{R.id.textView1,R.id.textView2,R.id.textView3}, 0); lv.setAdapter(adapter); }else adapter.changeCursor(c);//更新ListView呈現的資料 super.onResume(); } 21 21. onResume()方法中,會去查詢todolist資料表中大於等於今天日期的資料,並將回傳的資料指標物件與ListView元件透過SimpleCursorAdapter進行繫結,要使用SimpleCursorAdapter需注意的是此方法需傳入Cursor物件,此Cursor物件必需要有_id資料欄位的資料,否則將產生執行錯誤。取得資料表中大於等於今天日期(strftime('%Y-%m-%d','now')方法是 SQLite內建的語法,now表示取得現在日期時間,strftime表示將日期進行格式化,%Y表示顯示四位數年分,%m表示顯示兩位數月份、%d表示顯示兩位數日期,詳細資料可參考SQLite官網),並依據日期時間遞增排序。

新增modify活動視窗 套件名稱按右鍵→新建→其他 22 22.新增modify活動視窗,在套件名稱按右鍵→新建→其他,新建Android Activity

新增modify活動視窗 23 活動視窗名稱 23.新增一個活動視窗,活動視窗名稱為modify

res/layout/activity_modify.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" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="日期" /> <EditText android:id="@+id/editText1" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="date" /> </LinearLayout> <TextView android:id="@+id/textView2" android:text="時間" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:id="@+id/editText2" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="time" /> //接下頁 24 修改日期和時間的編輯框 24.修改res/layout/activity_modify.xml,在將其佈局改為垂直線性佈局,在垂直線性佈局中拖入兩個水平線性佈局,第一個水平線性佈局放入兩個TextView和EditText

res/layout/activity_modify.xml 25 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="標題" /> <EditText android:id="@+id/editText3" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="修改" /> <Button android:id="@+id/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="刪除" /> 25.第二個水平線性佈局放入一個TextView和EditText以及兩個Button 修改標題的編輯框 修改和刪除的按鈕

src/modify.java public class modify extends Activity { DBAccess access; EditText dateET; EditText timeET; EditText titleET; String id; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_modify); Button btn=(Button)findViewById(R.id.button1); btn.setOnClickListener(this); btn=(Button)findViewById(R.id.button2); access=new DBAccess(this, "schedule", null, 1); Bundle bdl=getIntent().getExtras(); id=bdl.getString("id","0"); //接下頁 } 26 27 26.建立全域變數,包含DBAccess和EditText以及存放主視窗傳遞過來的_id 27.用findViewById()找出視窗上的按鈕,將Bundle中的_id欄位取出 將Bundle中的_id欄位取出

src/modify.java @Override public void onCreate(Bundle savedInstanceState) { Cursor c=access.getData(DBAccess.ID_FIELD+" ="+id, null); c.moveToFirst(); dateET=(EditText)findViewById(R.id.editText1); dateET.setText(c.getString(1)); timeET=(EditText)findViewById(R.id.editText2); timeET.setText(c.getString(2)); titleET=(EditText)findViewById(R.id.editText3); titleET.setText(c.getString(3)); } 27 c.getString(1), c.getString(2), c.getString(3)分別取出Cursor物件中第二個(date), 第三個(time), 第四個(title)欄位值 27.呼叫DBAccess類別的getData方法進行資料查詢條件為_id等於上一個活動視窗傳遞過來的資料,使用findViewById()找到視窗上的元件,getString()取得欄位資料,c.getString(1), c.getString(2), c.getString(3)分別取出Cursor物件中第二個(date), 第三個(time), 第四個(title)欄位值

src/modify.java 28 28.監聽按紐,將滑鼠移到setOnClickListener,跳出修正視窗,選擇讓modify實作OnClickListener,接著將滑鼠移到modify,選取新增未實作方法。

src/modify.java @Override public void onClick(View v) { switch (v.getId()) { case R.id.button1://資料表中的資料修改 access.update(dateET.getText()+"", timeET.getText()+"", titleET.getText()+"",DBAccess.ID_FIELD+" ="+id); break; case R.id.button2://資料表中的資料刪除 access.delete(id); } finish();//關閉修改刪除活動視窗 29 29.監聽按紐,如果為按下修改按鈕則呼叫DBAccess類別的update()方法修改資料庫的資料,如果為按下刪除按鈕,則呼叫DBAccess類別的delete()方法刪除資料庫的資料

資料庫儲存的位置 DDMS選擇模擬器→data→data→此專案的套件名稱→database