嵌入式系統實驗操作手冊

tenderlaSoftware and s/w Development

Dec 13, 2013 (3 years and 5 months ago)

116 views


嵌入式
實驗
操作手冊


AD
-
06

-
資料庫的應用
(

)

一、

實驗目的

在開發板上,透過
Android
系統,
使用
Android
所提供的
Portable SQLite(
可攜
式資料庫
)

設計一個簡單的資料庫來放置行事曆。


二、

實驗儀器



PAC Duo

SOC
嵌入式開發板



軟體開發工具
Eclipse

三、

實驗原理

實作
onCreate( )

onUpgrade( )
來達到資料庫的新增與更動。

四、

實驗內容

預計功能
:


可進行資料的新增
(Insert)
、修改
(U
p
date)
和刪除
(Delete)


五、

實驗步驟

1.

如圖一所示,用電源線、
RS
-
232(
交叉線
)
,將
PC

PAC
-
Duo SOC
做好連接。


嵌入式
實驗
操作手冊



圖一、
PAC Duo SOC
安裝圖


2.

進入
Eclipse
,進行程式碼編譯。

主程式

Test2.java

package test2.arnor.program;


import android.app.Activity;

import android.database.Cursor;

import android.database.sqlite.SQLiteCursor;

import android.os.Bundle;

import android.
view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.AdapterView;

import android.widget.EditText;

import android.widget.ListView;

import android.widget.SimpleCursorAdapter;


public class Test2 extends Activity

{


p r i v a t
e To D o D B my To D o D B;


p r i v a t e C u r s o r my C u r s o r;


p r i v a t e L i s t Vi e w my L i s t Vi e w;


p r i v a t e E d i t Te x t my E d i t Te x t;


p r i v a t e i n t _ i d;


p r o t e c t e d f i n a l s t a t i c i n t ME N U _ A D D = Me n u.F I R S T;


嵌入式
實驗
操作手冊



p r o t e c t e d f i n a l s t a t i c i n t ME N U _ E D I T = Me n u.F I R S T + 1;


p r o t e c t e d f i n a l s t
a t i c i n t ME N U _ D E L E T E = Me n u.F I R S T + 2;



@Ov e r r i d e


p u b l i c b o o l e a n o n Op t i o n s I t e mS e l e c t e d ( Me n u I t e m i t e m)


{


s u p e r.o n Op t i o n s I t e mS e l e c t e d ( i t e m);

//
提供選擇類別


s w i t c h ( i t e m.g e t I t e mI d ( ) )


{


c a s e ME N U _ A D D:

//
新增資料事件


t h i s.a d d To d o ( );


b r e a k;


c a s e ME N U _ E D I T:

//
編輯資料事件


t h i s.e d i t To d o ( );


b r e a k;


c a s e ME N U _ D E L E T E:

//
刪除資料事件


t h i s.d e l e t e To d o ( );


b r e a k;


}


r e t u r n t r u e;


}



@Ov e r r i d e


p u b l i c b o o l e a n o n C r e a t e Op t i o n s Me n u ( Me n u me n u )


{


s u p e r.o
n C r e a t e Op t i o n s Me n u ( me n u );


/*
新增三個
ME NU */


me n u.a d d ( Me n u.N ON E, ME N U _ A D D, 0, R.s t r i n g.s t r A d d B u t t o n );


me n u.a d d ( Me n u.N ON E, ME N U _ E D I T, 0, R.s t r i n g.s t r E d i t B u t t o n );


me n u.a d d ( Me n u.N ON E, ME N U _ D E L E T E, 0,
R.s t r i n g.s t r D e l e t e B u t t o n );



r e t u r n t r u e;


}



/* * C a l l e d w h e n t h e a c t i v i t y i s f i r s t c r e a t e d. */


@Ov e r r i d e


p u b l i c v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e )


