2013年8月27日 星期二

Android SQLite用法

首先新增一個Class,名稱訂為DbHelper

package com.example.myapplication;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;


public class DbHelper extends SQLiteOpenHelper {
    public static final int DATABASE_VERSION = 1;  //資料庫版本
    public static final String DATABASE_NAME = "dataBase.db";  //資料庫名稱
    public static final  String TABLE_NAME="tableName";  //資料表名稱


    public DbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

//新增資料表動作
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE "+TABLE_NAME+" (chnl varchar(10),progdate varchar(10),playdate varchar(10),playtime varchar(5),progname varchar(50))");
    }

//資料庫升級動作,目前資料庫版本號碼和程式上定義的不同時,就會觸發升級動作
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS "+ TABLE_NAME);
        onCreate(db);
    }


在MainActivity.java中加入

//新增資料進資料庫
        public void addDb(String chnl,String progdate,String playdate,String playtime,String progname){           
            SQLiteDatabase db =dbHelper.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put("chnl", chnl);
            values.put("progdate",progdate);
            values.put("playdate",playdate);
            values.put("playtime",playtime);
            values.put("progname",progname);
             //第一個值為table名稱,第二個值為當insert值為空時,會由null值取代,因為不允許值為空白,第三個值為新增的值
            db.insert("progPlay", null, values);
        }


//刪除資料
        public void delDb() {
            SQLiteDatabase db =dbHelper.getWritableDatabase();       
            //第一個值為資料表名稱,第二個值為條件,如果設為?號,可由第三個值裡的陣列值來套用
            db.delete("progPlay","chnl=?",new String[] { "001" });
       
        }

//取出資料庫裡的資料
public void viewDataBase(String chnl){
        Cursor cursor=dbHelper.getReadableDatabase().rawQuery("select * from progPlay where chnl='"+chnl+"'",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++) {              
                sNote[i]=cursor.getString(0)+" "+cursor.getString(1);
                cursor.moveToNext();//將指標移至下一筆資料
            }
            }
        cursor.close(); //關閉Cursor    
        }

SQLite使用上須注意幾點,SQLite沒有日期格式,日期只能以字串的方式存入,如果要篩選某個日期時可用where datetime('日期欄位名稱')=datetime('2013-08-01'),要注意日期的格式"2013-8-1"不等於"2013-08-01",在使用上要注意

Android常用函數

//取得部分字串
String string="abcd1234";
string.substring(0,3);//第一個值為字串起始位置,由0開始,第二個值為取的字串長度,所以由0開始取3碼,會取得abc

//字串比較
String string1="abcdef";
String string2="abcdef1234";
string1.equals(string2);


//數字轉字串
Integer.toString(12345);

String.valueOf(12345);


//布林轉字串
Boolean.toString(true)


//彈出視窗用法
Toast.makeText(getApplicationContext(),"彈出視窗",Toast.LENGTH_LONG).show();


//由程式自動觸發onclick動作
Button button = (Button)getBaseView().findViewById(R.id.button1);
button..performClick();

2013年8月26日 星期一

Android取得JSON資料

須先引用以下
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;


 //檢查網路連線狀況
    public void chkNetwork(){
        ConnectivityManager connMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            Log.d("CHECK_POINT", "網路連線中 " );
            textView1.setText("網路連線中");
            //呼叫AsyncTask
            new  DownloadWebpageTask().execute();

        } else {
            Log.d("CHECK_POINT", "網路斷線 ");
            textView1.setText("網路斷線");
        }
    }



//使用AsyncTask,因為Android4.0之後,網路操作必須放在Thread裡執行,AsyncTask後面的三個參數為1.Params,啟動任務執行的輸入參數2.Progress,後台任務執行的百分比3.Result,後台計算的結果類型,假如一個類型不被使用,可以簡單地使用 Void類型
    private class DownloadWebpageTask extends AsyncTask<Void,Integer,String[]>
    {
     
        @Override
        //要在背景中做的事
        protected String[]  doInBackground(Void... params) {
            try {
                return getWebData();
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }        
        }



        //@Override
        //背景工作處理完"後"需作的事
       protected void onPostExecute(String[] result) {
            super.onPostExecute(result);
           textView1.setText(result[1]);
        
           //進度BAR消失
           ProgressBar pb=(ProgressBar)findViewById(R.id.progressBar);
           pb.setVisibility(-1);       
        }

        //取得網路資料
        public String[] getWebData() throws IOException{
            URL url=new URL("http://XXX.XXX.XXX.XXX");
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            conn.setReadTimeout(10000 /* milliseconds */);
            conn.setConnectTimeout(15000 /* milliseconds */);
            conn.setRequestMethod("GET");
            conn.setDoInput(true);        
            conn.connect();
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String jsonString= reader.readLine();
            reader.close();
      
            try {
                return (getJson(jsonString));
            } catch (JSONException e) {
                e.printStackTrace();
                return null;
            }
        
        }

//JSOM

 //將JSON字串解析
        public String[]  getJson(String jsonString) throws JSONException {
            //如果是巢狀JSON字串,須分兩次來取資料
            JSONObject jsonObject=new JSONObject(jsonString);
            JSONObject jsonObject2=new JSONObject(jsonObject.getString("JsonString"));
            JSONArray jsonArray=jsonObject2.getJSONArray("PROGTAB");
            String[] jsonString2=new String[jsonArray.length()];
            delDb();
            for(int i=0;i<jsonArray.length();i++)
            {
                //Log.d("DEBUG_TAG", String.valueOf(i));
                jsonString2[i]=jsonArray.getJSONObject(i).getString("@PLAYDT").substring(11,16)+"     "+jsonArray.getJSONObject(i).getString("@PROGNAME");
             
            }
            return jsonString2;
}


在AndroidManifest.xml裡要加上以下權限,才能取得網路資料
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

Android除錯方式

可在程式中加入
Log.d("CHECK_POINT", "可直接輸入字串或承接變數");
來檢查程式目前執行到的地方,或是直接顯示變數的資料.

在devices logcat中的篩選欄位輸入CHECK_POINT就可以過濾出要顯示的資料

Android日期函數

需要IMPORT
android.text.format.Time


Time time=new Time();或Time time=new Time("GMT+8")加上時區資料

time.setToNow();  //取得系統目前日期時間

int year=time.year;  //取得西元年

int month=time.month;  //取得月份[0-11],需要加1來轉換

int day=time.monthDay;  //取得日期[1-31]

int hour=time.hour;  //取得小時[0-23]

int minute =time.minute;  //取得分鐘[0-59]

int second=time.second;  //取得秒[0-61]


其餘可參考連結
http://developer.android.com/reference/android/text/format/Time.html#MONTH

2013年8月14日 星期三

Android’s HTTP Clients

在Android上要連接上網路,有Apache HTTP Client及HttpURLConnection.

基本上的功能都差不多,在官方文件上是推薦使用HttpURLConnection,理由是API檔案較Apache HTTP Client來的小,而且是最早期開發的元件之一,穩定性較高,網路連接的效率比較高,對電力的損耗也較低.

不過HttpURLConnection在某些Android版本上有問題,開發版本是用於Eclair(2.0 or 2.1)或Froyo(2.2)會推薦使用Apache HTTP Client元件,Gingerbread(2.3)或更高的版本則推薦使用HttpURLConnection.

參考資料:http://android-developers.blogspot.tw/2011/09/androids-http-clients.html