Presentation is loading. Please wait.

Presentation is loading. Please wait.

ANDROID PROGRAMMING2.

Similar presentations


Presentation on theme: "ANDROID PROGRAMMING2."— Presentation transcript:

1 ANDROID PROGRAMMING2

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

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

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

5 加入新ACTIVITY: REPORT.JAVA

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

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

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

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

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

11 ANDROIDMANIFEST.XML 程式進入點

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

13 定義應用程式用到的Activity、服務資訊
ANDROIDMANIFEST.XML Application標籤: 定義應用程式用到的Activity、服務資訊 「application」標籤裡面,定義了所有這個應用程式用到的 Activity、服務等資訊。 「res/drawable/icon」 中。

14 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」的簡寫。

15 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的應用程式列表

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

31 (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 建構子 傳入資料庫版本

32 ( 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語句。

33 ( 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語句。

34 ( 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的動作。 缺點:更新後原本儲存進資料表的資料都會被刪除。 重新建立資料表

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

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

37 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方法建立一個, 若已存在就根據資料庫版本來決定是否要更新資料庫。

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

39 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()打開資料庫

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

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

42 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連接

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

44 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)。

45 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

46 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欄位

47 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方法可以插入資料條目

48 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

49 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選單,有新增和刪除兩個選項

50 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);

51 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);

52 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; } 查詢單筆資料需要條件 如果指針存在的話,就把指針移到查詢到的第一筆條目上。

53 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


Download ppt "ANDROID PROGRAMMING2."

Similar presentations


Ads by Google