{


s u p e r.o n C r e a t e ( s a v e d I n s t a n c e S t a t e );


s e t C o n t e n t Vi e w ( R.l a y o u t.ma i n );



my L i s t Vi e w = ( L i s t Vi e w ) t h i s.f i n d Vi e w B y I d ( R.i d.my L i s t Vi
e w );


my E d i t Te x t = ( E d i t Te x t ) t h i s.f i n d Vi e w B y I d ( R.i d.my E d i t Te x t );



my To D o D B = n e w To D o D B ( t h i s );


/*
取得
D a t a B a s e
裡的資料

*/


my C u r s o r = my To D o D B.s e l e c t ( );



嵌入式
實驗
操作手冊



/* n e w S i mp l e C u r s o r A d a p t e r
並將
myCursor
傳入,顯示資料的欄位

todo_text */


S i mp l e C u r s o r A d a p t e r a d a p t e r = n e w S i mp l e C u r s o r A d a p t e r ( t h i s,
R.l a y o u t.l i s t,


my C u r s o r, n e w S t r i n g [ ]


{ To D o D B.F I E L D
_ T E X T }, n e w i n t [ ]


{ R.i d.l i s t Te x t Vi e w 1 } );


my L i s t Vi e w.s e t A d a p t e r ( a d a p t e r );



/*

my L i s t Vi e w
加入
On I t e mC l i c k L i s t e n e r */


my L i s t Vi e w.s e t On I t e mC l i c k L i s t e n e r ( n e w
A d a p t e r Vi e w.On I t e mC l i c k L i s t e n e r ( )


{



@Ov e r r i d e


p u b l i c v o i d o n I t e mC
l i c k ( A d a p t e r Vi e w <?> a r g 0, Vi e w a r g 1, i n t
a r g 2,


l o n g a r g 3 )


{


/*

my C u r s o r
移到所點選的值

*/


my C u r s o r.mo v e To P o s i t i o n ( a r g 2 );


/*
取得欄位
_ i d
的值

*/


_ i d = my C u r s o r.g e t I n t ( 0 );


/*
取得欄位
t o d o _ t e x t
的值

*/


my E d i t Te x t.s e t
Te x t ( my C u r s o r.g e t S t r i n g ( 1 ) );


}



} );


my L i s t Vi e w


.s e t On I t e mS e l e c t e d L i s t e n e r ( n e w
A d a p t e r Vi e w.On I t e mS e l e c t e d L i s t e n e r ( )


{



@Ov e r r i d e


p u b l i c v o i d o n I t e mS e l e c t e d ( A d a p t e r Vi e w <?> a r g 0, Vi e w a r g 1,
i n t a r g 2,



l o n g a r g 3 )


{


/* g e t S e l e c t e d I t e m
所取得的是
S QL i t e C u r s o r */


S QL i t e C u r s o r s c = ( S QL i t e C u r s o r ) a r g 0.g e t S e l e c t e d I t e m( );


_ i d = s c.g e t I n t ( 0 );


my E d i t Te x t.s e t Te x t ( s c.g e t S t r i n g ( 1 ) );


}



@Ov e r r i d e


p u b l i c v o i d
o n N o t h i n g S e l e c t e d ( A d a p t e r Vi e w <?> a r g 0 )


{



}


嵌入式
實驗
操作手冊




} );



}



p r i v a t e v o i d a d d To d o ( )


{


i f ( my E d i t Te x t.g e t Te x t ( ).t o S t r i n g ( ).e q u a l s ("") )


r e t u r n;


/*
新增資料到資料庫

*/


my To D o D B.i n s e r t ( my E d i t Te x t.g e t Te x t ( ).t o S t r i n g ( ) );


/
*
重新查詢

*/


my C u r s o r.r e q u e r y ( );


/*
重新整理
my L i s t Vi e w */


my L i s t Vi e w.i n v a l i d a t e Vi e w s ( );


my E d i t Te x t.s e t Te x t ("");


_ i d = 0;


}



p r i v a t e v o i d e d i t To d o ( )


{


i f ( my E d i t Te x t.g e t Te x t ( ).t o S t r i n g ( ).e q u a l s ("") )


r e t u r n;


/*
修改資料

*/


my
ToDoDB.update(_id, myEditText.getText().toString());


my C u r s o r.r e q u e r y ( );


my L i s t Vi e w.i n v a l i d a t e Vi e w s ( );


my E d i t Te x t.s e t Te x t ("");


_ i d = 0;


}



p r i v a t e v o i d d e l e t e To d o ( )


{


i f ( _ i d = = 0 )


r e t u r n;


/*
刪除資料

*/


my To D o D B.d e l e t e (
_ i d );


my C u r s o r.r e q u e r y ( );


my L i s t Vi e w.i n v a l i d a t e Vi e w s ( );


my E d i t Te x t.s e t Te x t ("");


_ i d = 0;


}

}


資料庫程式

To D o D B.j a v a

p a c k a g e t e s t 2.a r n o r.p r o g r a m;


i mp o r t a n d r o i d.c o n t e n t.C o n t e n t Va l u e s;


嵌入式
實驗
操作手冊


import android.content.Context;

import android.database
.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;


public class ToDoDB extends SQLiteOpenHelper

