ANDROID PROGRAMMING2.

Slides:



Advertisements
Similar presentations
第二章 简单的 SQL 语句. 本章要点  创建一个简单的表  SQL 语句介绍  最简单的查询语句 select  带有限制条件的查询  查询结果的排序显示.
Advertisements

第十章 Java 数据库编程. 内容提要 数据库有关概念; 介绍 JDBC 的结构; 重点介绍 JDBC 访问几种数据库的基本过程;
Data type P64 ‘’ 转义字符 P67 P68 EXE,选出某个教师的学生中最新的一 个,要姓名, ID (,LIMIT ) EXISTS,NOT EXISTS P409 Q,EXISTS 和 in 的区别( 1000 ,查询结果)
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
项目6 通用堆栈.
数据存储.
第2讲 Transact-SQL语言.
四資二甲 第三週作業 物件導向程式設計.
面向对象的程序设计(一).
MVC Servlet与MVC设计模式.
實驗五:多媒體播放器選單介面.
位置與地圖應用 此投影片為講解Android如何取得定位經緯度和使用Google Map地圖.
第二章 JAVA语言基础.
Google App Engine Google 應用服務引擎.
類別與物件 Class & Object.
Activity之间的数据传递.
ArrayAdapter & Spinner
厦门大学数据库实验室 报告人:谢荣东 导师:林子雨 2014年8月30日
第7章 Android文件与本地数据库(SQLite)
数据库操作示例 import java.sql.*; //导入java.sql包 public class JDBCDemo {
Ch06 再談選單元件 物件導向系統實務.
課程名稱:資料庫系統 授課老師:李春雄 博士
Android資料庫處理 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
胡鹏 王慧锋 TEL: 数据库系统原理课程设计 实验环节1 胡鹏 王慧锋 TEL:
第一个Android程序 本讲大纲: 1、创建Android应用程序 2、Android项目结构说明 3、运行Android应用程序
第8章 Android内容提供者(ContentProvider)应用
Chapter 6 Advanced UI Design.
崑山科技大學資訊管理系 伺服網頁程式設計 系統開發細部流程 教師:游峰碩.
電子商務網站建制技術與實習(II) 助教:江宜政 吳昇洋.
2018/11/23 面向对象与多线程综合实验-数据库操作 教师:段鹏飞.
Ch5 Android應用程式的主要組成.
Chapter 7 Android應用元件 Android應用元件可以幫助我們獲得系統資源訊息(ActivityManager)、提供系統服務(Service)、搜尋系統服務(SearchManager)、監聽Intent訊息(Broadcast Receiver)以及資料共享(ContentProvider和ContentResolver)。
Android介面設計 Android智慧型手機程式設計 建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2
Android Intent 建國科技大學 資管系 饒瑞佶 2011/1.
本單元介紹何謂變數,及說明變數的宣告方式。
Chapter 6 進階UI設計.
厦门大学数据库实验室 MapReduce 连接
ContentProvider與資料共享
第9章 使用意圖啟動活動與內建應用程式 9-1 意圖的基礎 9-2 使用意圖啟動活動
程式設計實作.
課程名稱:資料庫系統 授課老師:李春雄 博士
Android + Service 建國科技大學 資管系 饒瑞佶.
第10章 儲存偏好設定、檔案與資料庫 10-1 存取偏好設定 10-2 檔案存取 10-3 關聯式資料庫與SQLite
實驗十四:顯示與控制地圖.
Java程序设计 第9章 继承和多态.
建立Android新專案 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
实验4:PL-SQL编程 1.实验目的 2.实验原理 PL/SQL是一种过程化语言,属于第三代语言,本实验在与熟悉使用PL/SQL编程.
第8章 Service解析.
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
C/C++/Java 哪些值不是头等程序对象
實驗十一:待辦事項程式 (儲存在手機上).
主编:钟元生 赵圣鲁.
Android 开发入门.
第11章 ListView延迟加载效果 授课老师:高成珍 QQ号: QQ群: 、
Android Application Component
JAVA 编 程 技 术 主编 贾振华 2010年1月.
SQL查询语句 蔡海洋.
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
第9章 BroadcastReceiver的使用
第4章 数据查询.
第二章 Java基础语法 北京传智播客教育
Part 8 Broadcast Receiver、Service和App Widget
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
Summary
Presentation transcript:

ANDROID PROGRAMMING2

OUTLINE 加入新Activity AndroidManifest.xml Activity間的資料傳送 Intent SQLite資料庫

加入新ACTIVITY 一個java檔對應一個xml檔 Report.java Report.xml

加入新ACTIVITY: REPORT.XML Like main.xml

