Android資料庫處理 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

第2章  Android应用的界面编程.
實驗五:多媒體播放器選單介面.
Part 2 開發Android應用程式的流程
Android + Web Service 建國科技大學 資管系 饒瑞佶 2017/3 V1.
ArrayAdapter & Spinner
手持式裝置之隨身照護應用 Android開發環境設定 鐘國家 老師.
手持式裝置之隨身照護應用 Android開發環境設定 鐘國家 老師.
建立Android新專案 建國科技大學 資管系 饒瑞佶 2010/10.
厦门大学数据库实验室 报告人:谢荣东 导师:林子雨 2014年8月30日
第7章 Android文件与本地数据库(SQLite)
Chapter 13 Android 實戰演練.
Android + JUnit 單元測試 建國科技大學資管系 饒瑞佶 2012/8/19V4.
LINQ 建國科技大學 資管系 饒瑞佶.
Ch06 再談選單元件 物件導向系統實務.
PHP與SQL語法存取MySQL SQL
JAVA vs. SQL Server 建國科技大學 資管系 饒瑞佶 2013/4 V1.
使用Android控制Arduino 史先强
Android資料庫處理 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
高等資料庫管理系統 Advanced Database Management System
資料庫安全 (Database Security)
第一个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
Android基本程式設計 建國科技大學 資管系 饒瑞佶.
Chapter 6 進階UI設計.
ContentProvider與資料共享
ANDROID PROGRAMMING2.
CH7 佈局、按鈕與文字編輯元件.
Android + Service 建國科技大學 資管系 饒瑞佶.
第10章 儲存偏好設定、檔案與資料庫 10-1 存取偏好設定 10-2 檔案存取 10-3 關聯式資料庫與SQLite
實驗十四:顯示與控制地圖.
建立Android新專案 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
Android App簡介及 App Inventor 2體驗 靜宜大學資管系 楊子青
Java 程式設計 講師:FrankLin.
Android檔案處理 建國科技大學 資管系 饒瑞佶 2010/10.
生活智慧王 樹德科技大學 資訊工程系 指導教授 : 陳毓璋 教授 小組成員: 劉上緯 翁維廷 洪文財.
第一單元 建立java 程式.
實驗十一:待辦事項程式 (儲存在手機上).
主编:钟元生 赵圣鲁.
Ch20. 計算器 (Mac 版本).
第11章 ListView延迟加载效果 授课老师:高成珍 QQ号: QQ群: 、
Pocket Access.
網頁程式概論 建國科技大學資管系 饒瑞佶 2015/9 V1 2016/4 V2 2016/9 V3.
3.2 Mysql 命令行 1 查看数据库 SHOW DATABASES; 2 创建一个数据库test1 CREATE DATABASE test1; 3 选择你所创建的数据库 USE test1; (按回车键出现Database changed 时说明操作成功!) 4 查看现在的数据库中存在什么表.
Chapter 5 Basic UI Design.
讓Emulator可以 使用Android Market
Android視窗介面 建國科技大學 資管系 饒瑞佶 2010/10.
實驗九:延續實驗八, 製作一個完整音樂播放器
Location Based Services - LBS
SQL查询语句 蔡海洋.
Android WebService Android智慧型手機程式設計 建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
選單.
GridView.
GridView操作 (II).
智慧型手機程式設計 建國科技大學資管系 饒瑞佶 2011年(992).
Android視窗介面 建國科技大學 資管系 饒瑞佶 2010/10.
Android WebService Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
進階UI元件:ListView元件以及複選 靜宜大學資管系 楊子青
RecyclerView and CardView
Android Speech To Text(STT)
Activity的生命週期: 播放音樂與影片 靜宜大學資管系 楊子青
用Intent啟動程式中的其他Activity、運用WebView顯示網頁 靜宜大學資管系 楊子青
多國語系 建國科技大學 資管系 饒瑞佶.
SQLite資料庫 靜宜大學資管系 楊子青.
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
Presentation transcript:

Android資料庫處理 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1

Android資料庫-SQLite 資料庫 SQLite 檔案式資料庫 適合嵌入式系統,不需要額外安裝系統 OPEN SOURCE資料庫 SQL指令與一般DBMS大同小異,但有些微差異

