實作SQLiteOpenHelper類別

Similar documents
主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

建立Android新專案

Android Service

建模与图形思考

Dynamic Layout in Android

建立Android新專案

Database_001

Android Fragment

多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t

行動裝置程式設計

投影片 1

建立Android新專案

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

RecyclerView and CardVew

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

EJB-Programming-4-cn.doc

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

<4D F736F F D20BBF9D3DA416E64726F6964C6BDCCA8B5C4B5E7D7D3C5C4C2F4CFB5CDB32E646F63>

EJB-Programming-3.PDF

untitled

建模与图形思考

基于ECO的UML模型驱动的数据库应用开发1.doc

個 人 的 手, 拉 著 瞎 子 的 手 把 他 帶 往 村 外 的 時 候, 對 於 瞎 子 來 講, 那 個 人 的 手 和 耶 穌 的 手 有 沒 有 區 別? 沒 有! 為 什 麼 沒 有 區 別? 因 為 對 於 一 個 瞎 子 來 說, 手 和 耳 朵 就 是 他 接 觸 世 界, 瞭

untitled

untitled

Microsoft Word - 01.DOC

1-1 database columnrow record field 不 DBMS Access Paradox SQL Server Linux MySQL Oracle IBM Informix IBM DB2 Sybase 1-2

目錄

學 科 100% ( 為 單 複 選 題, 每 題 2.5 分, 共 100 分 ) 1. 請 參 閱 附 圖 作 答 : (A) 選 項 A (B) 選 項 B (C) 選 項 C (D) 選 項 D Ans:D 2. 下 列 對 於 資 料 庫 正 規 化 (Normalization) 的 敘

Microsoft Word - ch04三校.doc

INTRODUCTION TO COM.DOC

untitled

Android + NFC

臺銀人壽「98年九至十一職等人員甄試」

预览图 : (2) 在 SelectCity.java 中增加控件, 用于绑定 select_city 文件的 ListView, TextView,EditTest 等控件 代码和注释如下 :

untitled

epub83-1

《大话设计模式》第一章

untitled

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Android 编程基础 Android 开发教程 & 笔记 1

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

ASP.NET实现下拉框二级联动组件

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

untitled

3.1 num = 3 ch = 'C' 2

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

Java

SP_ SP_03 JAVA...6 SP_10 SQL...8 SP_ SP_ SP_ SP_ SP_ SP_ SP_ SP_04.NET...33 SP_02 C...37 SP_05

Microsoft Office SharePoint Server MOSS Web SharePoint Web SharePoint 22 Web SharePoint Web Web SharePoint Web Web f Lists.asmx Web Web CAML f

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

Chapter 9: Objects and Classes

天津天狮学院关于修订2014级本科培养方案的指导意见

untitled

投影片 1

ltu

untitled

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

untitled

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

第3章.doc

Microsoft PowerPoint - L17_Inheritance_v4.pptx

untitled

ThreeDtunnel.doc

untitled

目錄 C ontents Chapter MTA Chapter Chapter

The Embedded computing platform

FY.DOC

概述

untitled

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型

RunPC2_.doc

TopTest_Adminstrator.doc

穨_1_.PDF

标题

目 录 一 重 要 提 示... 3 二 公 司 主 要 财 务 数 据 和 股 东 变 化... 3 三 重 要 事 项... 8 四 附 录 / 28

RUN_PC連載_12_.doc

新版 明解C++入門編

CC213

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

团 学 要 闻 我 校 召 开 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 3 月 17 日, 我 校 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 在 行 政 办 公 楼 五 楼 会 议 室 举 行, 校 团 委 委 员 各 院 ( 系 ) 团 委 书 记 校 学 生

untitled

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466>

untitled

「西醫基層總額支付委員會《第28次委員會議紀錄

第6章  数据库技术基础

1.5招募说明书(草案)

untitled

目 录 第 五 部 分 第 六 部 分 第 七 部 分 第 八 部 分 投 标 邀 请 投 标 人 须 知 附 表 评 标 方 法 和 评 分 细 则 项 目 需 求 和 技 术 方 案 要 求 1

聚焦.fit)

A API Application Programming Interface 见 应 用 程 序 编 程 接 口 ARP Address Resolution Protocol 地 址 解 析 协 议 为 IP 地 址 到 对 应 的 硬 件 地 址 之 间 提 供 动 态 映 射 阿 里 云 内

8

chp6.ppt

Transcription:

SQLiteOpenHelper 類別存取 SQLite 建國科技大學資管系 饒瑞佶 2013/5 V1