加入新ACTIVITY: REPORT.JAVA

INTENT Intent 建立意圖 startActivity 傳遞Intent 框架 收到Intent 判斷 新Activity 在執行「startActivity」函式時,應用程式並不是直接呼叫另一個 Activity,而是將「Intent」(意圖)傳進 Android 框架中。 Android 框架會查看 「startActivity」 呼叫所傳入的動作與 Intent 內容是否在註冊表中,如果符合,就啟動對應的服務或 Activity。 Android 系統中的每一個應用程式,在安裝的過程裡,都得事先在 Android 框架中註冊、登記這個應用程式所建立的 Activity,並事先註明會使用到的服務。

加入新Activity: 修改原Activity 建立Intent實體 建立一個新的「意圖」(Intent) 實體

setClass(原Activity,新Activity) 為這個意圖指定來源的 Activity 所在 class,與要前往的 Activity 所在的 class。

加入新Activity: 修改原Activity 將定義好的 intent 傳入「startActivity」函式中。「startActivity」函式會將 intent 傳入 Android 框架,Android 框架會根據各應用程式在系統中註冊的資料(有沒有聯想到我們剛剛為 Report Activity 增加的 activity 清單描述?),找出 Report 這個 Activity,並呼叫它。

ANDROIDMANIFEST.XML AndroidManifest.xml 是一個用來描述 Android 應 用程式「整體資訊」的設定檔。可以向 Android 系 統介紹我們的 Android 應用程式,以便讓 Android 系統完整地了解我們的應用程式資訊。 「自我介紹」檔

ANDROIDMANIFEST.XML 程式進入點

ANDROIDMANIFEST.XML 版本 「android:versionCode」和「android:versionName」是應用程式版本號。 這兩個屬性是可選的(非必要)。 「android:versionName」是給使用者看的版本號,如「1.0」、「2.0」。「android:versionCode」則是開發者用的內部版本號,一般使用流水號。

定義應用程式用到的Activity、服務資訊 ANDROIDMANIFEST.XML Application標籤: 定義應用程式用到的Activity、服務資訊 「application」標籤裡面,定義了所有這個應用程式用到的 Activity、服務等資訊。 「android:icon=“@drawable/icon”」表示應用程式圖示的資源檔存在於 「res/drawable/icon」 中。

ANDROIDMANIFEST.XML 這個 Activity 所對應的類別 com.demo.android.bmi.Bmi 「activity」標籤的「android:name」屬性,指出了這個 Activity 所對應的類別(class)。「activity」標籤中的「android:label」屬性可用來指定應用程式將顯示在 Activity 畫面上方的名稱。 「Manifest」標籤屬性中已經定義了「package="com.demo.android.bmi"」,因此在「activity」標籤的 「android:name」屬性中,「.Bmi」代表著「com.demo.android.bmi.Bmi」的簡寫。

ANDROIDMANIFEST.XML 這個Activity式此應用程式的進入點 此Activity將顯示在Launcher的應用程式列表  「action」標籤中的「android:name」屬性,其內容「android.intent.action.MAIN」表示:這個 Activity 是此應用程式的進入點(就像程式中常見的 main 主程式),開啟這個應用程式時,應先執行這個 Activity。 「category」標籤中的「android:name」屬性,其內容「android.intent.category.LAUNCHER」表示:這個 Activity 將顯示在 Launcher 的應用程式列表中。 當Intent要求去做某些事情時,Intent Filter被用來描述這個activity能夠做些什麼事情。例如:一個activity要能夠顯示聯絡人資料,就必需要在Intent Filter說明要如何處理聯絡人資料並且用ACTION_VIEW來呈現出來。Intent Filter都會宣告在AndroidManifest.xml檔案中。 此Activity將顯示在Launcher的應用程式列表

ACTIVITY 獨立的Activity 單純的從一個螢幕跳到下個螢幕,不涉及資料的 交換。 相依的Activity

ACTIVITY間資料傳送: 傳遞資料 把要傳送的東西用bundle包起來 將bundle附加在intent上 傳送 intent 時,我們可以在其上附加一些訊息,比如說本例中我們從輸入介面中取出了的身高、體重值,要將身高、體重值傳送給 Report Activity 後作計算。這些附加在 Intent 上的訊息都儲存在 Bundle 物件中。透過「intent.putExtras(bundle)」敘述,我們將「bundle」 物件附加在 Intent 上,隨著 Intent 送出而送出。 將bundle附加在intent上