adb shell + sqlite3+SQL指令 Android 結構1 資料 class DatabaseHelper extends SQLiteOpenHelper 結構2 SQL指令 資料 adb shell + sqlite3+SQL指令

adb shell + sqlite3 提醒…這也只是其中一種方法

SQLite操作-adb shell 沒有AVD或是手機 沒有連線的device

SQLite操作-adb shell 先用android list avd 看可以用的AVD 可用的AVD

SQLite操作-adb shell 再使用emulator –avd <AVD名稱> 啟動一個AVD 例如:emulator –avd my_avd –sdcard img檔位置 啟動中的my_avd 記得要有sdcard

SQLite操作-adb shell my_avd模擬器

SQLite操作-adb shell 再次執行adb shell,就可以看到#提示符號 #提示符號

SQLite操作-adb shell 建議進入sdcard或mnt\sdcard內建立目錄存放資料庫 進入sdcard 在sdcard內建立mydb目錄 進入mydb目錄

SQLite操作-adb shell 請在#提示符號後輸入sqlite3 <資料庫名稱> 例如sqlite3 db1

SQLite操作-adb shell 離開是.quit (注意有一個.) 現在可以開始操作db1資料庫 使用SQL指令進行操作,包括: 建立欄位與資料表(結構部分) 建立資料(資料部分) 維護資料(資料部分)

SQLite結構相關SQL指令 不分大小寫

SQL指令-結構操作 create table:建立資料表 藍色是要填資料的部分,其它是固定語法 所有SQL指令都要以;結束 create table member( id char(20) not null, name char(20) not null, pwd char(20) not null, age int, PRIMARY KEY(id) ); create table資料表名稱 ( 欄位1 資料型態, 欄位2 資料型態, …. );

SQL指令-結構操作 .tables:可以查看目前資料庫內存在的資料表 .help:可以看sqlite3所有指令 沒有任何資料表

SQL指令-結構操作 create table:建立資料表 member資料表已經被建立

SQL指令-結構操作 .schema:查看資料表結構 member資料表結構

SQL指令-結構操作 alter table:更改資料表結構 增加欄位 更改資料表名稱 drop table:刪除資料表 alter table資料表名稱 add 欄位1 資料型態; 更改資料表名稱 alter table資料表名稱 rename to 新資料表名稱; drop table:刪除資料表 drop table資料表名稱;

SQLite資料相關SQL指令

SQL指令-資料操作 insert:新增資料 所有資料都要加上單引號 insert into 資料表名稱 (欄位1,欄位2…) values (‘資料1’,’資料2’…); Insert into member (id,name,pwd,age) values ('A123','小叮噹','1111',20); 已在member資料表中新增一筆資料

SQL指令-資料操作 Select:篩選資料 select 欄位s from資料表名稱 where 條件; 加入where條件 Select * from member; 加入where條件

SQL指令-資料操作 update:更新資料 update 資料表名稱 set 欄位=‘新值’… where 條件; 姓名改成大寶 update member set name=‘大寶' where id='A123'; 姓名改成大寶

SQL指令-資料操作 delete:刪除資料 Delete from 資料表名稱 where 條件; 先新增一筆資料 刪除剛新增的資料 delete from member where id='A123'; 先新增一筆資料 刪除剛新增的資料

SQL指令-結構操作 SQLite沒有刪除欄位的指令,例如 ALTER TABLE DROP COLUMN 那怎麼辦?

SQL指令-結構操作 新增一個備份資料庫member_backup 將資料從member搬到member_backup 刪除member 完成

更多SQLite SQL指令 http://www.newobjects.com/pages/ndl/SQLite3/sql.htm#ALTER TABLE

SQLite+Android By SQLiteOpenHelper

SQLite+Android 建立新專案-HelloDB

Android+SQLite使用方式 引用class SQLiteOpenHelper 建立SQLiteOpenHelper 物件 透過SQLiteOpenHelper 物件建立database物件 透過database物件存取資料 記得要開android.permission.WRITE_EXTERNAL_STORAGE