{


p r i v a t e f i n a l s t a t i c S t r i n g D ATA B A S E _ N A ME = "t o d o _ d b";


p r i v a t e f i n a l s t a t i c i n t D ATA B A S E _ V E R S I ON =
1;


p r i v a t e f i n a l s t a t i c S t r i n g TA B L E _ N A ME = "t o d o _ t a b l e";


p u b l i c f i n a l s t a t i c S t r i n g F I E L D _ i d = "_ i d";


p u b l i c f i n a l s t a t i c S t r i n g F I E L D _ T E X T = "t o d o _ t e x t";



p u b l i c To D o D B ( C o n t e x t c o n t e x t )


{


s u p e r ( c o n t e x t, D ATA B A S E _ N A ME, n u l l, D ATA B A S E _ V E R S I ON
);


}



@Ov e r r i d e


p u b l i c v o i d o n C r e a t e ( S QL i t e D a t a b a s e d b )


{


/*
建立
t a b l e */


S t r i n g s q l = "C R E AT E TA B L E " + TA B L E _ N A ME + " (" +
F I E L D _ i d


+ " I N T E GE R p r i ma r y k e y a u t o i n c r e me n t, " + " " +
F I E L D _ T E X T + " t e x t )";


d b.e x e c S QL ( s q l );


}



@Ov e r r i d e


p u b l i c v o i d o n U p g r a d e ( S QL i t e D a t a b a s e d b, i n t o l d Ve r s i o n, i n t
n e w Ve r s i o n )


{


S t r i n g s q l = "D R OP TA B L E I F E X I S T S " + TA B L E _ N A ME;


d b.e x e c S QL ( s q l );


o n C r e a t e ( d b );


}



p u b l i c C u r s o r s e l e c t ( )


{


S QL i t e D a t a b a s e d b = t h i s.g e t R e a d a b l
e D a t a b a s e ( );


C u r s o r c u r s o r = d b.q u e r y ( TA B L E _ N A ME, n u l l, n u l l, n u l l, n u l l, n u l l,
n u l l );


r e t u r n c u r s o r;


}



p u b l i c l o n g i n s e r t ( S t r i n g t e x t )


{


S QL i t e D a t a b a s e d b = t h i s.g e t Wr i t a b l e D a t a b a s e ( );


嵌入式
實驗
操作手冊



/*
將新增的值放入
C o n t e n t Va l u e s */


C o n t e n t Va l u e s c v = n e w C o n t e n t Va l u e s ( );


c v.p u t ( F I E L D _ T E X T, t e x t );


l o n g r o w = d b.i n s e r t ( TA B L E _ N A ME, n u l l, c v );


r e t u r n r o w;


}



p u b l i c v o i d d e l e t e ( i n t i d )


{


S QL i t e D a t a b a s e d b = t h i s.g e t Wr i t a b l e D a t a b a s e (
);


S t r i n g w h e r e = F I E L D _ i d + " = ?";


S t r i n g [ ] w h e r e Va l u e =


{ I n t e g e r.t o S t r i n g ( i d ) };


d b.d e l e t e ( TA B L E _ N A ME, w h e r e, w h e r e Va l u e );


}



p u b l i c v o i d u p d a t e ( i n t i d, S t r i n g t e x t )


{


S QL i t e D a t a b a s e d b = t h i s.g e t Wr i t a b l e D a t a b a s e ( );


S t r i n g

w h e r e = F I E L D _ i d + " = ?";


S t r i n g [ ] w h e r e Va l u e =


{ I n t e g e r.t o S t r i n g ( i d ) };


/*
將修改的值放入
C o n t e n t Va l u e s */


C o n t e n t Va l u e s c v = n e w C o n t e n t Va l u e s ( );


c v.p u t ( F I E L D _ T E X T, t e x t );


d b.u p d a t e ( TA B L E _ N A ME, c v, w h e r e, w h e r e Va l u e );


}

}


Ma i n.x ml

<?
xml

version
=
"1.0"

encoding
=
"utf
-
8"
?>

<
LinearLayout

xmlns:android
=
"http://schemas.android.com/apk/res/android"


android:orientation
=
"vertical"


android:layout_width
=
"fill_parent"


android:layout_height
=
"fill_parent"


android:background
=
"@drawable/whi
te"


>


<
TextView



android:layout_width
=
"fill_parent"



android:layout_height
=
"wrap_content"



android:text
=
"@string/hello"


android:textColor
=
"@drawable/black"


>


嵌入式
實驗
操作手冊



</
TextView
>



<
EditText



android:id
=
"@+id/myEditText"



android:layout_widt
h
=
"fill_parent"



android:layout_height
=
"wrap_content"



