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();
}
}
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兩次
*/
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()));
}
}
大概就是這樣!