1.首先下載JAVA JDK並安裝
路徑http://www.oracle.com/technetwork/java/javase/downloads/index.html
2.設定JDK環境
安裝完JDK後,記住安裝的路徑,在我的電腦按右鍵選內容>進階系統設定>進階>環境變數>系統變數>新增,增加一組參數變數名稱:JAVA_HOME ,變數值為安裝JDK的路徑,例如C:\Program Files\Java\jdk1.7.0_21.
3.下載AndroidStudio並安裝
路徑http://developer.android.com/sdk/installing/studio.html
附註:官方的訓練文件,可以參考
http://developer.android.com/intl/zh-tw/training/index.html
2013年9月11日 星期三
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",在使用上要注意
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();
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>
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就可以過濾出要顯示的資料
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
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
基本上的功能都差不多,在官方文件上是推薦使用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
2013年7月31日 星期三
JAVA程式撰寫格式規則
註解方式:
//這是單行註解
/*
多行註解1
多行註解2
多行註解3
多行註解4
*/
public class GetWebData3 //Class開頭大寫
{
public String getJson() //Method開頭小寫,如有兩個英文字組合,第二個英文字開頭大寫
{
String webLine = "abcd";//Variable開頭小寫,如有兩個英文字組合,第二個英文字開頭大寫
}
}
//這是單行註解
/*
多行註解1
多行註解2
多行註解3
多行註解4
*/
public class GetWebData3 //Class開頭大寫
{
public String getJson() //Method開頭小寫,如有兩個英文字組合,第二個英文字開頭大寫
{
String webLine = "abcd";//Variable開頭小寫,如有兩個英文字組合,第二個英文字開頭大寫
}
}
2013年7月22日 星期一
在ASP.NET中顯示由SQL產生的JSON格式
透過網頁的方式來傳遞資料給手機或平板等
,大多使用JSON的格式,但是一般使用JSON都要經過層層轉換,在程式撰寫上不甚便利,經過多方嘗試,找出最便利且快速的方式來產生JSON資料串.
由於只是單純呈現資料,不需版面等資料,所以新增一個泛型處理常式的頁面(ashx),在資料庫繫結的部分使用以下語法
SELECT A,B,C,D FROM TABLE_1 FOX XML AUTO,ROOT('TABLE_1')
即可由資料庫產生XML的結構檔,資料庫版本需為MS SQL2005以上版本才有支援,
ROOT('TABLE_1')一定要加上,不然會有錯誤產生.
轉換JSON使用目前評價最好的JSON.NET,在VISUAL STUDIO中,使用NuGet找到JSON.NET套件,安裝完就可以使用,使用前先宣告進來
完整程式碼如下
<%@ WebHandler Language="C#" Class="prog" %>
using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Xml;
using Newtonsoft.Json;
public class prog : IHttpHandler {
public void ProcessRequest (HttpContext context) {
using (SqlConnection conn = new SqlConnection (System.Web.Configuration.WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
conn.Open();
SqlCommand cmd1 = new SqlCommand("SELECT A,B,C,D FROM TABLE_1 FOX XML AUTO,ROOT('TABLE_1')", conn);
XmlDocument xDoc = new XmlDocument();
xDoc.Load(cmd1.ExecuteXmlReader());
string json = JsonConvert.SerializeXmlNode(xDoc);
context.Response.ContentType = "text/plain";
context.Response.Write(json);
}
}
public bool IsReusable {
get {
return false;
}
}
}
由於只是單純呈現資料,不需版面等資料,所以新增一個泛型處理常式的頁面(ashx),在資料庫繫結的部分使用以下語法
SELECT A,B,C,D FROM TABLE_1 FOX XML AUTO,ROOT('TABLE_1')
即可由資料庫產生XML的結構檔,資料庫版本需為MS SQL2005以上版本才有支援,
ROOT('TABLE_1')一定要加上,不然會有錯誤產生.
轉換JSON使用目前評價最好的JSON.NET,在VISUAL STUDIO中,使用NuGet找到JSON.NET套件,安裝完就可以使用,使用前先宣告進來
完整程式碼如下
<%@ WebHandler Language="C#" Class="prog" %>
using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Xml;
using Newtonsoft.Json;
public class prog : IHttpHandler {
public void ProcessRequest (HttpContext context) {
using (SqlConnection conn = new SqlConnection (System.Web.Configuration.WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
conn.Open();
SqlCommand cmd1 = new SqlCommand("SELECT A,B,C,D FROM TABLE_1 FOX XML AUTO,ROOT('TABLE_1')", conn);
XmlDocument xDoc = new XmlDocument();
xDoc.Load(cmd1.ExecuteXmlReader());
string json = JsonConvert.SerializeXmlNode(xDoc);
context.Response.ContentType = "text/plain";
context.Response.Write(json);
}
}
public bool IsReusable {
get {
return false;
}
}
}
訂閱:
文章 (Atom)