android n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Android 資料庫處理 PowerPoint Presentation
Download Presentation
Android 資料庫處理

Loading in 2 Seconds...

play fullscreen
1 / 124

Android 資料庫處理 - PowerPoint PPT Presentation


  • 129 Views
  • Uploaded on

Android 智慧型手機程式設計 程式設計與應用班. Android 資料庫處理. 建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2. Android 資料庫- SQLite. 資料庫 SQLite 檔案式資料庫 適合嵌入式系統,不需要額外安裝系統 OPEN SOURCE 資料庫 SQL 指令與一般 DBMS 大同小異,但有些微差異. SQLite. Android. 結構 1. 資料. class DatabaseHelper extends SQLiteOpenHelper. 結構 2. SQL 指令. 資料.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Android 資料庫處理' - melva


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
android

Android智慧型手機程式設計

程式設計與應用班

Android資料庫處理

建國科技大學 資管系

饒瑞佶

2012/4 V1

2012/8 V2

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

SQLite

Android

結構1

資料

class DatabaseHelper extends SQLiteOpenHelper

結構2

SQL指令

資料

adb shell + sqlite3+SQL指令

sqlite

SQLite管理

adb shell + sqlite3

提醒…這也只是其中一種方法

sqlite adb shell
SQLite操作-adb shell
  • 沒有AVD或是手機

沒有連線的device

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

可用的AVD

sqlite adb shell2
SQLite操作-adb shell
  • 再使用emulator –avd <AVD名稱>啟動一個AVD
  • 例如:emulator –avd my_avd –sdcard img檔位置

啟動中的my_avd

記得要有sdcard

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

#提示符號

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

進入sdcard

在sdcard內建立mydb目錄

進入mydb目錄

sqlite adb shell6
SQLite操作-adb shell
  • 請在#提示符號後輸入sqlite3 <資料庫名稱>
  • 例如sqlite3 db1
  • 如果資料庫不存在會自動建立,可以看到sqlite>提示符號

sqlite>提示符號

sqlite adb shell7
SQLite操作-adb shell
  • 離開是.quit (注意有一個.)
  • 現在可以開始操作db1資料庫
  • 使用SQL指令進行操作,包括:
    • 建立欄位與資料表(結構部分)
    • 建立資料(資料部分)
    • 維護資料(資料部分)
slide14
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 資料型態,
  • ….
  • );
slide15
SQL指令-結構操作
  • .tables:可以查看目前資料庫內存在的資料表
  • .help:可以看sqlite3所有指令

沒有任何資料表

slide16
SQL指令-結構操作
  • create table:建立資料表

member資料表已經被建立

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

member資料表結構

slide18
SQL指令-結構操作
  • alter table:更改資料表結構

增加欄位

  • alter table資料表名稱 add 欄位1 資料型態;

更改資料表名稱

  • alter table資料表名稱 rename to 新資料表名稱;
  • drop table:刪除資料表
  • drop table資料表名稱;
slide20
SQL指令-資料操作
  • insert:新增資料

所有資料都要加上單引號

  • insert into 資料表名稱 (欄位1,欄位2…) values (‘資料1’,’資料2’…);

Insert into member (id,name,pwd,age) values ('A123','小叮噹','1111',20);

已在member資料表中新增一筆資料

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

Select * from member;

加入where條件

slide22
SQL指令-資料操作
  • update:更新資料
  • update 資料表名稱 set 欄位=‘新值’… where條件;

update member set name=‘大寶' where id='A123';

姓名改成大寶

slide23
SQL指令-資料操作
  • delete:刪除資料
  • Delete from 資料表名稱 where條件;

delete from member where id='A123';

先新增一筆資料

刪除剛新增的資料

slide24
SQL指令-結構操作
  • SQLite沒有刪除欄位的指令,例如

ALTER TABLE DROP COLUMN

  • 那怎麼辦?
slide25
SQL指令-結構操作

新增一個備份資料庫member_backup

將資料從member搬到member_backup

刪除member

再新增一個member,此時不要含要刪掉的欄位

再把資料從member_backup搬到member

刪除member_backup

完成

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

SQLite+Android

