2012-06-12

Android 手機資料庫(一) - SQLite 基本介紹、創建及查詢

開發手機應用程式的人都應該要知道的SQLite

資料庫是程式設計中一種不可或缺的夥伴

我剛開始學寫Android時也是本想打死看能不能不要需要資料庫

結果當然是"不可能"XD,該面對的還是要面對-.-

所以就開始研究起SQLite,後來覺得它一點也不難

總結一下研究後的感想:

1.沒有像MS-SQL有專屬操作介面可以看(網上有其他軟體可以找來用)

2.開發Android時不需要安裝,直接叫用就可以了

3.都是以單一檔案的方式存在,一支應用程式對應一個db檔

4.db存放路徑在:/data/data//databases/DB名稱.db

5.支援大多數的SQL指令

6.最大支援到2T bytes

以上是我研究後的心得,感覺上不是很難,只是沒介面使用上有點難而已

不過應該也還好。

基本介紹完了,下面我們來實作看看怎麼使用SQLite在Android應用程式內

創建資料庫:
必須先建立一個SQLiteOpenHelper的class類別

package jim.memorandum;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class NewListDataSQL extends SQLiteOpenHelper {

         //資料庫版本關係到App更新時,資料庫是否要調用onUpgrade()
  private static final int VERSION = 1;//資料庫版本  
  
                //建構子
  public NewListDataSQL(Context context, String name, CursorFactory factory,int version) {
   super(context, name, factory, version);
  }

  public NewListDataSQL(Context context,String name) { 
   this(context, name, null, VERSION); 
   } 
  
   public NewListDataSQL(Context context, String name, int version) {  
    this(context, name, null, version);  
      }  
   
  //輔助類建立時運行該方法
  @Override
  public void onCreate(SQLiteDatabase db) {
   String DATABASE_CREATE_TABLE =
     "create table newMemorandum("
       + "_ID INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL,"
             + "date VARCHAR,"
             + "note VARCHAR,"
             + "pw VARCHAR,"
             + "reminder INT,"
             + "type VARCHAR,"
             + "memo VARCHAR"
         + ")";
            db.execSQL(DATABASE_CREATE_TABLE);
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   //oldVersion=舊的資料庫版本;newVersion=新的資料庫版本
   db.execSQL("DROP TABLE IF EXISTS newMemorandum"); //刪除舊有的資料表
   onCreate(db);
  }
  
  @Override    
   public void onOpen(SQLiteDatabase db) {     
           super.onOpen(db);       
           // TODO 每次成功打開數據庫後首先被執行     
       } 

   @Override
        public synchronized void close() {
            super.close();
        }

}

當你在activity中調用建構子NewListDataSQL時,程式自己會去判斷databases資料夾中是否有此db檔,如果沒有就會調用onCreate()建立此SQLite資料庫,所以要建立的Table就寫在onCreate()裡面,寫法跟一般SQL的寫法是一樣的。

Activity中呼叫資料庫

package jim.memorandum;
//import進兩個database需要用到的
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;


public class MemorandumActivity extends Activity {
               //SQLiteDatabase對象
          SQLiteDatabase db;
  //資料庫名
  public String db_name = "MemorandumSQL";
  
  //表名
  public String table_name = "newMemorandum";

  //輔助類名
  NewListDataSQL helper = new NewListDataSQL(MemorandumActivity.this, db_name);



                @Override
                public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
        
                //以輔助類獲得資料庫對象
    db = helper.getReadableDatabase();

注意:一個應用程式只允許對應一個db檔,所以資料庫名稱新增後就不能修改,不然程式會自動創立另一個db檔。

資料庫查詢指令

 
        //取得備忘資料
   public String[] myNote(){
    
    Cursor cursor = db.rawQuery("select note from newMemorandum ORDER BY _ID DESC", null);
    //用陣列存資料
    String[] sNote = new String[cursor.getCount()];
    
    int rows_num = cursor.getCount();//取得資料表列數
    if(rows_num != 0) {
     cursor.moveToFirst();   //將指標移至第一筆資料
     for(int i=0; i<rows_num; i++) {
      String strCr = cursor.getString(0);
      sNote[i]=strCr;
      
      cursor.moveToNext();//將指標移至下一筆資料
     }
    }
    cursor.close(); //關閉Cursor
    //dbHelper.close();//關閉資料庫,釋放記憶體,還需使用時不要關閉
    

    return sNote;
   }

我是寫個function去資料庫中查詢資料,"_ID"是PRIMARY KEY

基本上SQLite資料庫應用的建立及查詢就是這樣而已,還蠻簡單的,後面再介紹新增、修改、刪除的資料庫操作。




複製請註明出處,Android 手機資料庫(一) - SQLite  基本介紹、創建及查詢,謝謝。

Android Mobile App - 電子報