SQLiteOpenHelper運作架構 與APK建立在一起 class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context) { super(context, “db2.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE_TABLE); //新增資料表 public void onUpgrade(SQLiteDatabase db, int oldV, int newV) { 只有在資料庫不存在時才執行 只有在DatabaseHelper此建構子有執行時才執行 資料庫版本有更新時才執行

SQLite+Android 首先,在主程式中加入SQLiteOpenHelper結構 必要的class 建立db2.db資料庫 資料庫第一次建立時會執行onCreate 資料庫異動版本時會執行onUpgrade

SQLite+Android SQLiteOpenHelper結構 // SQLite資料庫使用必要class ------------------------ String DATABASE_TABLE = "member"; String DATABASE_CREATE_TABLE = "create table " + DATABASE_TABLE + "(_id char(20), name, pwd, age, primary key(_id));"; class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context) { super(context, "/sdcard/db2.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { public void onUpgrade(SQLiteDatabase db, int oldV, int newV) { 如果要建立到sdcard

SQLite+Android 從class HelloDB呼叫DatabaseHelper建立資料庫 建立DatabaseHelper物件 呼叫建立db2.db資料庫

code DatabaseHelper dbHelper; SQLiteDatabase db; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_db); dbHelper=new DatabaseHelper(this); db=dbHelper.getWritableDatabase(); }

SQLite+Android 資料庫被建立在data/data/com.android.hellodb

SQLite+Android 資料庫被建立在data/data/com.android.hellodb

SQLite+Android 有資料庫後,下一步要建立資料 新增資料 定義資料表結構 建立資料表

建立資料 String cmd="insert into " + DATABASE_TABLE + " (_id,name,pwd,age) values ('c123','小黑','ccc',12)"; db.execSQL(cmd);

SQLite+Android 為何會錯誤? 跟執行流程或 資料庫設定有關!

SQLite+Android 幾點注意! 1.下面這段只有在資料庫第一次被建立時才會進行,所以如果資料庫已經存在,那就不會建立資料表,當然也就不能寫入資料 上張投影片的錯誤就是因為我們已經先建立db2.db,因此再次執行程式時,並不會建立資料表,導致下面程式出錯

SQLite+Android 正常執行結果 資料庫 資料表 資料 中文資料有亂碼

到此為止,同樣的程式再執行一次會出現錯誤,WHY?

SQLite+Android 最後,可以進行資料查詢 再新增一筆資料(小黑) SQL查詢指令 資料移動到第一筆 顯示資料

String cmd_select="select. from " + DATABASE_TABLE; Cursor c=db String cmd_select="select * from " + DATABASE_TABLE; Cursor c=db.rawQuery(cmd_select, null); c.moveToNext(); String data=""; for(int i=1;i<=c.getCount();i++){ for(int j=1;j<=c.getColumnCount();j++){ data +=c.getString(j-1); } data +="\n"; new AlertDialog.Builder(HelloDB.this) .setTitle("data") .setMessage(data) .setPositiveButton("確認",new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub }) .show();

SQLite+Android 實際顯示沒有亂碼

小練習 使用上述課程member資料表 設計一個登入畫面,可以讓使用者輸入帳號與密碼 輸入完成後按下「確認」按鈕後,連回資料庫內的member 資料表進行確認(id與pwd欄位) 輸入正確者跳至下一個頁面(自訂),錯誤者請跳出訊息提示框

透過ListView顯示資料庫資料

透過ListView顯示資料 整個版面都用ListActivity 刪除

透過ListView顯示資料 ArrayAdapter 陣列資料

透過ListView顯示資料 setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,mStrings)); getListView().setTextFilterEnabled(true); 陣列資料 private static final String[] mStrings = new String[] { "大餅包小餅", "蚵仔煎", "東山鴨頭", "臭豆腐", "潤餅", "豆花", "青蛙下蛋","豬血糕", "大腸包小腸", "鹹水雞", "烤香腸","車輪餅","珍珠奶茶","鹹酥雞","大熱狗", "炸雞排","山豬肉","花生冰","剉冰","水果冰", "包心粉圓","排骨酥","沙茶魷魚","章魚燒","度小月", "aaa","abc","bbb","bcd","123" };

透過ListView顯示資料 選了怎麼不會勾選?