By SQLiteOpenHelper

sqlite android1
SQLite+Android
  • 建立新專案-HelloDB
android sqlite1
Android+SQLite使用方式
  • 引用class SQLiteOpenHelper
  • 建立SQLiteOpenHelper 物件
  • 透過SQLiteOpenHelper 物件建立database物件
  • 透過database物件存取資料

記得要開android.permission.WRITE_EXTERNAL_STORAGE

sqliteopenhelper
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); //新增資料表

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldV, int newV)

{

}

}

只有在資料庫不存在時才執行

只有在DatabaseHelper此建構子有執行時才執行

資料庫版本有更新時才執行

sqlite android2
SQLite+Android
  • 首先,在主程式中加入SQLiteOpenHelper結構

必要的class

建立db2.db資料庫

資料庫第一次建立時會執行onCreate

資料庫異動版本時會執行onUpgrade

sqlite android3
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) {

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldV, int newV) {

}

}

如果要建立到sdcard

sqlite android4
SQLite+Android
  • 從class HelloDB呼叫DatabaseHelper建立資料庫

建立DatabaseHelper物件

呼叫建立db2.db資料庫

slide34
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 android5
SQLite+Android
  • 資料庫被建立在data/data/com.android.hellodb
sqlite android6
SQLite+Android
  • 資料庫被建立在data/data/com.android.hellodb
sqlite android7
SQLite+Android
  • 有資料庫後,下一步要建立資料

新增資料

定義資料表結構

建立資料表

slide38

建立資料

String cmd="insert into " + DATABASE_TABLE + " (_id,name,pwd,age) values ('c123','小黑','ccc',12)";

db.execSQL(cmd);

sqlite android8
SQLite+Android
  • 為何會錯誤?

跟執行流程或

資料庫設定有關!

sqlite android9
SQLite+Android
  • 幾點注意!

1.下面這段只有在資料庫第一次被建立時才會進行,所以如果資料庫已經存在,那就不會建立資料表,當然也就不能寫入資料

上張投影片的錯誤就是因為我們已經先建立db2.db,因此再次執行程式時,並不會建立資料表,導致下面程式出錯

sqlite android10
SQLite+Android
  • 正常執行結果

資料庫

資料表

資料

中文資料有亂碼

slide42
到此為止,同樣的程式再執行一次會出現錯誤,WHY?到此為止,同樣的程式再執行一次會出現錯誤,WHY?
sqlite android11
SQLite+Android
  • 最後,可以進行資料查詢

再新增一筆資料(小黑)

SQL查詢指令

資料移動到第一筆

顯示資料

slide44

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";

c.moveToNext();

}

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 android12
SQLite+Android
  • 實際顯示沒有亂碼
slide46
小練習
  • 使用上述課程member資料表
  • 設計一個登入畫面,可以讓使用者輸入帳號與密碼
  • 輸入完成後按下「確認」按鈕後,連回資料庫內的member 資料表進行確認(id與pwd欄位)
  • 輸入正確者跳至下一個頁面(自訂),錯誤者請跳出訊息提示框
listview1
透過ListView顯示資料

ArrayAdapter

陣列資料

listview2
透過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"

};

listview3
透過ListView顯示資料

選了怎麼不會勾選?

listview4
透過ListView顯示資料

加入:

ListView lv = this.getListView();

lv.setChoiceMode( ListView.CHOICE_MODE_SINGLE );

修改:android.R.layout.simple_list_item_checked

ListView勾選效果

listview5
透過ListView顯示資料

偵測選擇資料

slide54

Object o=this.getListAdapter().getItem(position);

String keyword=o.toString();

Toast.makeText(HelloDB.this, "choose:" + keyword, Toast.LENGTH_SHORT).show();

listview9
把資料庫與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));

c.moveToNext();

}

//顯示資料

setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,mStrings));

}

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

main.xml版面

ListView物件的id

listview12
透過ListView顯示資料

不改

陣列資料

listview13
透過ListView顯示資料

偵測選擇資料

如果是顯示兩個欄位以上資料

Cursor c = (Cursor) arg0.getItemAtPosition(position);

String tableValue = c.getString(0);