ACTIVITY間資料傳送: 傳遞資料 取出field_height的值轉成字串 將使用者輸入的身高、體重值,儲存到 bundle 物件中。 Bundle 其實是一種特別定義的映射(map)型別。「KEY_HEIGHT」、「KEY_WEIGHT」是我們為儲存在 bundle 物件中的身高、體重值,所指定的「識別符號」。在這邊,我們直接把身高、體重值都儲存成字串。因為整個程式都是我們控制,到時候在接收的 Activity 一端,再透過「KEY_HEIGHT」、「KEY_WEIGHT」這兩個「識別符號」來取得實際的身高、體重值。讀出的值也是字串,等值讀出來以後,再去做型別轉換就好了。 在新的Activity中用KEY_HEIGHT識別符號來存取這個值

取得附加在Intent上的bundle物件 ACTIVITY間資料傳送: 接收資料 取得傳來的Intent 取得附加在Intent上的bundle物件 使用 Activity.getIntent() 函數,可以得到傳來的 Intent 物件。然後使用「getExtras」函式,就能取得附加在 Intent 上的 bundle 物件。

透過KEY_HEIGHT識別符號取出存在其中的資料 ACTIVITY間資料傳送: 接收資料 透過KEY_HEIGHT識別符號取出存在其中的資料 透過指定儲存在 bundle 物件中的身高、體重值的識別符號「KEY_HEIGHT」、「KEY_WEIGHT」來取出身高、體重值的資料。

INTENT 現成的Intent Ex. 開啟網頁 自訂的Intent Ex. 切換 Activity、在其間傳遞各式的資料。

提供網址給Inten.ACTION_VIEW動作,便會開啟網頁瀏覽器 INTENT 提供網址給Inten.ACTION_VIEW動作,便會開啟網頁瀏覽器 「Intent.ACTION_VIEW」這個動作的意義為:依所提供內容的不同,開啟對應的程式以檢視內容資料。我們可以把這個動作想成在一般桌面系統上,開啟一個已知的檔案類型檔案(比如說一張照片),作業系統會用你預設的應用程式(比如說某看圖軟體)開啟這個檔案。

LIST ACTIVITY 筆記本程式 用一個列表來顯示所有的記事條目 增加一筆條目 刪除選擇的條目 編輯選擇的條目

DUMMYNOTE.JAVA Activity ListActivity 建立一個畫面是一個list的activity,不像一般都是繼承Activity,這裡繼承ListActivity ListActivity繼承Activity,預設綁訂了一個“ListView”介面元件,並提供一些與列表檢視、處理相關 的操作。 ListView中每一個row都可以被選取,並交由其他函式作後續處理

自訂的字串陣列,會透過Adapter以List的形式顯示在螢幕上 DUMMYNOTE.JAVA 自訂的字串陣列,會透過Adapter以List的形式顯示在螢幕上

DUMMYNOTE.JAVA 將字串陣列傳給他並設定好Adapter

MAIN.XML 在xml檔裡定義ListView元件

設定當列表是空的時候(沒有資料)要顯示的內容 MAIN.XML 設定當列表是空的時候(沒有資料)要顯示的內容

SQLITE 在嵌入式系統中常見的資料庫,所有的資料都存在一 個檔案中,便於遷移。 占用相對於其他資料庫來的少的記憶體空間 使用SQL語句來查詢(SELECT)、新增(INSERT)、 修改(UPDATE)、刪除(DELETE)、定義資料格式 (CREATE TABLE)等。

DATABASEHELPER 繼承SQLiteOpenHelper 協助我們: 建立資料表 管理資料表