透過ListView顯示資料 ListView勾選效果 加入: ListView lv = this.getListView(); lv.setChoiceMode( ListView.CHOICE_MODE_SINGLE ); 修改:android.R.layout.simple_list_item_checked ListView勾選效果

透過ListView顯示資料 偵測選擇資料

Object o=this. getListAdapter(). getItem(position); String keyword=o Object o=this.getListAdapter().getItem(position); String keyword=o.toString(); Toast.makeText(HelloDB.this, "choose:" + keyword, Toast.LENGTH_SHORT).show();

透過ListView顯示資資料

把資料庫與ListView合起來 方法一

把資料庫與ListView合起來

把資料庫與ListView合起來 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); dbHelper=new DatabaseHelper(this); db=dbHelper.getWritableDatabase(); String cmd_select="select * from " + DATABASE_TABLE; Cursor c=db.rawQuery(cmd_select, null); c.moveToNext(); //取得資料後放到陣列mStrings String[] mStrings = new String[c.getCount()]; for(int i=1;i<=c.getCount();i++){ mStrings[i-1]=new String(c.getString(1)); } //顯示資料 setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,mStrings));

透過ListView顯示資料 假設是在Activity中除了ListView之外,還要放入其他的組件時,這時候就需要在Activity中加入一個ListView物件,利用這個組件的setAdapter來連接Adapter

透過ListView顯示資料 main.xml版面 ListView物件的id

透過ListView顯示資料 不改 陣列資料

透過ListView顯示資料 偵測選擇資料 如果是顯示兩個欄位以上資料 Cursor c = (Cursor) arg0.getItemAtPosition(position); String tableValue = c.getString(0);

CODE list.setOnItemClickListener(new OnItemClickListener(){ public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub String keyword=list.getItemAtPosition(arg2).toString(); Toast.makeText(MyDB_ListView.this, "choose:" + keyword, Toast.LENGTH_SHORT).show(); } });

透過ListView顯示資料 ArrayAdapter中有一個android定義好的內建list樣式 - “android.R.layout.simple_list_item_1”,其它樣式如下所列: android.R.layout.simple_list_item_1:一行text android.R.layout.simple_list_item_2:一行text較大,一行text較小 android.R.layout.simple_list_item_single_choice:單選 android.R.layout.simple_list_item_multiple_choice:多選按鈕 android.R.layout.simple_list_item_checked:勾選盒 第1個剛剛有用了,事實上第3,4,5個也是直接換上去就可以看到了。 第2個android.R.layout.simple_list_item_2就比較麻煩,原因是ArrayAdapter並不支援傳入兩個字串參數值,所以要改用SimpleAdapter,而且傳入的數值型態要改為ArrayList才可以 要加上list.setChoiceMode( ListView.CHOICE_MODE_SINGLE ); 選擇才會有變色

透過ListView顯示資料- SimpleAdapter ArrayList SimpleAdapter

透過ListView顯示資料- SimpleAdapter 陣列資料

code @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 將資料放入陣列 for(int i=0;i<mPlaces.length;i++){ HashMap<String,String> item=new HashMap<String,String>(); item.put("food",mFoods[i]); item.put("place",mPlaces[i]); list.add(item); } //設定顯示的資料 SimpleAdapter adapter=new SimpleAdapter(this, list, android.R.layout.simple_list_item_2, new String[]{"food","place"}, new int[]{android.R.id.text1,android.R.id.text2}); //顯示資料 setListAdapter(adapter);