Android 連結資料庫 MySQL SQL Server Web Service 遠端資料庫 Internet Intranet Android SQLite 單機資料庫

Android vs. SQLite 透過 SQLiteOpenHelper 類別來操作 建立資料庫 ( 建構子 ) 建立資料表 (oncreate 方法 ) 更新資料庫 (onupgrade 方法 ) 從 SQLiteOpenHelper 類別建立物件, 同時配合 SQL 指令來操作資料庫

Android vs. SQLite 運作流程 建構子 是否有資料庫? 有 檢查版本 無 建立資料庫 進入 oncreate 建立資料表 開啟資料庫 使用資料庫

實作 SQLiteOpenHelper 類別

Extends SQLiteOpenHelper 產生新 class-mysqlite

繼承 SQLIiteOpenHelper

尚需要加入建構子

建構子

建立資料庫與資料表

透過建構子建立 / 取得資料庫 透過 oncreate 建立資料表 這裡有修正

public class MySQLite extends SQLiteOpenHelper { SQLiteDatabase db; // 資料庫物件 public MySQLite(Context context) { super(context, "/sdcard/db2.db", null, 1); db=this.getwritabledatabase(); // 將 db 對應到 /sdcard/db2.db } @Override public void oncreate(sqlitedatabase db) { // 建立資料表 String DATABASE_TABLE = "member"; String DATABASE_CREATE_TABLE = "create table " + DATABASE_TABLE + "(_id char(20), name char(10), pwd char(10), age integer, primary key(_id));"; db.execsql(database_create_table); } @Override public void onupgrade(sqlitedatabase arg0, int arg1, int arg2) { // TODO 自動產生的方法 Stub } }

提示 未來就透過 class MySQLite 來操作資料庫 資料部分則是透過 class MySQLite 內的 db 物件 當然操作資料需要透過 SQL 指令

使用資料庫

透過 class MySQLite 建立資料

public class Main extends Activity { MySQLite dbhelper; // 透過 MySQLite 宣告物件 dbhelper @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); dbhelper = new MySQLite(this); // 建立 dbhelper 物件 String cmd="insert into member (_id,name,pwd,age) values ('A123',' 小白 ','ccc',12)"; dbhelper.db.execsql(cmd); } }

使用 sqlite3 確認

查詢資料 建立查詢方法 getdata

private void getdata(string sql){ Cursor c=dbhelper.db.rawquery(sql, null); // 透過 Cursor 取得資料 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(Main.this) // 顯示資料.setTitle("data").setMessage(data).setPositiveButton(" 確認 ",new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int which) { // TODO Auto-generated method stub } }).show(); }

呼叫 getdata

透過 ListView 顯示資料庫資料

使用 ListActivity 改成 ListActivity 刪除

建立查詢方法 getdatabylistview

private void getdatabylistview(string sql){ Cursor c=dbhelper.db.rawquery(sql, null); // 透過 Cursor 取得資料 c.movetonext(); // 將指標移動到第一筆資料 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,mStri ngs)); }

改呼叫 getdatabylistview

result

加入 onlistitemclick 偵測點按事件

加入點按動作 @Override protected void onlistitemclick(listview l, View v, int position, long id) { // TODO 自動產生的方法 Stub super.onlistitemclick(l, v, position, id); Object o=this.getlistadapter().getitem(position); String keyword=o.tostring(); Toast.makeText(Main.this, " 選擇了 :" + keyword, Toast.LENGTH_SHORT).show(); }

result

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

版面中加入 ListView

恢復成 Activity

修改 getdatabylistview

result

加入 setonitemclicklistener

private void getdatabylistview(string sql){ Cursor c=dbhelper.db.rawquery(sql, null); // 透過 Cursor 取得資料 c.movetonext(); // 將指標移動到第一筆資料 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,mString s)); lv.setadapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,mString s)); lv.setonitemclicklistener(new OnItemClickListener(){ @Override public void onitemclick(adapterview<?> arg0, View arg1, int arg2, long arg3) { String keyword=lv.getitematposition(arg2).tostring(); Toast.makeText(Main.this, " 選擇了 :" + keyword, Toast.LENGTH_SHORT).show(); } }); }

result

加入項目勾選設定 lv.setchoicemode( ListView.CHOICE_MODE_SINGLE );

資料異動

再改寫顯示方式 新加入 getdatabysimpleadapter 方法 記得改呼叫 getdatabysimpleadapter(cmd_select);

private void getdatabysimpleadapter(string sql){ Cursor c=dbhelper.db.rawquery(sql, null); // 透過 Cursor 取得資料 SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.r.layout.simple_list_item_checked, // 版面 c, // 查詢資料 new String[] {"name","_id"}, // 欄位 new int[] { android.r.id.text1 }); // 顯示文字 lv.setchoicemode( ListView.CHOICE_MODE_SINGLE ); // 設定可勾選 lv.setadapter(adapter); lv.setonitemclicklistener(new OnItemClickListener(){ // 觸發選按事件 @Override public void onitemclick(adapterview<?> arg0, View arg1, int arg2,long arg3) { Cursor cursor = (Cursor)lv.getAdapter().getItem(arg2); //arg2 是位置 String keyword =cursor.getstring(cursor.getcolumnindex("_id")); Toast.makeText(Main.this, " 您選擇了 : " + keyword, Toast.LENGTH_LONG).show(); } }); }

刪除 取得要刪除的主鍵 (_id) 值 將刪除功能放入選單

刪除指令

dbhelper.db.delete("member", "_id='" + mid + "'", null); Toast.makeText(Main.this, " 資料刪除完成 ", Toast.LENGTH_LONG).show(); getdatabysimpleadapter("select * from member"); // 重新整理

加入 xml 版面 新增

加入 Add.java 新增

public class Add extends Activity { MySQLite dbhelper; // 透過 MySQLite 宣告物件 dbhelper EditText ed1; // 帳號 EditText ed2; // 姓名 EditText ed3; // 密碼 EditText ed4; // 年齡 Button bt1; // 新增按紐 @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.add); dbhelper = new MySQLite(this); // 建立 dbhelper 物件 ed1=(edittext)findviewbyid(r.id.edittext1); ed2=(edittext)findviewbyid(r.id.edittext2); ed3=(edittext)findviewbyid(r.id.edittext3); ed4=(edittext)findviewbyid(r.id.edittext4); bt1=(button)findviewbyid(r.id.button1); bt1.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view v) { // 新增程式 String cmd="insert into member (_id,name,pwd,age) values ('" + ed1.gettext() + "','" + ed2.gettext() + "','" + ed3.gettext() + "'," + ed4.gettext() + ")"; dbhelper.db.execsql(cmd); Toast.makeText(Add.this, " 資料新增完成 ", Toast.LENGTH_LONG).show(); Intent it=new Intent(); // 跳回主畫面 it.setclass(add.this, Main.class); startactivity(it); Add.this.finish(); } }); } }

加入從 Main 跳至 Add Intent it=new Intent(); // 跳至新增主畫面 it.setclass(main.this, Add.class); startactivity(it);

result

加入修改畫面 修改

Main 加入修改跳頁與傳值 Intent intent = new Intent(Main.this, Update.class); intent.putextra("employee_id",mid); startactivity(intent);

先顯示出資料 修改程式

public class Update extends Activity { MySQLite dbhelper; // 透過 MySQLite 宣告物件 dbhelper EditText ed1; // 帳號 EditText ed2; // 姓名 EditText ed3; // 密碼 Button bt1; // 新增按紐 String mid; // 要修改的資料編號 @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.update); dbhelper = new MySQLite(this); // 建立 dbhelper 物件 ed1=(edittext)findviewbyid(r.id.edittext1); ed2=(edittext)findviewbyid(r.id.edittext2); ed3=(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 + "';"; Cursor c = dbhelper.db.rawquery(cmd_select, null); // 執行 SQL 指令, 進行資料查詢 if(c.movetonext()){ // 有資料才顯示 ed1.settext(c.getstring(c.getcolumnindex("name"))); // 姓名 ed2.settext(c.getstring(c.getcolumnindex("pwd"))); // 密碼 ed3.settext(c.getstring(c.getcolumnindex("age"))); // 年齡 }else{ Toast.makeText(Update.this, " 找不到任何資料 ", Toast.LENGTH_LONG).show(); return; }

加入修改指令 修改程式

bt1.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view v) { // 新增程式 String cmd="update member set name='" + ed1.gettext() + "',pwd='" + ed2.gettext() + "',age=" + ed3.gettext() + " where _id='" + mid + "'"; dbhelper.db.execsql(cmd); Toast.makeText(Update.this, " 資料修改完成 ", Toast.LENGTH_LONG).show(); Intent it=new Intent(); // 跳回主畫面 it.setclass(update.this, Main.class); startactivity(it); Update.this.finish(); } });