530 likes | 687 Views
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. 加入新 Activity: 修改原 Activity. 建立 Intent 實體.
E N D
OUTLINE • 加入新Activity • AndroidManifest.xml • Activity間的資料傳送 • Intent • SQLite資料庫
加入新ACTIVITY • 一個java檔對應一個xml檔 Report.java Report.xml
加入新ACTIVITY: REPORT.XML • Like main.xml
加入新Activity: 修改原Activity 建立Intent實體
加入新Activity: 修改原Activity setClass(原Activity,新Activity)
ANDROIDMANIFEST.XML • AndroidManifest.xml 是一個用來描述 Android 應用程式「整體資訊」的設定檔。可以向 Android 系統介紹我們的 Android 應用程式,以便讓 Android 系統完整地了解我們的應用程式資訊。
ANDROIDMANIFEST.XML 程式進入點
ANDROIDMANIFEST.XML Application標籤: 定義應用程式用到的Activity、服務資訊
ANDROIDMANIFEST.XML 這個 Activity 所對應的類別 com.demo.android.bmi.Bmi
ANDROIDMANIFEST.XML 這個Activity式此應用程式的進入點 此Activity將顯示在Launcher的應用程式列表
ACTIVITY • 獨立的Activity 單純的從一個螢幕跳到下個螢幕,不涉及資料的交換。 • 相依的Activity 從一個螢幕跳到下個螢幕時,攜帶資料供下一個螢幕(Activity)使用
ACTIVITY間資料傳送: 傳遞資料 把要傳送的東西用bundle包起來 將bundle附加在intent上
ACTIVITY間資料傳送: 傳遞資料 取出field_height的值轉成字串 在新的Activity中用KEY_HEIGHT識別符號來存取這個值
ACTIVITY間資料傳送: 接收資料 取得傳來的Intent 取得附加在Intent上的bundle物件
ACTIVITY間資料傳送: 接收資料 透過KEY_HEIGHT識別符號取出存在其中的資料
INTENT • 現成的IntentEx. 開啟網頁 • 自訂的Intent Ex. 切換 Activity、在其間傳遞各式的資料。
INTENT 提供網址給Inten.ACTION_VIEW動作,便會開啟網頁瀏覽器
LIST ACTIVITY • 筆記本程式 • 用一個列表來顯示所有的記事條目 • 增加一筆條目 • 刪除選擇的條目 • 編輯選擇的條目
DUMMYNOTE.JAVA Activity ListActivity
DUMMYNOTE.JAVA 自訂的字串陣列,會透過Adapter以List的形式顯示在螢幕上
DUMMYNOTE.JAVA 將字串陣列傳給他並設定好Adapter
MAIN.XML 在xml檔裡定義ListView元件
MAIN.XML 設定當列表是空的時候(沒有資料)要顯示的內容
SQLITE • 在嵌入式系統中常見的資料庫,所有的資料都存在一個檔案中,便於遷移。 • 占用相對於其他資料庫來的少的記憶體空間 • 使用SQL語句來查詢(SELECT)、新增(INSERT)、修改(UPDATE)、刪除(DELETE)、定義資料格式(CREATETABLE)等。
DATABASEHELPER • 繼承SQLiteOpenHelper • 協助我們: • 建立資料表 • 管理資料表
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); } } } 傳入資料庫名稱 做複雜的查詢,一般用不到 物件,可以控制資料庫的開啟和關閉 傳入資料庫版本
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欄位儲存數字型態。
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語句
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); } } } } 若舊版本存在,就將其移除 重新建立資料表
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; } }
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); //排序語句 } }
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); //內容值 } 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
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()); fillData(); } return super.onOptionsItemSelected(item); } }