透過ListView顯示資料- SimpleAdapter 陣列資料 private static final String[] mPlaces = new String[] { "台北市", "新北市", "台南市", "高雄市", "苗粟縣", "台北市", "新北市", "789", "cde", "abc" }; private static final String[] mFoods = new String[] { "大餅包小餅", "蚵仔煎", "東山鴨頭", "臭豆腐", "潤餅", "豆花", "青蛙下蛋","豬血糕", "大腸包小腸", "鹹水雞", "烤香腸","車輪餅","珍珠奶茶","鹹酥雞","大熱狗", "炸雞排","山豬肉","花生冰","剉冰","水果冰", "包心粉圓","排骨酥","沙茶魷魚","章魚燒","度小月", "aaa","abc","bbb","bcd","123"

透過ListView顯示資料- SimpleAdapter

透過ListView顯示資料- SimpleAdapter 偵測選擇資料 偵測選擇資料

code @Override protected void onListItemClick(ListView l, View v, int position, long id) { // TODO Auto-generated method stub super.onListItemClick(l, v, position, id); String keyword=((HashMap)l.getItemAtPosition(position)).get("place").toString(); Toast.makeText(SimpleAdap.this, "choose:" + keyword, Toast.LENGTH_SHORT).show(); }

透過ListView顯示資料-自訂版面 如果不要用android內建的simple_list_item_2,改用自己定義的樣式,要怎麼作呢?像上面的範例,再加上一個評分的字串在地點的旁邊。 首先先製作一個專用的layout,取名為mylistview.xml。

透過ListView顯示資料-自訂版面 mylistview.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="fill_parent" android:orientation="vertical"> <TextView android:text="TextView" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="6dip" android:layout_marginTop="6dip" android:textAppearance="?android:attr/textAppearanceLarge"> </TextView> <LinearLayout android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/linearLayout1" android:orientation="horizontal"> <TextView android:id="@+id/textView2" android:text="TextView" android:layout_height="wrap_content" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall"> </TextView> <TextView android:text="TextView" android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:layout_marginLeft="6dip"> </TextView> </LinearLayout>

透過ListView顯示資料-自訂版面 第二個LinearLayout要設定成horizontal

透過ListView顯示資料-自訂版面 三個改變的地方

code @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 將資料放入陣列 for(int i=0;i<mPlaces.length;i++){ HashMap<String,String> item=new HashMap<String,String>(); item.put("food",mFoods[i]); item.put("place",mPlaces[i]); item.put("rating",mRatings[i]); list.add(item); } //設定顯示的資料 SimpleAdapter adapter=new SimpleAdapter(this, list, R.layout.mylistview, new String[]{"food","place","rating"}, new int[]{R.id.textView1,R.id.textView2,R.id.textView3}); //顯示資料 setListAdapter(adapter);

透過ListView顯示資料-自訂版面 陣列資料 private static final String[] mRatings = new String[] { "1", "2", "4", "3", "5", "3", "2", "4", "1", "1", "3", "3", "3", "1", "3", "3", "5", "2", "5", "2", "5", "3", "1", "2", "2", "2", "3", "1", "2", "3" };

透過ListView顯示資料-自訂版面

透過ListView顯示資料-加入圖片 最後加入圖 片到ListView吧 圖片需要先放到res/drawable-xxxx目錄中(這裡放到res/drawable-hdpi中) 因為HashMap的value部份需要用到圖片,是一個int的型態,所以HashMap的value部份需要改為Object,才能容得下int和string的類型。 修改mylistview.xml,加上圖片在標題的左邊

透過ListView顯示資料-加入圖片 再加入LinearLayout與ImageView LinearLayout要設定成horizontal

透過ListView顯示資料-加入圖片 三個修改的地方

透過ListView顯示資料-加入圖片 陣列資料 private static final int[] mPics=new int[]{ R.drawable.pic1,R.drawable.pic2,R.drawable.pic3, R.drawable.pic4,R.drawable.pic5, R.drawable.pic1,R.drawable.pic2,R.drawable.pic3, R.drawable.pic4,R.drawable.pic5 };

透過ListView顯示資料-加入圖片 陣列資料

ListView + 資料庫 方法二(有限制)

透過ListView顯示資料庫資料 原程式,用Toast顯示資料 用ListView取代這裡

透過ListView顯示資料庫資料 注意資料表內需要有個_id的主鍵欄位 注意使用ListView顯示資料,需要修改extends Activity變成ListActivity 需刪掉setContentView(R.layout.main);

透過ListView顯示資料庫資料 String[] from = new String[]{"name","pwd","_id"}; //一定要有_id才行 int[] to = new int[]{android.R.id.text1}; Cursor c1 = db.query("member", from, null, null, null, null, "_id ASC"); startManagingCursor(c1); //多資料欄位 ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout. two_line_list_item,c1, new String[] {"name","pwd"}, new int[] {android.R.id.text1, android.R.id.text2 }); setListAdapter(adapter);

透過ListView顯示資料庫資料

透過ListView顯示資料庫資料 原來是 two_line_list_item 兩列字體大小不同 改這個屬性

透過ListView顯示資料庫資料

透過ListView顯示資料庫資料 直接顯示資料 偵測選擇資料

透過ListView顯示資料庫資料 偵測選擇資料 @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); // Get the item that was clicked //直接顯示資料 Cursor cursor = (Cursor)this.getListAdapter().getItem(position); String keyword =cursor.getString(cursor.getColumnIndex("_id")); Toast.makeText(this, "您選擇了: " + keyword, Toast.LENGTH_LONG) .show(); }

透過ListView顯示資料庫資料 透過另一頁(DataDetails)顯示資料 注意要加入<activity android:name="DataDetails"></activity> 傳送資料

透過ListView顯示資料庫資料 透過另一頁(DataDetails)顯示資料 注意要加入<activity android:name="DataDetails"></activity> @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); // Get the item that was clicked //* 跳頁顯示資料 Intent intent = new Intent(this, DataDetails.class); Cursor cursor = (Cursor)this.getListAdapter().getItem(position); intent.putExtra("EMPLOYEE_ID", cursor.getInt(cursor.getColumnIndex("_id"))); startActivity(intent); }