  電子報是一般企業還蠻常用到的行銷產品,可以行銷自家產品,讓客戶能及時知道公司最新資訊,是現行企業還蠻常會用到的行銷方式,一般電子報都是用html + 漂亮的美工完成的,之後再用電子郵件寄送給客戶,現在有了內崁在手機的網頁(Mobile App),我們就來給它實作一下看看成效如何,下面就開始吧。

我開發的是Android版的電子報,其實iPhone也是可以的,只是我沒有iPhone電腦也沒有iPhone手機,所以沒辦法做出APP檔也沒辦法測,就先用Android版的來看一下就好了,其實只有封裝成應用程式的檔案不同而已,其他內容都是相同的,這就是Mobile App的好處(跨平台特性)。

環境:Eclipse + PhoneGap

Eclipse是寫Android程式常用的平台

PhoneGap是Web和Android原生應用程式的中介軟體,不了解的官網上有教學:

不然參考這篇:PhoneGap(一):下載及安裝

如果還是不了解歡迎來信問我^^

有Eclipse及安裝好PhoneGap後,你會在assets下的www內建立index.html首頁

附上程式碼:index.html
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>XX工業電子報</title>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.css" />
<link rel="stylesheet" href="../_assets/css/jqm-docs.css" />
<script type="text/javascript" src="http://code.jquery.com/jquery-1.5.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.js"></script>

<script type="text/javascript" charset="utf-8">
$(function() {
 function jump(count) {  
            window.setTimeout(function(){  
                count--;  
                if(count > 0) {  
                    $('#num').attr('innerHTML', count);  
                    jump(count);  
                } else {  
                    location.href="content.html";  
                }  
            }, 2000);  
        }  
        jump(3);  
});

 
</script>

</head>
<body style="height:100%">

 <div data-role="page" style="height:100%">

  
   <img alt="" src="images/logo.jpg" height="100%" width="100%">
  
 </div>
 <!-- /page -->

</body>
</html>


說明:放一個Logo圖的效果頁面,2秒後自動跳轉到內容頁面去

畫面:

內容頁面程式碼:Content.html

<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>XX工業電子報</title>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.css" />
<link rel="stylesheet" href="../_assets/css/jqm-docs.css" />
<script type="text/javascript" src="http://code.jquery.com/jquery-1.5.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.js"></script>

<script type="text/javascript" charset="utf-8">
 //$(function() {
  //confirm('歡迎光臨!XX工業電子報!');
 //});

</script>
</head>
<body style="height:100%">

 <div data-role="page" style="height:100%">

  <div data-role="header" data-position=""block"" data-theme="b"
   data-backbtn="false" style="height:15%">
   <img src="images/logo.png"
    width="100%" height="100%"/>
   <!-- /navbar -->
  </div>

