day02 數(shù)據(jù)存儲(chǔ)方式

經(jīng)驗(yàn)總結(jié):1.開發(fā)中不經(jīng)常使用XML經(jīng)常使用JSON,開發(fā)中要寫單獨(dú)的UNIT單元測(cè)試類,單獨(dú)的工具類封包莱没,開發(fā)中bean不要使用私有,要共有酷鸦,如果使用bean的話或使用反射框架饰躲,消耗手機(jī)內(nèi)存 ,安卓開發(fā)文檔中有明確說明

問題:sharedpreference存儲(chǔ)在那個(gè)地方臼隔,默認(rèn)的sharedpreference存儲(chǔ)在哪嘹裂,生命周期是什么

1.點(diǎn)擊按鈕的4中監(jiān)聽方法

1.匿名內(nèi)部類

2.創(chuàng)建一個(gè)類實(shí)現(xiàn)OnclickListener,setOnClickListener時(shí)傳類的一個(gè)對(duì)象

3.讓當(dāng)前類實(shí)現(xiàn)OnclickListener,setOnClickListener時(shí)傳this,在公司開發(fā)中一般用這種方式摔握,用swich判斷是哪個(gè)按鈕

4.在布局文件中為控件添加一個(gè)onclick屬性寄狼,在對(duì)應(yīng)的activity中寫一個(gè)以onclick屬性值為名的方法,記住要 public, 名字對(duì)應(yīng),參數(shù)必須是View類型氨淌,內(nèi)部實(shí)現(xiàn)是反射技術(shù)泊愧。一般開發(fā)不用,簡單測(cè)試時(shí)使用.

2.安卓中的常用5大布局

1.線性布局 LinearLayout 垂直和水平 ; 要么從左到右盛正,要么從上到下

padding:當(dāng)前控件的子控件距離當(dāng)前控件的長度

margin: 當(dāng)前控件相對(duì)于四周控件或父控件的距離

layout_gravity:當(dāng)前控件相對(duì)于父控件的對(duì)其方式

gravity:當(dāng)前控件中的子控件相對(duì)于當(dāng)前控件的對(duì)其方式

2.相對(duì)布局 RelativeLayout 要指定每個(gè)控件之間的相對(duì)位置删咱,否則都從左上角開始布局

layout_above:位于哪個(gè)控件的上方

layout_below:位于哪個(gè)控件的下方

layout_toRightOf:位于哪個(gè)控件的右方

layout_toLeftOf:位于哪個(gè)控件的左方

layout_alignParentLeft:位于父窗體的左側(cè)

layout_alignParentRight:

layout_alignParentBottom

layout_alignParentTop:

layout_centerInParent:位于父窗體的中心

layout_alignLeft:與哪個(gè)控件的左側(cè)對(duì)其

layout_alignRigth:

layout_alignTop

layout_alignBottom

3.幀布局 FrameLayout 一層一層向上疊加布局

4.表格布局 TableLayout

TableLayout中的一個(gè)TableRow代表一行,TableRow中的一個(gè)控件代表一列

5.絕對(duì)布局 (被google拋棄)

3.測(cè)試的相關(guān)概念

1.按照是否知道代碼劃分

白盒測(cè)試 :知道源碼

黑盒測(cè)試 :不知道代碼

2.按照測(cè)試的粒度

a.方法測(cè)試

b.單元測(cè)試 Junit

c.系統(tǒng)測(cè)試

d.集成測(cè)試

3.按照測(cè)試的暴力程度

a.冒煙測(cè)試

b.壓力測(cè)試 12306

android中的壓力測(cè)試 : adb shell指令: monkey -p packagename count;

coun表示點(diǎn)擊多少下

百度云測(cè):第三方測(cè)試平臺(tái)

4將數(shù)據(jù)存儲(chǔ)到文件中

邏輯步驟:

1.寫布局

LinearLayout + RelativeLayout

兩個(gè)EditText 一個(gè) CheckBox 一個(gè)Button

2.寫業(yè)務(wù)邏輯

a.找到所需的控件

b.為按鈕設(shè)置點(diǎn)擊事件監(jiān)聽器

c.在onclick方法中獲取用戶輸入的用戶名豪筝,密碼腋腮,是否記住密碼

d.判斷用戶名密碼是否為kong,不為空,執(zhí)行登陸壤蚜,為null時(shí)提示用戶

e.執(zhí)行登陸 (默認(rèn)登陸成功,省略)

f.判斷是否記住密碼,記住密碼需要將密碼保存到本地

g.如果保存的有密碼徊哑,下次進(jìn)入程序袜刷,需要將用戶名密碼回顯。