slide63
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();

}

});

listview14
透過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 );

選擇才會有變色

slide67
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 simpleadapter2
透過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 simpleadapter4
透過ListView顯示資料-SimpleAdapter

偵測選擇資料

偵測選擇資料

slide71
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();

}

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

</LinearLayout>

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

第二個LinearLayout要設定成horizontal

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

}

listview19
透過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"

};

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

再加入LinearLayout與ImageView

LinearLayout要設定成horizontal

listview24
透過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,

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,

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

};

listview27
透過ListView顯示資料庫資料

原程式,用Toast顯示資料

用ListView取代這裡

listview28
透過ListView顯示資料庫資料
  • 注意資料表內需要有個_id的主鍵欄位
  • 注意使用ListView顯示資料,需要修改extends Activity變成ListActivity
  • 需刪掉setContentView(R.layout.main);
listview29
透過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);

listview31
透過ListView顯示資料庫資料

原來是

two_line_list_item

  • 兩列字體大小不同

改這個屬性

listview33
透過ListView顯示資料庫資料

直接顯示資料

偵測選擇資料

listview34
透過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();

}

listview35
透過ListView顯示資料庫資料

透過另一頁(DataDetails)顯示資料

注意要加入<activity android:name="DataDetails"></activity>

傳送資料

listview36
透過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);

}

listview37
透過ListView顯示資料庫資料

DataDetails.java

接收資料

slide96
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();

}

slide97

資料刪修

新增/修改/刪除

slide98
新增
  • 加入版面 main1.xml
slide99
新增

動態SQL指令

EditText

跳回顯示頁面

slide100
新增

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

}

});

slide101
修改
  • 加入版面 main.xml
slide102
修改 I

先取得要修改的資料

將查到的資料填入輸入框

slide104
修改

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

}

});

slide105
小迷思
  • 應改成cursor.getString,否則將取不到值
  • 接收端:

mID = this.getIntent().getExtras().getString("EMPLOYEE_ID");

slide106
刪除

/* 刪除的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();

}

});

slide107
選 單
  • 使用手機硬體上的MENU鍵進行呼叫顯示
  • 建立選單
    • onCreateOptionsMenu
  • 處理選項動作
    • onOptionsItemSelected
slide108
選單基本結構
  • 建立選單
    • onCreateOptionsMenu
  • 處理選項動作
    • onOptionsItemSelected
slide109
加入選單選項
  • 加入選項
    • 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);

slide111
處理選項動作
  • 處理選項動作
    • onOptionsItemSelected
slide112

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

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// TODO Auto-generated method stub

switch(item.getItemId()){

case MENU_ABOUT:

break;

case MENU_QUIT:

break;

}

return super.onOptionsItemSelected(item);

}

slide113
小練習
  • 在DataDetails上設計四個TextView物件
  • 透過傳進來的EMPLOYEE_ID,再到資料庫查詢詳細資料,將其顯示到上面四個TextView中
db webservice httppost httpget
預告怎麼連結外部DB透過WebService透過HttpPost或HttpGet預告怎麼連結外部DB透過WebService透過HttpPost或HttpGet
sqlite manager

SQLite Manager

透過它的介面管理SQLite

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

直接開啟SQLIte database

有UI介面比較好操作

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

動態SQL指令

撰寫動態SQL指令的步驟

slide121
動態SQL指令
  • 全部都從基本指令開始
  • 欄位型態是文字或日期,對應的值要加單引號
  • 注意空白
  • 不分大小寫
  • 新增
    • Insert into 資料表 (欄位s) values (值s)
  • 刪除
    • delete from 資料表 where 條件
  • 修改
    • update 資料表 set 欄位s=新值swhere 條件
  • 查詢
    • select 欄位 from 資料表 [where 條件]
slide122
動態SQL指令
  • 用假資料先寫出正確的SQL指令
    • 對不對,問SQLite
  • 用程式取代假資料
  • 用雙引號將程式與原SQL指令切開
    • SQL指令是字串,與程式要切開
  • 用加號將切開位置串起來

把最後完成的結果貼回程式內

slide123
動態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+”’

slide124
動態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 + ”’