ANDROID PROGRAMMING2
Jan 17, 2016
ANDROID PROGRAMMING2
OUTLINE
加入新 Activity AndroidManifest.xml Activity 間的資料傳送 Intent SQLite 資料庫
加入新 ACTIVITY
一個 java 檔對應一個 xml 檔
Report.javaReport.java Report.xmlReport.xml
加入新 ACTIVITY: REPORT.XML Like main.xml
加入新 ACTIVITY: REPORT.JAVA
INTENT
加入新 Activity: 修改原 Activity
建立 Intent 實體
加入新 Activity: 修改原 Activity
setClass( 原 Activity, 新Activity)
加入新 Activity: 修改原 Activity
AndroidManifest.xml 是一個用來描述 Android 應用程式「整體資訊」的設定檔。可以向 Android 系統介紹我們的 Android 應用程式,以便讓 Android 系統完整地了解我們的應用程式資訊。
ANDROIDMANIFEST.XML
ANDROIDMANIFEST.XML程式進入點
ANDROIDMANIFEST.XML
版本
ANDROIDMANIFEST.XML Application 標籤 :定義應用程式用到的Activity 、服務資訊
ANDROIDMANIFEST.XML這個 Activity 所對應的類別com.demo.android.bmi.B
mi
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
現成的 Intent Ex. 開啟網頁
自訂的 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) 、定義資料格式(CREATE TABLE) 等。
DATABASEHELPER
繼承 SQLiteOpenHelper
協助我們 : 建立資料表 管理資料表
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: 建構子 )
物件,可以控制資料庫的開啟和關閉
做複雜的查詢,一般用不到
傳入資料庫名稱
傳入資料庫版本
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);
}
}
}
NOTESDBADAPTER.JAVA( DATABASEHELPER: ONCREATE() )
建立一個名為 notes 的資料表。資料表中有四個欄位, _id 欄位會自動計數, note 欄位儲存文字型態, created和 modified 欄位儲存數字型態。
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);
}
}
}
NOTESDBADAPTER.JAVA( DATABASEHELPER: ONCREATE() )
傳入 SQL 語句
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( DATABASEHELPER: ONUPGRADE() )
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( 建構子 )
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( OPEN() )
準備好一個相對應的資料庫給我們使用
public class NotesDbAdapter {
….
public void close(){
dbHelper.close();
}
}
NOTESDBADAPTER.JAVA( CLOSE() )
停止對資料的存取
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);
}
}
DUMMYNOTE.JAVA
在主程式中透過 open() 打開資料庫
public class NotesDbAdapter {
….
public Cursor getall(){
return db.rawQuery("SELECT * FROM notes", null);
}
}
NOTESDBADAPTER.JAVA( 加入查詢 )
rawQuery 可以執行SQL 語法,傳回一個指針 (Cursor) 。指針 (Cursor) 類別是用來存取查詢的結果,程式需要資料表時再透過指針來存取。
SQL 語法 (SELECT 欄位 FROM 資料表 ) 。從 notes 資料表中選擇全部資料。
public class DummyNote extends ListActivity {
private NotesDbAdapter mDbHelper;
private Cursor mNotesCursor;
….
private void fillData(){
mNotesCursor = mDbHelper.getall();
startManagingCursor(mNotesCursor);
….
}
}
DUMMYNOTE.JAVA( 與列表聯繫 )
返回能查詢資料表所有的資料的指針,儲存到 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);
}}
將接口和ListView連接
從資料表端的 note 欄位 (from)映射到android.R.layout.simple_list_item_1每一列描述格式中的text1 欄位 (to) 裡
CRUD 增刪改查 Create: 新增 Retrieve: 檢索 Update: 更新 Delete: 刪除
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( 檢索 )
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( 新增 , 刪除 )
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);
}
}
新增一筆資料,並呼叫 fillData()更新列表檢視畫面
DUMMYNOTE.JAVA( 新增 , 刪除 )
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);
}
}
刪除一筆資料,並呼叫 fillData()更新列表檢視畫面
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