***********使用Context對(duì)象獲取私有目錄:/data/data/packagename/files

String path = context.getFilesDir().getPath();

代碼:

存儲(chǔ)工具類

publicclassStoregeUtil {

Stringpath="/data/data/com.example.day02_login";

publicbooleansavedata(Context con,String name,String psw) {

//TODOAuto-generated method stub

String info=name+"##"+psw;

//??????????????FileOutputStream out=new FileOutputStream(new File(path,"info.txt"));

//??????????????out.write(info.getBytes());

try{

//使用該方法表示打開一個(gè)私有目錄的輸出流莺丑,不需要再確認(rèn)路徑著蟹,目錄路徑為/data/data/com.example.day02_login/file

FileOutputStream out=con.openFileOutput("info.txt", con.MODE_PRIVATE);

out.write(info.getBytes());

returntrue;

}catch(FileNotFoundException e) {

//TODOAuto-generated catch block

e.printStackTrace();

}catch(IOException e) {

//TODOAuto-generated catch block

e.printStackTrace();

}

returnfalse;

}

publicMap getinfo(Context con) {

//TODOAuto-generated method stub

try{

//??????????????FileInputStream in=new FileInputStream(new File(path,"info.txt"));

//

FileInputStream in=con.openFileInput("info.txt");

BufferedReader bf=newBufferedReader(newInputStreamReader(in));

String info=bf.readLine();

Map mp=newHashMap();

mp.put("name", info.split("##")[0]);

mp.put("psw", info.split("##")[1]);

returnmp;

}catch(FileNotFoundException e) {

//TODOAuto-generated catch block

e.printStackTrace();

}catch(IOException e) {

//TODOAuto-generated catch block

e.printStackTrace();

}

returnnull;

}

}

主類

publicclassMainActivityextendsActivityimplementsOnClickListener {

EditTextinput_name;

EditTextinput_psw;

CheckBoxcheck_rem;

StoregeUtilutil=newStoregeUtil();

@Override

protectedvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.login_index);

// 獲取需要的空間id

input_name= (EditText) findViewById(R.id.input_name);

input_psw= (EditText) findViewById(R.id.input_psw);

check_rem= (CheckBox) findViewById(R.id.check_remeberpsw);

Button bt_login = (Button) findViewById(R.id.bt_login);

bt_login.setOnClickListener(this);

Map map=util.getinfo(this);

if(map==null)

{

return;

}else

{

input_name.setText(map.get("name"));

input_psw.setText(map.get("psw"));

check_rem.setChecked(true);

}

}

@Override

publicvoidonClick(View v) {

intm = v.getId();

switch(m) {

caseR.id.bt_login:

String name =input_name.getText().toString().trim();

String string =input_psw.getText().toString();

//注意判斷輸入是否為空

if(TextUtils.isEmpty(name)||TextUtils.isEmpty(string))

{

Toast.makeText(this,"輸入不能為空",0).show();

return;

}

if(check_rem.isChecked())

{

booleanflag=util.savedata(this,name,string);

if(flag)

{

Toast.makeText(this,"保存數(shù)據(jù)成功",0).show();

}else

{

Toast.makeText(this,"保存數(shù)據(jù)失敗",0).show();

}

}

break;

default:

break;

}

}

}

5將數(shù)據(jù)存入SD卡

工具類

publicbooleansave(Context con, String name, String psw) {

//開啟輸出流

String info=name+"##"+psw;

try{

//???FileOutputStream out=con.openFileOutput("info", con.MODE_PRIVATE);

//獲取SD卡的路徑 ,路徑為/mnt/sccard/

String path=Environment.getExternalStorageDirectory().getPath();

FileOutputStream out=newFileOutputStream(newFile (path,"info.txt"));

out.write(info.getBytes());

returntrue;

}catch(FileNotFoundException e) {

//TODOAuto-generated catch block

e.printStackTrace();

}catch(IOException e) {

//TODOAuto-generated catch block

e.printStackTrace();

}

returnfalse;

}

publicMap returninfo(Context con) {

//TODOAuto-generated method stub

try{

String path=Environment.getExternalStorageDirectory().getPath();

FileInputStream in=newFileInputStream(newFile (path,"info.txt"));

Map mp=newHashMap();

BufferedReader br=newBufferedReader(newInputStreamReader(in));

mp.put("name",br.readLine().split("##")[0]);

mp.put("psw",br.readLine().split("##")[1]);

returnmp;

}catch(FileNotFoundException e) {

//TODOAuto-generated catch block

e.printStackTrace();

}catch(IOException e) {

//TODOAuto-generated catch block

e.printStackTrace();

}

returnnull;

}

}