android:textColor
=
"@drawable/black"


>


</
EditText
>


<
ListView



android:id
=
"@+id/myListView"



android:layout_width
=
"fill_parent"



android:layout_height
=
"wrap_content"


android:background
=
"@drawable/red"


>


</
ListView
>


</
LinearLayout
>



list
.xml

<?
xml

version
=
"1.0"

encoding
=
"utf
-
8"
?>

<
LinearLayout

xmlns:android
=
"http://schemas.android.com/apk/res/android"


android:orientation
=
"vertical"


android:layout_width
=
"fill_parent"


androi
d:layout_height
=
"fill_parent"


>


<
CheckedTextView

android:id
=
"@+id/listTextView1"


xmlns:android
=
"http://schemas.android.com/apk/res/android"


android:layout_width
=
"wrap_content"


android:layout_height
=
"wrap_content"


android:textColor
=
"@drawable/bl
ack"


>


</
CheckedTextView
>

</
LinearLayout
>




Strings.xml


嵌入式
實驗
操作手冊


<?
xml

version
=
"1.0"

encoding
=
"utf
-
8"
?>

<
resources
>


<
string

name
=
"hello"
>

MENU
可新增、修改、刪除
</
string
>


<
string

name
=
"app_name"
>
Test2
</
string
>


<
string

name
=
"strEditButton"
>
修改
</
string
>


<
string

n
ame
=
"strMenu1"
>
Delete
</
string
>


<
string

name
=
"strAddButton"
>
新增
</
string
>


<
string

name
=
"strDeleteButton"
>
刪除
</
string
>

</
resources
>



color
.xml

<?
xml

version
=
"1.0"

encoding
=
"utf
-
8"
?>

<
resources
>


<
drawable

name
=
"black"
>
#000000
</
drawable
>


<
drawable

name
=
"white"
>
#FFFFFFFF
</
drawable
>


<
drawable

name
=
"red"
>
#FF0000
</
drawable
>

</
resources
>


AndroidManifest.xm
l
l

<?
xml

version
=
"1.0"

encoding
=
"utf
-
8"
?>

<
manifest

xmlns:android
=
"http://schemas.android.com/apk/res/android"


package
=
"test2.arnor.program"



android:versionCode
=
"1"


android:versionName
=
"1.0"
>


<
application

android:icon
=
"@drawable/icon"

android:label
=
"@string/app_name"
>


<
activity

android:name
=
".Test2"


android:label
=
"@string/app_name"
>


<
intent
-
fil
ter
>


<
action

android:name
=
"android.intent.action.MAIN"

/>


<
category

android:name
=
"android.intent.category.LAUNCHER"

/>


</
intent
-
filter
>


</
activity
>



</
application
>



嵌入式
實驗
操作手冊



</
manifest
>


3.

開啟終端機程式,即
Tera Term


(XP
作業環境下請選擇超級終端機
)

設定如下
:



Baud rate

115200



Data

8 bit



Parity

none



Stop

1 bit



Flow control

none

4.


USB
裝置連接至開發板,如圖二所示。


圖二、將
USB
裝置連結至開發板

5.

輸入掛載指令
,如圖三、圖四、圖五所示
:



busybox mknod /dev/sda1 b 8 1

(
先建立一個掛載點
)




busybox mount

t vfat /dev/sda1 /mnt

(
參數


t

usb
所要掛載的檔案
類型,將
/dev
底下的
sda1
掛載到
/mnt
底下
)


嵌入式
實驗
操作手冊



圖三、輸入掛載指令



利用
cd

ls
指令查看程式所在路徑


圖四、查詢程式所在路徑


嵌入式
實驗
操作手冊




利用
cp
指令將執行檔複製至根目錄
/data/app
資料夾下


圖五、
將執行檔複製至根目錄
/data/app
資料夾下

6.

操作開發板執行程式
,畫面如圖六、圖七、圖八所示




嵌入式
實驗
操作手冊


圖六、
Test2.apk
程式執行畫面


圖七、新增行事曆資料


圖八、資料的新增、修改與刪除功能




嵌入式
實驗
操作手冊




備註
:



模擬器設定方式請參考先前的教學文件。



由於
1.5
版的
compiler

method

overrid
e
支援上有問題,
故請先將
compiler
的改為
1.6
版。



六、

問題與思考題

1.


將程式碼匯入
eclipse
中,用
Android
模擬器
compiler
完成並執行


2.


將程式
porting

PAC
-
Duo EVS
上,並正常執行


3.


完成行事曆內容的資料建置,並測試新增、刪除與修改功能


4.

B
usybox
是什麼
?