android create DB on sdcard(DB 1/2)

04 September 2010

android create db on sdcard

把DB建立在SD Card上其實很簡單。

先建立一個有關db操作的class,

注意,此範例尚無新增、查詢等method,將在下一篇介紹如何新增、查詢

此範例單純只有在sd card建立sqlite datebase

如下

public class db_sample {
public static final String STR_TABLE_NAME = "table_name"; //table名稱
public static final String STR_FIELD_ID = "field_id"; //欄位名稱
public static final String STR_FIELD_NAME = "field_name"; //欄位名稱
private static Context context;

public db_sample(Context context) {
this.context = context; //new這個class時,一定要傳入context,因為openOrCreateDatabase是由context底下的method
}

//建立table的method
public static final void fnCreateDB(){
//MODE_WORLD_WRITEABLE,只能有寫的權限
SQLiteDatabase dbwrite
= context.openOrCreateDatabase("/sdcard/hi_test.db", context.MODE_WORLD_WRITEABLE, null);

//建立table
String sql =
String.format("CREATE TABLE %s (%s INTEGER primary key autoincrement, %s text )"
, STR_TABLE_NAME
, STR_FIELD_ID
, STR_FIELD_NAME
);
dbwrite.execSQL(sql);
}


}




接著就在需要的地方呼叫即可~

public class test extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
db_sample db = new db_sample(this);
db.fnCreateDB();

}

}


read more »


android AsyncTask sample

02 September 2010

android 的AsyncTask

如果你可能要去download、request一個蠻龐大的網頁或者檔案時,

如果是在主要的activity、widget或其他中去作,

那麼想必你的activity、widget或其他的UI會像是被lock住!

很LAG的感覺!

那麼就使用AsyncTask吧!

顧名思義,就是非同步排程(應該可以這樣翻)==

AsyncTask的好處就是可以在background執行,

並不影響前端的UI

下面就是實作方法

先去new一個class並繼承AsyncTask

public class downloadTask extends AsyncTask<String, Void , String>{

public static int iFileSize = 0;
public static double dReadSum = 0;
public static boolean bIsDownload = false;

@Override
protected void onProgressUpdate(Void... values) {

//此method是在呼叫publishProgress()時的才會trigger到的
//可以當配progressBar來使用,這裡不多作說明。

super.onProgressUpdate(values);

}


@Override
protected void onPreExecute() {
//此method是在執行doInBackground以前,才會呼叫的
super.onPreExecute();
}

@Override
protected void onPostExecute(String result) {
//此method是在doInBackground完成以後,才會呼叫的
super.onPostExecute(result);
if (iFileSize == dReadSum){
Log.d("main","下載完成");
}

}

/*
*注意!strUrlFile是一個array..代表著在呼叫此class時
*可以帶入很多個參數(strUrlFile),
*如:new downloadTask().execute("http://www.xxx","http://www.xxx");
*/
protected String doInBackground(String... strUrlFile) {
URL urlFileLocation = null;
HttpURLConnection connFile = null;
try {
int iUrlCount = strUrlFile.length;
for (int i =0 ; i < iUrlCount ; i++){
urlFileLocation = new URL(strUrlFile[i]);
connFile = (HttpURLConnection) urlFileLocation.openConnection();
connFile.setDoInput(true);

InputStream is = connFile.getInputStream();
iFileSize = connFile.getContentLength(); //取得檔案大小

byte[] buffer = new byte[1024];
int len1 = 0;
dReadSum = 0;

while ( (len1 = is.read(buffer)) != -1) {
dReadSum += len1;
publishProgress(dReadSum*100/iFileSize);
}
}


} catch (Exception e) {
Log.d("main","download---" + e.toString());
}

return "";
}


}



呼叫此Class就只要一行:

 new downloadTask().execute("http://www.xxx"); 
/*
*注意,參數其實是可以很多個,如下
*new downloadTask().execute("http://www.xxx","http://www.xxx");
*這樣子此task就會去download兩次
*/









read more »


android parse xml

31 August 2010

android parse xml

在anroid parse xml其實有蠻多方法的

例如SAX(Simple API for XML)、DOM...

大家都知道用SAX來parse會較省記憶體。

但用SAX的麻煩就是必須自己去寫content handler...

但如果您的XML檔並不大,且去讀取的次數沒有很頻繁,

那麼還是建議您用DOM吧!較簡單!

實作方法如下:

 private static DocumentBuilder documentBuilder  = null;  
private static Document document = null;
private static NodeList elements = null;
private static int iElementLength= 0;

@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
try{

URL urlUpdate = new URL("http://www.xxx.xxx/xxx.xml");
documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
document = documentBuilder.parse(urlUpdate.openStream());
document.getDocumentElement().normalize();

/*
*其實簡單到我也不知該怎麼寫註解了,
*先get到你要的tag吧,記得回傳型態是NodeList,
*不要看我命名為elements,就以為他是Element
*/
elements = document.getElementsByTagName("update_images");
iElementLength=elements.getLength();
if (iElementLength ==0 )
return;

for (int i = 0; i < iElementLength ; i++) {
Element element = (Element) elements.item(i);
Log.d("main",element.getAttribute("pic_name"));
}
}catch (Exception e) {
Log.d("main",String.valueOf(e.toString()));
}

}


大概就是這樣!

read more »