主類

publicclassMainActivityextendsActivityimplementsOnClickListener{

SPutilsutil=newSPutils();

privateEditTextet_name;

privateEditTextet_psw;

privateCheckBoxcb_rem;

privateButtonbt_login;

protectedvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

et_name= (EditText)findViewById(R.id.et_name);

et_psw= (EditText)findViewById(R.id.et_psw);

cb_rem= (CheckBox)findViewById(R.id.cb_rem);

bt_login= (Button)findViewById(R.id.bt_login);

//注冊(cè)監(jiān)聽

bt_login.setOnClickListener(this);

if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))

{

Toast.makeText(this,"SD卡未能掛載", 0).show();

return;

}

//獲取回顯的數(shù)據(jù)

Map mp=util.returninfo(this);

if(mp!=null)

{

et_name.setText(mp.get("name"));

et_psw.setText(mp.get("psw"));

cb_rem.setChecked(true);

return;

}

}

@Override

publicvoidonClick(View v) {

String name=et_name.getText().toString().trim();

String psw=et_psw.getText().toString();

if(TextUtils.isEmpty(name)||TextUtils.isEmpty(psw))

{

Toast.makeText(this,"不能為空", 0).show();

return;

}

//檢查SD卡的狀態(tài),是否掛載梢莽,存儲(chǔ)量是否夠

if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))

{

Toast.makeText(this,"SD卡未能掛載", 0).show();

return;

}

longsize_free=Environment.getExternalStorageDirectory().getFreeSpace();

longsize_usable=Environment.getExternalStorageDirectory().getUsableSpace();

//String size_free1=Formatter.formatFileSize(this, size_free1);

//String size_usable1=Formatter.formatFileSize(this, size_usable1);

//判斷存儲(chǔ)空間是否足夠

//if(size_usable<100*1024*1024)

//?????????{

//??????????????Toast.makeText(this, "存儲(chǔ)空間不夠???? 為", 0).show();

//??????????????return;

//?????????}

if(util.save(this,name,psw))

{

Toast.makeText(this,"成功保存", 0).show();

}else

{

Toast.makeText(this,"沒有保存", 0).show();

}

}

6.sharepreference存儲(chǔ)數(shù)據(jù)

SharedPreferences數(shù)據(jù)是以xml方式存儲(chǔ)在data/data/私有目錄下的一個(gè)shared_pres文件夾下萧豆。

SharedPreferences一般用來存放一些標(biāo)記性的數(shù)據(jù),設(shè)置性的數(shù)據(jù)昏名。

工具類