(DATABASEHELPER:建構子) NOTESDBADAPTER.JAVA (DATABASEHELPER:建構子) public class NotesDbAdapter { private static final String DATABASE_NAME = "notes.db"; private static final int DATABASE_VERSION = 1; ....... private static class DatabaseHelper extends SQLiteOpenHelper{ public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } 傳入資料庫名稱 做複雜的查詢,一般用不到 物件,可以控制資料庫的開啟和關閉 建立一個DatabaseHelper class 建構子 傳入資料庫版本

( DATABASEHELPER: ONCREATE() ) NOTESDBADAPTER.JAVA ( DATABASEHELPER: ONCREATE() ) public class NotesDbAdapter { private static final String DATABASE_CREATE = "create table notes(" +"_id INTEGER PRIMARY KEY," +"note TEXT," +"created INTEGER," +"modified INTEGER" +");“; …. private static class DatabaseHelper extends SQLiteOpenHelper{ public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE); } 建立一個名為notes的資料表。資料表中有四個欄位,_id欄位會自動計數,note欄位儲存文字型態,created和modified欄位儲存數字型態。 SQL語句。

( DATABASEHELPER: ONCREATE() ) NOTESDBADAPTER.JAVA ( DATABASEHELPER: ONCREATE() ) public class NotesDbAdapter { private static final String DATABASE_CREATE = "create table notes(" +"_id INTERGER PRIMARY KEY," +"note TEXT," +"created INTEGER," +"modified INTEGER" +");“; …. private static class DatabaseHelper extends SQLiteOpenHelper{ public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE); } 傳入SQL語句 傳入一個SQLiteDatabase資料庫類別的db。程式中可使用db的excSQL方法來輸入儲存於DATABASE_CREATE變數中的SQL語句。

( DATABASEHELPER: ONUPGRADE() ) NOTESDBADAPTER.JAVA ( DATABASEHELPER: ONUPGRADE() ) public class NotesDbAdapter { private static final String DATABASE_TABLE = "notes"; …. private static class DatabaseHelper extends SQLiteOpenHelper{ …. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL(“DROP TABLE IF EXISTS "+DATABASE_TABLE); onCreate(db); } 若舊版本存在,就將其移除 傳入資料庫類別db參數。傳入目前的版本及新開發的版本,以做upgrade的動作。 缺點:更新後原本儲存進資料表的資料都會被刪除。 重新建立資料表

NOTESDBADAPTER.JAVA (建構子) public class NotesDbAdapter { private Context mCtx = null; …. public NotesDbAdapter(Context ctx){ this.mCtx = ctx; }

NOTESDBADAPTER.JAVA (建構子) public class NotesDbAdapter { private Context mCtx = null; …. public NotesDbAdapter(Context ctx){ this.mCtx = ctx; }

NOTESDBADAPTER.JAVA ( OPEN() ) public class NotesDbAdapter { private DatabaseHelper dbHelper; private SQLiteDatabase db; …. public NotesDbAdapter open() throws SQLException{ dbHelper = new DatabaseHelper(mCtx); db = dbHelper.getWritableDatabase(); return this; } 準備好一個相對應的資料庫給我們使用 getWritableDatabase方法會根據我們在DatabaseHelper類別中的設定,若這個資料庫不存在就呼叫create方法建立一個, 若已存在就根據資料庫版本來決定是否要更新資料庫。

NOTESDBADAPTER.JAVA ( CLOSE() ) public class NotesDbAdapter { …. public void close(){ dbHelper.close(); } 停止對資料的存取

DUMMYNOTE.JAVA public class DummyNote extends ListActivity { …. private NotesDbAdapter mDbHelper; private void setAdapter() { mDbHelper = new NotesDbAdapter(this); mDbHelper.open(); ListAdapter adapter = new ArrayAdapter<String> (this,android.R.layout.simple_list_item_1,note_array); setListAdapter(adapter); } 在主程式中透過open()打開資料庫

NOTESDBADAPTER.JAVA (加入查詢) public class NotesDbAdapter { …. public Cursor getall(){ return db.rawQuery("SELECT * FROM notes", null); } rawQuery可以執行SQL語法,傳回一個指針(Cursor)。指針(Cursor)類別是用來存取查詢的結果,程式需要資料表時再透過指針來存取。 SQL語法(SELECT 欄位 FROM 資料表)。從notes資料表中選擇全部資料。 *代表選擇全部

DUMMYNOTE.JAVA (與列表聯繫) public class DummyNote extends ListActivity { private NotesDbAdapter mDbHelper; private Cursor mNotesCursor; …. private void fillData(){ mNotesCursor = mDbHelper.getall(); startManagingCursor(mNotesCursor); } 返回能查詢資料表所有的資料的指針,儲存到mNotesCursor中 讓Activity可以基於本身的生命週期,一併管理Cursor的生命週期。

DUMMYNOTE.JAVA (與列表聯繫) public class DummyNote extends ListActivity { …. private void fillData(){ String[] from = new String[]{"note"}; int[] to = new int[]{android.R.id.text1}; SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1,mNotesCursor,from,to); setListAdapter(adapter); } 從資料表端的note欄位(from)映射到android.R.layout.simple_list_item_1每一列描述格式中的text1欄位(to)裡 將接口和ListView連接

CRUD 增刪改查 Create: 新增 Retrieve: 檢索 Update: 更新 Delete: 刪除

NOTESDBADAPTER.JAVA ( 檢索) public class NotesDbAdapter { …. public static final String KEY_ROWID = "_id"; public static final String KEY_NOTE = "note"; public static final String KEY_CREATED = "creatred"; String[] strCols = new String[] {KEY_ROWID,KEY_NOTE,KEY_CREATED}; public Cursor getall(){ return db.query(DATABASE_TABLE, //查詢的資料表名稱 strCols, //查詢的資料表欄位 null, //WHERE語句 null, // WHERE語句的參數 null, //GROUP BY語句 null, //HAVING語句 null); //排序語句 } 這是是查詢全部的資料,所以只需要資料表名稱和所有欄位,其他皆不需要(null)。

NOTESDBADAPTER.JAVA ( 新增) public class NotesDbAdapter { …. public long create(String Note){ Date now = new Date(); ContentValues args = new ContentValues(); args.put(KEY_NOTE, Note); args.put(KEY_CREATED, now.getTime()); return db.insert(DATABASE_TABLE, null, args); } 內容值類別 用put方法將一對(識別符號,內容值)放進ContentValues

NOTESDBADAPTER.JAVA ( 新增) public class NotesDbAdapter { …. public long create(String Note){ Date now = new Date(); ContentValues args = new ContentValues(); args.put(KEY_NOTE, Note); args.put(KEY_CREATED, now.getTime()); return db.insert(DATABASE_TABLE, null, args); } 建立現在時間,並填入created欄位

NOTESDBADAPTER.JAVA ( 新增) public class NotesDbAdapter { …. public long create(String Note){ Date now = new Date(); ContentValues args = new ContentValues(); args.put(KEY_NOTE, Note); args.put(KEY_CREATED, now.getTime()); return db.insert(DATABASE_TABLE, //資料表名稱 null, args); //內容值 } 相當於SQL語法的INSERT INTO notes VALUES (字串,現在時間) Insert方法可以插入資料條目

NOTESDBADAPTER.JAVA ( 刪除) public class NotesDbAdapter { …. public boolean delete(long rowId){ return db.delete(DATABASE_TABLE, //資料表名稱 KEY_ROWID + “=” + rowId, //WHERE語句 null)>0; //WHERE語句的參數 } 如果找不到這筆資料id,刪除失敗,回傳0 相當於SQL語句DELETE FROM notes WHERE _id=rowId

DUMMYNOTE.JAVA ( 新增, 刪除) public class DummyNote extends ListActivity { …. protected static final int MENU_INSERT = Menu.FIRST; protected static final int MENU_DELETE = Menu.FIRST+1; public boolean onCreateOptionsMenu(Menu menu){ menu.add(0,MENU_INSERT,0,"新增"); menu.add(0,MENU_DELETE,0,"刪除"); return super.onCreateOptionsMenu(menu); } 建立一個menu選單,有新增和刪除兩個選項

DUMMYNOTE.JAVA ( 新增, 刪除) 新增一筆資料,並呼叫fillData()更新列表檢視畫面 public class DummyNote extends ListActivity { private int mNoteNumber =1; …. public boolean onOptionsItemSelected(MenuItem item){ switch(item.getItemId()){ case MENU_INSERT: String noteName = "Note " + mNoteNumber++; mDbHelper.create(noteName); fillData(); case MENU_DELETE: mDbHelper.delete(getListView().getSelectedItemId()); } return super.onOptionsItemSelected(item);

DUMMYNOTE.JAVA ( 新增, 刪除) 刪除一筆資料,並呼叫fillData()更新列表檢視畫面 public class DummyNote extends ListActivity { private int mNoteNumber =1; …. public boolean onOptionsItemSelected(MenuItem item){ switch(item.getItemId()){ case MENU_INSERT: String noteName = "Note " + mNoteNumber++; mDbHelper.create(noteName); fillData(); case MENU_DELETE: mDbHelper.delete(getListView().getSelectedItemId()); } return super.onOptionsItemSelected(item);

NOTESDBADAPTER.JAVA ( 查詢單筆條目) public class NotesDbAdapter { …. public Cursor get(long rowId) throws SQLException{ Cursor mCursor = db.query(true,DATABASE_TABLE, new String[] {KEY_ROWID,KEY_NOTE,KEY_CREATED}, KEY_ROWID+"="+rowId, null,null,null,null,null); if(mCursor != null) mCursor.moveToFirst(); return mCursor; } 查詢單筆資料需要條件 如果指針存在的話,就把指針移到查詢到的第一筆條目上。

NOTESDBADAPTER.JAVA ( 修改) public class NotesDbAdapter { …. public boolean update(long rowId,String note){ ContentValues args = new ContentValues(); args.put(KEY_NOTE, note); return db.update(DATABASE_TABLE, //資料表名稱 args, //新的內容值 KEY_ROWID+“=”+rowId, //WHERE語句 null)>0; } update()可以更新資料條目。 沒有修改到條目會回傳false