  <div data-role="content" style="height:70%">
   <ul data-role="listview" data-inset="false" data-theme="a" data-dividertheme="b" style="height:100%">
       <li data-role="list-divider" style="text-align:center"><h4>盟鑫電子報</h4></li>
    <li style="height:20%">
       <a href="http://www.gold-joint.com/upload/epaper/20110627152907_8.html">
       <img src="http://www.gold-joint.com/upload/epaper/photo_8_130915974764.jpg" width="30%" height="100%" />
                   <h2>第五期電子報</h2>
                   <p><h3>本期電子報的技術專欄是一篇關於重力式、懸臂式及景觀加勁擋土牆生命週期減碳的評估報告
       ,去年行政院規範公共建設的64項子計畫須有10%的比例,採用綠色工法、綠色材料或綠色商品
       ,從這篇報告結果顯示重力式及懸臂式擋土牆之CO2排放量幾乎為景觀加勁擋土牆的5~8倍
       ,此外加勁格網具有對土壤加勁的功能,牆面可噴植草籽或施工中於層間塞植具生根發芽能力的活枝條<h3></p></a></li>
    <li style="height:20%"><a href="http://www.gold-joint.com/upload/epaper/20110627142420_5.html">
     <img src="http://www.gold-joint.com/upload/epaper/photo_5_130802188871.jpg" width="30%" height="100%"/>
                   <h2>第四期電子報</h2>
                   <p><h3>仿岩預鑄疊磚以鋼筋混凝土為素材,由工廠一體成型生產出自然岩面造型並具結構安全性
       ,磚體之多階設計可加強上下磚体之互鎖性降低牆面因基礎差異沉陷及被填土壓造成之牆面局部破壞。
       另外,可配合連結件結合格網施工,做垂直、退皆、交丁與不交丁之堆疊方式設計出符合現地之坡度及樣式
       ,提高擋土牆穩定性<h3></p></a></li>
    <li style="height:20%"><a href="http://www.gold-joint.com/upload/epaper/20110627142447_4.html">
     <img src="http://www.gold-joint.com/upload/epaper/photo_4_130802185946.jpg" width="30%" height="100%"/>
                   <h2>第三期電子報</h2>
                   <p><h3>本期案例介紹摘選的是墨西哥海岸保護的成功案例,該海岸內側是當地極具經濟價值之鹽湖
       ,為避免海岸遭受侵蝕而導致鹽湖受到破壞,因此採用兼具環保且經濟之海岸保護工法 – 地工砂腸
       ,此案例不僅達到保護鹽湖的功效,對於海岸環境的影響也減到最小<h3></p></a></li>
    <li style="height:20%"><a href="http://www.gold-joint.com/upload/epaper/20110627142525_3.html">
     <img src="http://www.gold-joint.com/upload/epaper/photo_3_130802182712.jpg" width="30%" height="100%"/>
                   <h2>第二期電子報</h2>
                   <p><h3>本期電子報工程案例『仙區3林班9號隧道口邊坡處理工程』,是成功使用矩形錐立體植生網的實際案例
       ,技術專欄主題延續工程案例,介紹植生網相關的抗拉強度試驗規範,發燒話題是本期主角矩形錐立體植生網
       ,內容有植生網特色及不同的應用範圍及施工方式<h3></p></a></li>
    <li style="height:20%"><a href="http://www.gold-joint.com/upload/epaper/20110627142548_2.html">
     <img src="http://www.gold-joint.com/upload/epaper/photo_2_130802172775.jpg" width="30%" height="100%"/>
                   <h2>創刊號電子報</h2>
                   <p><h3>九月發行首期電子報,主要介紹國內外常用之各種生態工程之工法規劃設計、施工及相關地工合成材料之應用資訊
       、國內外技術專欄、相關論文等深入之專業技術內容,期望提供國內相關工程設計單位
       、主辦機關及學術單位對於生態工程應用之參考與交流。<h3></p></a></li>
   </ul>
  </div>
  <!-- /content -->

  <div data-role="footer" data-theme="b" style="height:8%">
   <h4>作者:Jim</h4>
  </div>
  <!-- /footer -->
 </div>
 <!-- /page -->

</body>
</html>


說明:Logo頁面2秒後就會跳到此主要內容頁面,條列方式出現個期電子報,點擊電子報就會開啟瀏覽器連結至網站的電子報

畫面:




後記:
整支程式其實不是很難,都是HTML,只寫到一點點JQuery,然後了解一下JQuery Mobile的ListView用法就能輕鬆寫出這支漂亮又實用的程式了。

開發此種Mobile App需有的認知:
1.雖然是內嵌在手機內的網頁,不過總歸它還是網頁,所以需要能連結網路

2.如果想離線的形式的話也是可以,但必須把圖片都存在APP內,這樣APP會很龐大
在手機應用程式如此計較儲存空間及效能的情況下,全放在APP內其實不太建議。

3.應用程式其實除了我這種寫法之外,其實還能用比較動態的寫法,就是用JSON
,打開APP後,應用程式會去遠端的網站抓資料(用JSON或XML傳送),抓下來後
用JQuery轉出寫入到手機內的html中,這種方法也是可以,可以省掉需要一直更新
我這種方法需要更新APP來更換APP的內容,有機會再來實作用JSON及WebService
的動態更新方式,謝謝歡賞,有問題歡迎留言或寄信給我。