publicclassSPutils {

publicMap returninfo(Context con) {

//TODOAuto-generated method stub

SharedPreferences sh=con.getSharedPreferences("info.txt", con.MODE_PRIVATE);

Map mp=newHashMap();

mp.put("name",sh.getString("name",null));

mp.put("psw",sh.getString("psw",null));

returnmp;

}

publicbooleansave(Context con, String name, String psw) {

//TODOAuto-generated method stub

//獲得sharedpreferece

SharedPreferences sh=con.getSharedPreferences("info.txt", con.MODE_PRIVATE);

Editor edit = sh.edit();

edit.putString("name", name);

edit.putString("psw", psw);

//確認(rèn)寫入

if(edit.commit())

{

returntrue;

}else{

returnfalse;}

}

7.xml解析

XML的序列化:

// 備份短信使用XmlSerializer

public static boolean backupSmsForAndroid(Context context,

ArrayList lists) {

try {

// 1.通過Xml類創(chuàng)建一個(gè)XmlSerializer對(duì)象

XmlSerializer xs = Xml.newSerializer();

// 2.設(shè)置XmlSerializer對(duì)象將xml寫入到哪個(gè)文件中涮雷。

xs.setOutput(context.openFileOutput("smsbackup2.xml",Context.MODE_PRIVATE), "utf-8");//os:寫入到哪個(gè)文件流中,encoding:流的編碼

// 3.使用XmlSerializer對(duì)象序列化一個(gè)xml聲明頭 encoding:xml的編碼 standalone:是否獨(dú)立

xs.startDocument("utf-8", true);

// 4.序列化一個(gè)根節(jié)點(diǎn) namespace:命名空間 name:標(biāo)簽的名稱

xs.startTag(null, "Smss");

// 5.循環(huán)遍歷list集合轻局,序列化一條條短信

for (SmsBean smsBean : lists) {

xs.startTag(null, "Sms");

//寫一個(gè)標(biāo)簽的屬性 namespace:命名空間 name:屬性的名稱 value :屬性的值

xs.attribute(null, "id", smsBean.id);

xs.startTag(null, "num");

xs.text(smsBean.num);//寫入一個(gè)標(biāo)簽的值

xs.endTag(null, "num");

xs.startTag(null, "msg");

xs.text(smsBean.msg);//寫入一個(gè)標(biāo)簽的值

xs.endTag(null, "msg");

xs.startTag(null, "date");

xs.text(smsBean.date);//寫入一個(gè)標(biāo)簽的值

xs.endTag(null, "date");

xs.endTag(null, "Sms");

}

// 6.序列化一個(gè)根節(jié)點(diǎn)的結(jié)束節(jié)點(diǎn)

xs.endTag(null, "Smss");

// 7.完成xml的寫入

xs.endDocument();

return true;

} catch (Exception e) {

e.printStackTrace();

}

return false;

}

pull解析XML(反序列化)

//恢復(fù)短信

public static int restoreSms(Context context) {

ArrayList lists = null;

SmsBean smsBean = null;

try{

//1.創(chuàng)建一個(gè)XmlPullParser對(duì)象

XmlPullParser xpp = Xml.newPullParser();

//2.設(shè)置要解析的文件的流 in :讀取流 encoding:流的編碼

xpp.setInput(context.openFileInput("smsbackup2.xml"),"utf-8");

//3.獲取xml第一行的事件類型

int type = xpp.getEventType();

//4.循環(huán)判斷事件類型是否文檔結(jié)束

while (type!= XmlPullParser.END_DOCUMENT) {

String currentTagName = xpp.getName(); //獲取當(dāng)前標(biāo)簽的名稱

//5.不是文檔結(jié)束洪鸭,判斷是開始標(biāo)簽還是結(jié)束標(biāo)簽样刷,解析每一行的內(nèi)容以bean的方式封裝到list集合中,并且獲取下一行事件 的類型览爵。

switch (type) {

case XmlPullParser.START_TAG:

if("Smss".equals(currentTagName)){

//初始化一個(gè)list集合

lists = new ArrayList();

}else if("Sms".equals(currentTagName)){

//初始化一個(gè)SmsBean對(duì)象置鼻,并解析出id

smsBean = new SmsBean();

smsBean.id = xpp.getAttributeValue(null, "id");

}else if("num".equals(currentTagName)){

smsBean.num = xpp.nextText();//獲取內(nèi)容

}else if("msg".equals(currentTagName)){

smsBean.msg = xpp.nextText();//獲取內(nèi)容

}else if("date".equals(currentTagName)){

smsBean.date = xpp.nextText();//獲取內(nèi)容

}

break;

case XmlPullParser.END_TAG:

//當(dāng)前標(biāo)簽是結(jié)束標(biāo)簽并且是sms那么就將bean對(duì)象添加到list集合中

if ("Sms".equals(currentTagName)) {

lists.add(smsBean);

}

break;

default:

break;

}

//獲取下一行的事件類型

type = xpp.next();

}

//6.返回集合的size就是成功恢復(fù)的條數(shù)

return lists.size();

}catch (Exception e) {

e.printStackTrace();

}

return 0;

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜓竹,隨后出現(xiàn)的幾起案子箕母,更是在濱河造成了極大的恐慌,老刑警劉巖俱济,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘶是,死亡現(xiàn)場離奇詭異,居然都是意外死亡姨蝴,警方通過查閱死者的電腦和手機(jī)俊啼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來左医,“玉大人授帕,你說我怎么就攤上這事「∩遥” “怎么了跛十?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秕硝。 經(jīng)常有香客問我芥映,道長,這世上最難降的妖魔是什么远豺? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任奈偏,我火速辦了婚禮,結(jié)果婚禮上躯护,老公的妹妹穿的比我還像新娘惊来。我一直安慰自己,他們只是感情好棺滞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布裁蚁。 她就那樣靜靜地躺著,像睡著了一般继准。 火紅的嫁衣襯著肌膚如雪枉证。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天移必,我揣著相機(jī)與錄音室谚,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舞萄,可吹牛的內(nèi)容都是我干的眨补。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼倒脓,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼撑螺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起崎弃,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤甘晤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后饲做,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體线婚,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年盆均,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塞弊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泪姨,死狀恐怖游沿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肮砾,我是刑警寧澤诀黍,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站仗处,受9級(jí)特大地震影響眯勾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜婆誓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一吃环、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洋幻,春花似錦郁轻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽故觅。三九已至厂庇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間输吏,已是汗流浹背权旷。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拄氯。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓躲查,卻偏偏與公主長得像,于是被迫代替她去往敵國和親译柏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子镣煮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容