透過ListView顯示資料庫資料 DataDetails.java 接收資料

CODE @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.details); employeeID=getIntent().getIntExtra("EMPLOYEE_ID", 0); Toast.makeText(this, "您選擇了:"+ employeeID, Toast.LENGTH_LONG).show(); }

資料刪修 新增/修改/刪除

新增 加入版面 main1.xml

新增 動態SQL指令 EditText 跳回顯示頁面

新增 dbHelper = new DatabaseHelper(this); db = dbHelper.getWritableDatabase(); tv1=(EditText)findViewById(R.id.editText1); tv2=(EditText)findViewById(R.id.editText2); tv3=(EditText)findViewById(R.id.editText3); tv4=(EditText)findViewById(R.id.editText4); bt1=(Button)findViewById(R.id.button1); /* 新增的Button */ bt1.setOnClickListener(new Button.OnClickListener(){ public void onClick(View v) { String cmd="insert into member (_id, name, pwd, age) values ('" + tv1.getText() + "','" + tv3.getText() + "','" + tv2.getText() + "'," + tv4.getText() + ");"; db.execSQL(cmd); // 執行SQL指令,進行資料新增 Toast.makeText(NewData.this, "資料新增完成", Toast.LENGTH_LONG).show(); Intent it1=new Intent(); it1.setClass(NewData.this, ListViewDB.class); startActivity(it1); NewData.this.finish(); } });

修改 加入版面 main.xml

修改 I 先取得要修改的資料 將查到的資料填入輸入框

修改 II

修改 dbHelper = new DatabaseHelper(this); db = dbHelper.getWritableDatabase(); tv1=(EditText)findViewById(R.id.editText1); tv2=(EditText)findViewById(R.id.editText2); tv3=(EditText)findViewById(R.id.editText3); bt1=(Button)findViewById(R.id.button1); mID = this.getIntent().getExtras().getString("EMPLOYEE_ID"); // 查詢資料 String cmd_select="select * from member where _id='" + mID + "';"; //Toast.makeText(DataDetails.this, cmd_select, Toast.LENGTH_LONG).show(); Cursor c = db.rawQuery(cmd_select, null); // 執行SQL指令,進行資料查詢 if(c.moveToFirst()){ //有資料才顯示 tv1.setText(c.getString(2)); //密碼 tv2.setText(c.getString(c.getColumnIndex("name"))); //姓名 tv3.setText(String.valueOf(c.getInt(c.getColumnIndex("age")))); //年齡 //c.close(); }else{ Toast.makeText(DataDetails.this, "找不到任何資料", Toast.LENGTH_LONG).show(); return; } /* 修改的Button */ bt1.setOnClickListener(new Button.OnClickListener(){ public void onClick(View v) { String cmd="update member set name='" + tv2.getText() + "',pwd='" + tv1.getText() + "',age=" + tv3.getText() + " where _id='" + mID + "';"; db.execSQL(cmd); // 執行SQL指令,進行資料修改 Toast.makeText(DataDetails.this, "資料修改完成", Toast.LENGTH_LONG).show(); });

小迷思 應改成cursor.getString,否則將取不到值 接收端: mID = this.getIntent().getExtras().getString("EMPLOYEE_ID");

刪除 /* 刪除的Button */ bt2.setOnClickListener(new Button.OnClickListener(){ public void onClick(View v) { db.delete("member", "_id='" + mID + "'", null); Toast.makeText(DataDetails.this, "資料刪除完成", Toast.LENGTH_LONG).show(); } });

選 單 使用手機硬體上的MENU鍵進行呼叫顯示 建立選單 處理選項動作 onCreateOptionsMenu onOptionsItemSelected

選單基本結構 建立選單 onCreateOptionsMenu 處理選項動作 onOptionsItemSelected

加入選單選項 加入選項 menu.add(0, 識別符號, 0, 顯示文字) menu.add(0, MENU_ABOUT, 0, "關於BMI").setIcon(android.R.drawable.ic_menu_help); menu.add(0, MENU_QUIT, 0, "結束BMI").setIcon(android.R.drawable.ic_menu_close_clear_cancel);

選 單

處理選項動作 處理選項動作 onOptionsItemSelected

protected static final int MENU_ABOUT=Menu.FIRST; protected static final int MENU_QUIT=Menu.FIRST+1; @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub menu.add(0, MENU_ABOUT, 0, "關於BMI").setIcon(android.R.drawable.ic_menu_help); menu.add(0, MENU_QUIT, 0, "結束BMI").setIcon(android.R.drawable.ic_menu_close_clear_cancel); return super.onCreateOptionsMenu(menu); } public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case MENU_ABOUT: break; case MENU_QUIT: return super.onOptionsItemSelected(item);

小練習 在DataDetails上設計四個TextView物件 透過傳進來的EMPLOYEE_ID,再到資料庫查詢詳細資料,將其顯示到上面四個TextView中

預告 怎麼連結外部DB 透過WebService 透過HttpPost或HttpGet

資料庫補充

SQLite Manager 透過它的介面管理SQLite

SQLite Manager FireFox外掛 直接點選安裝 https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/ 直接點選安裝

SQLite Manager 直接開啟SQLIte database 有UI介面比較好操作

SQLite Manager 實體手機可以開啟USB連結模式,透過外接碟模式被開啟 AVD內的資料庫可以透過adb pull拉出,設定後再用adb push存回,或使用ddms來完成

動態SQL指令 撰寫動態SQL指令的步驟

動態SQL指令 全部都從基本指令開始 欄位型態是文字或日期,對應的值要加單引號 注意空白 不分大小寫 新增 刪除 修改 查詢 Insert into 資料表 (欄位s) values (值s) 刪除 delete from 資料表 where 條件 修改 update 資料表 set 欄位s=新值s where 條件 查詢 select 欄位 from 資料表 [where 條件]

動態SQL指令 用假資料先寫出正確的SQL指令 對不對,問SQLite 用程式取代假資料 用雙引號將程式與原SQL指令切開 用加號將切開位置串起來 把最後完成的結果貼回程式內

動態SQL指令 用假資料先寫出正確的SQL指令 update member set name=‘aaa’,age=55 where _id =‘A123’ 用程式取代假資料 update member set name=‘name.getText()’,age=age.getText() where _id =‘get_id’ 用雙引號將程式與原SQL指令切開 update member set name=‘”name.getText()”’,age=“age.getText() “ where _id =‘”get_id”’ 用加號將切開位置串起來 update member set name=‘” + name.getText() + ”’,age=“ + age.getText() + “ where _id =‘” + get_id + ”’

動態SQL指令 用假資料先寫出正確的SQL指令 Select * from member where _id =‘A123’ 用程式取代假資料 Select * from member where _id=‘get_id’ 用雙引號將程式與原SQL指令切開 Select * from member where _id=‘” get_id ”%’ 用加號將切開位置串起來 Select * from member where _id=‘” + get_id + ”’