《Google Android開發(fā)技術(shù)》課件第6章_第1頁
《Google Android開發(fā)技術(shù)》課件第6章_第2頁
《Google Android開發(fā)技術(shù)》課件第6章_第3頁
《Google Android開發(fā)技術(shù)》課件第6章_第4頁
《Google Android開發(fā)技術(shù)》課件第6章_第5頁
已閱讀5頁,還剩172頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第6章Android數(shù)據(jù)訪問技術(shù)6.1SharedPreferences文件訪問

6.2流文件操作

6.3SQLite關(guān)系數(shù)據(jù)庫

6.4內(nèi)容提供者(ContentProvider)

6.5小結(jié)

6.1SharedPreferences文件訪問

SharedPreferences文件是XML格式的文件,它由字段組成,每個字段包括一個鍵值和字段值。鍵值是自定義常數(shù),用于檢索該字段的值。調(diào)用如下語句:

SharedPreferencessharedPref=getPreferences(MODE_PRIVATE);

調(diào)用sharedPref對象的getString、getInt、getFloat、getBoolean、getLong和getStringSet等方法,可從SharedPreferences文件中讀出相應(yīng)類型的數(shù)據(jù),例如getString從SharedPreferences文件讀出字符串?dāng)?shù)據(jù)。讀取數(shù)據(jù)時,需要指定鍵值,例如:

Stringstr1=sharedPref.getString("USER1","USER");向SharedPreferences文件中寫入數(shù)據(jù),需要借助SharedPreferences.Editor接口,如下所示定義接口對象:

SharedPreferences.Editoreditor=sharedPref.edit();

調(diào)用對象editor的putString、putInt、putFloat、putBoolean、putLong和putStringSet等方法向SharedPreferences文件中寫入相應(yīng)數(shù)型的數(shù)據(jù)。putString是寫入字符串?dāng)?shù)據(jù),寫入字符串時需要指定鍵值,例如:

editor.putString("USER1","張恩赫");

mit();//editor.apply();

例6.1SharedPreferences文件訪問實例。

新建工程ex06_01,應(yīng)用名為MyPreferencesApp,包名為cn.jxufe.zhangenhe,活動界面名為MyPreferencesAct。工程ex06_01實現(xiàn)的功能如圖6-1所示。工程06_01啟動后顯示如圖6-1(a)所示界面,該界面對應(yīng)著布局文件main.xml。在圖6-1(a)中輸入用戶名“張恩赫”和密碼“123456”,如圖6-1(b)所示。圖6-1工程ex06_01執(zhí)行結(jié)果在Eclipse軟件的DDMS環(huán)境下,從FileExplorer窗口中可以查看到SharedPreferences文件的存儲位置,如圖6-2所示。這里生成的SharedPreferences文件為MyPreferencesAct.xml即圖6-2中圈住的文件。將該文件通過圖6-2右上角的快捷按鈕(即右上角圈住的快捷鈕)下載到計算機中,用UltraEdit等文本編輯軟件可查看其內(nèi)容如下:

1<?xmlversion='1.0'encoding='utf-8'standalone='yes'?>

2<map>

3<stringname="SECRET1">123456</string>

4<stringname="USER2">張云植</string>

5<stringname="SECRET2">654321</string>

6<stringname="USER1">張恩赫</string>

7</map>圖6-2MyPreferencesAct.xml文件存儲位置工程ex06_01包括源文件MyPreferencesAct.java、活動界面布局文件main.xml、列表框控件布局文件userlist.xml、漢字字符串資源文件mystrings_hz.xml和顏色資源文件myguicolor.xml等。其中,myguicolor.xml文件與工程ex05_10中的同名文件內(nèi)容相同,而文件mystrings_hz.xml文件的內(nèi)容如下所示:

1<?xmlversion="1.0"encoding="utf-8"?>

2<resources>

3<stringname="myuser">請輸入用戶名:</string>

4<stringname="mysecret">請輸入密碼:</string>

5<stringname="myadd">添加</string>

6<stringname="mydel">刪除</string>

7<stringname="mydisp">查看用戶</string>

8<stringname="mydelall">清除記錄</string>

9</resources>

活動界面布局文件main.xml對應(yīng)于圖6-1所示的界面,其代碼如下所示:

1<?xmlversion="1.0"encoding="utf-8"?>

2<AbsoluteLayout

3android:id="@+id/widget0"

4android:layout_width="fill_parent"

5android:layout_height="fill_parent"

6xmlns:android="/apk/res/android"

7android:background="@drawable/darkgray"

8>

9<TextView

10android:id="@+id/widget29"

11android:layout_width="wrap_content"

12android:layout_height="50px"

13android:text="@string/myuser"

14android:layout_x="20px"

15android:layout_y="20px"

16>

17</TextView>第9~17行為靜態(tài)文本框控件,對應(yīng)于圖6-1(a)中的“請輸入用戶名:”。

18<EditText

19android:id="@+id/etuser"

20android:layout_width="280px"

21android:layout_height="60px"

22android:text=""

23android:textSize="16sp"

24android:layout_x="180px"

25android:layout_y="10px"

26>

27</EditText>第18~27行的編輯框?qū)?yīng)于圖6-1(b)中顯示了“張恩赫”的編輯框。

28<TextView

29android:id="@+id/widget30"

30android:layout_width="wrap_content"

31android:layout_height="50px"

32android:text="@string/mysecret"

33android:layout_x="20px"

34android:layout_y="90px"

35>

36</TextView>第28~36行的靜態(tài)文本框?qū)?yīng)于圖6-1(a)中的“請輸入密碼:”。

37<EditText

38android:id="@+id/etsecret"

39android:layout_width="280px"

40android:layout_height="60px"

41android:text=""

42android:textSize="16sp"

43android:layout_x="180px"

44android:layout_y="80px"

45>

46</EditText>第37~46行的編輯框?qū)?yīng)于圖6-1(b)中輸入了“123456”的編輯框。

47<Button

48android:id="@+id/btadd"

49android:layout_width="120px"

50android:layout_height="60px"

51android:text="@string/myadd"

52android:layout_x="20px"

53android:layout_y="150px"

54android:onClick="myAddMD"

55>

56</Button>第47~56行的命令按鈕對應(yīng)于圖6-1(a)中的“添加”按鈕,其點擊事件方法名為myAddMD。

57<Button

58android:id="@+id/btdel"

59android:layout_width="120px"

60android:layout_height="60px"

61android:text="@string/mydel"

62android:layout_x="180px"

63android:layout_y="150px"

64android:onClick="myDelMD"

65>

66</Button>第57~66行的命令按鈕對應(yīng)于圖6-1(a)中的“刪除”按鈕,其點擊事件方法名為myDelMD。

67<Button

68android:id="@+id/btdelall"

69android:layout_width="120px"

70android:layout_height="60px"

71android:text="@string/mydelall"

72android:layout_x="340px"

73android:layout_y="150px"

74android:onClick="myDelallMD"

75>

76</Button>第67~76行的命令按鈕對應(yīng)于圖6-1(a)中的“清除記錄”按鈕,其點擊事件方法名為myDelallMD。

77<ListView

78android:id="@+id/lvcont"

79android:layout_width="360px"

80android:layout_height="400px"

81android:layout_x="60px"

82android:layout_y="220px"

83android:scrollbars="vertical"

84>

85</ListView>第77~85行的列表框控件對應(yīng)于圖6-1(d)中顯示了“張恩赫123456”等的列表。

86<Button

87android:id="@+id/btdisp"

88android:layout_width="160px"

89android:layout_height="60px"

90android:text="@string/mydisp"

91android:layout_x="160px"

92android:layout_y="640px"

93android:onClick="myDispMD"

94>

95</Button>

96</AbsoluteLayout>主活動界面main.xml中有一個列表框控件lvcont,如上述代碼的第77~85行所示。該控件需要一個布局文件,由于這里在列表框的每一行中顯示了兩個文本信息,因此列表框的布局文件中需放置兩個TextView控件。列表框lvcont的布局文件userlist.xml內(nèi)容如下所示:

1<?xmlversion="1.0"encoding="utf-8"?>

2<AbsoluteLayout

3android:id="@+id/widget0"

4android:layout_width="fill_parent"

5android:layout_height="fill_parent"

6xmlns:android="/apk/res/android"

7>

8<TextView

9android:id="@+id/user_name"

10android:layout_width="wrap_content"

11android:layout_height="wrap_content"

12android:text="TextView"

13android:layout_x="10px"

14android:layout_y="10px"

15android:textColor="@drawable/yellow"

16>

17</TextView>

18<TextView

19android:id="@+id/user_secret"

20android:layout_width="wrap_content"

21android:layout_height="wrap_content"

22android:text="TextView"

23android:layout_x="160px"

24android:layout_y="10px"

25android:textColor="@drawable/yellow"

26>

27</TextView>

28</AbsoluteLayout>源程序文件MyPreferencesAct.java可分為五個部分,即onCreate方法(或myInitGUI方法)、點擊圖6-1(a)中“添加”按鈕的方法myAddMD、點擊“刪除”按鈕的方法myDelMD、點擊“清除記錄”按鈕的方法myDelallMD以及點擊“查看用戶”按鈕的方法myDispMD。文件MyPreferencesAct.java的代碼如下所示:

1packagecn.jxufe.zhangenhe;

2

3importjava.util.ArrayList;

4importjava.util.HashMap;

5importandroid.app.Activity;

6importandroid.content.SharedPreferences;

7importandroid.os.Bundle;

8importandroid.view.View;

9importandroid.widget.AdapterView;

10importandroid.widget.AdapterView.OnItemClickListener;

11importandroid.widget.EditText;

12importandroid.widget.ListView;

13importandroid.widget.SimpleAdapter;

14

15publicclassMyPreferencesActextendsActivity{

16 privateintnumber;

17 privatefinalintMAXREC=1000;

18privateListViewlvUsers;

19privateEditTextetUser,etSecret;

20privateHashMap<String,String>map;

21 /**Calledwhentheactivityisfirstcreated.*/

22@Override

23publicvoidonCreate(BundlesavedInstanceState){

24super.onCreate(savedInstanceState);

25setContentView(R.layout.main);

26myInitGUI();

27}

28privatevoidmyInitGUI(){

29 etUser=(EditText)findViewById(R.id.etuser);

30 etSecret=(EditText)findViewById(R.id.etsecret);

31 lvUsers=(ListView)findViewById(R.id.lvcont);

32 lvUsers.setOnItemClickListener(newOnItemClickListener(){第69~85行為點擊圖6-1(a)中的“添加”按鈕的事件響應(yīng)方法。如果輸入密碼的編輯框為空字符串(第70行為真),則沒有操作(第70~71行為空);否則,說明輸入有效,第73行獲得SharedPreferences對象sharedPref。第74行得到SharedPreferences.Editor接口對象editor;第75行將記錄數(shù)number加1;第76、77行將用戶名編輯框中的字符串寫入editor中,第78行調(diào)用commit方法將editor中的數(shù)據(jù)寫入對象sharedPref所表示的文件中;第79~81行將密碼編輯框中的內(nèi)容寫入對象sharedPref所表示的文件中;第82、83行清空用戶名和密碼輸入編輯框中的顯示。因此,方法myAddMD實現(xiàn)的功能為:將輸入的用戶名和密碼添加到SharedPreferences文件中,該文件的記錄數(shù)加1,寫入的數(shù)據(jù)的鍵值為“USER”和“SECRET”加上記錄數(shù)。需要注意的是,寫入記錄的編號必須是小到大的,否則與列表項的值不對應(yīng)。

129publicvoidmyDelallMD(Viewv){

130 SharedPreferencessharedPref=getPreferences(MODE_PRIVATE);

131 SharedPreferences.Editoreditor=sharedPref.edit();

132 editor.clear();

133 editor.apply();

134 number=0;

135 etUser.setText("");

136 etSecret.setText("");

137}

第129~137行為圖6-1(a)中“清除記錄”按鈕的點擊事件,該方法清除文件中的所有記錄(第132、133行),并設(shè)置記錄數(shù)number為0(第134行)。

例6.2

用SharedPreferences指定存儲文件名訪問實例。

例6.1中訪問的SharedPreferences文件與活動界面名同名,而且無法指定其文件名,因為其調(diào)用的方法為活動界面對象的getPreferences方法,該方法又調(diào)用getSharedPreferences方法創(chuàng)建文件對象。程序員可以直接調(diào)用getSharedPreferences方法創(chuàng)建SharedPreferences文件,如下所示:

SharedPreferencessharedPref=getApplicationContext()

.getSharedPreferences("userinfo",MODE_PRIVATE);執(zhí)行工程ex06_02,其執(zhí)行情況與工程ex06_01完全相同,如圖6-3所示??梢栽趫D6-4中找到自定義的文件userinfo.xml,假設(shè)此時文件中包含有如圖6-3所示的兩條記錄,則文件userinfor.xml的內(nèi)容如下所示:

1<?xmlversion='1.0'encoding='utf-8'standalone='yes'?>

2<map>

3<stringname="SECRET1">124578</string>

4<stringname="SECRET2">987654</string>

5<stringname="USER2">張云植</string>

6<stringname="USER1">張恩赫</string>

7</map>圖6-3工程ex06_02執(zhí)行結(jié)果圖圖6-4userinfo.xml文件存儲位置

6.2流?文?件?操?作

Android系統(tǒng)的文件操作與Java語言下的文件操作程序設(shè)計方法相同。由于Android系統(tǒng)對資源的訪問有一定的權(quán)限限制,因此在訪問文件時,應(yīng)使用Activity的創(chuàng)建文件方法創(chuàng)建文件,在訪問外部SD卡時,需要給應(yīng)用程序賦予一定的權(quán)限。

Activity創(chuàng)建文件的典型方法如下所示:

1FileInputStreamfis=this.openFileInput("userinfo.txt");

2FileOutputStreamfos=this.openFileOutput("temp.txt",MODE_PRIVATE);第1行為打開文件userinfo.txt,并使該文件作為輸入流即從該文件中讀取數(shù)據(jù)。第2行打開文件temp.txt,MODE_PRIVATE系統(tǒng)常量指定該文件的打開方法為私有的即只能在該活動界面內(nèi)訪問,且把該文件作為輸出流即向該文件中寫入數(shù)據(jù)。當(dāng)直接使用FileInputStream或FileOutputStream進入文件讀寫時,讀出或?qū)懭氲臄?shù)據(jù)為字節(jié)型數(shù)據(jù)。當(dāng)要對文件進行字符或字符串的讀寫操作時,需要借助以下方法:

1FileInputStreamfis=this.openFileInput("userinfo.txt");

2InputStreamReaderfr=newInputStreamReader(fis);

3FileOutputStreamfos=this.openFileOutput("temp.txt",MODE_PRIVATE);

4OutputStreamWriterfw=newOutputStreamWriter(fos);

例6.3

流文件操作實例。

例6.3的執(zhí)行結(jié)果與例6.2完全相同,這里采用流文件的方法保存用戶名和密碼信息。新建工程ex06_03,應(yīng)用名為MyFileOpApp,包名為cn.jxufe.zhangenhe,活動界面名為MyFileOpAct。工程ex06_03包括源文件MyFileOpAct.java、活動界面布局文件main.xml、列表框布局文件userlist.xml、漢字字符串資源文件mystrings_hz.xml和顏色資源文件myguicolor.xml。其中,除了文件MyFileOpAct.java外,其余文件均與工程ex06_02中的同名文件內(nèi)容完全相同。

文件MyFileOpAct.java與工程ex06_02中的MyPreferencesAct.java相似,主要包括活動界面啟動方法onCreate和圖6-1(a)中按鈕“添加”、“刪除”“清除記錄”與“查看用戶”的點擊事件方法。下面通過文件MyFileOpAct.java的代碼依次介紹各個方法的工作原理。

1packagecn.jxufe.zhangenhe;

2

3importjava.io.FileInputStream;

4importjava.io.FileNotFoundException;

5importjava.io.FileOutputStream;

6importjava.io.IOException;

7importjava.io.InputStreamReader;

8importjava.io.OutputStreamWriter;

9importjava.util.ArrayList;

10importjava.util.HashMap;

11importandroid.app.Activity;

12importandroid.os.Bundle;

13importandroid.view.View;

14importandroid.widget.AdapterView;

15importandroid.widget.AdapterView.OnItemClickListener;第50~79行讀出文件內(nèi)容的算法,如圖6-5所示。圖6-5第50~79行讀出文件內(nèi)容并顯示與記錄號匹配的記錄

112 e2.printStackTrace();

113 }

114 finally{

115 try{

116 fw.close();

117 fos.close();

118 }catch(IOExceptione3){

119 e3.printStackTrace();

120 }

121 }

122 }catch(FileNotFoundExceptione1){

123 e1.printStackTrace();

124 }

125 }

126}

127publicvoidmyDelMD(Viewv){

128 if(etSecret.getText().toString().equals("")){

129 }

130 else{

131 intloc=0;

132 try{

133 intch;

134 char[]chusr=newchar[30];

135 char[]chsec=newchar[30];

136 FileInputStreamfis=MyFileOpAct.this.openFileInput("userinfo.txt");

137 InputStreamReaderfr=newInputStreamReader(fis);

138 try{

139 intj=0;

140 intk=0;

141 intm=0;

142 intrecnum=1;

143 intjump=0;

144 while((ch=fr.read())!=-1){

145 if(ch!=32){

146 if(j==0){

147 chusr[k++]=(char)ch;

148 }

149 else{

150 chsec[m++]=(char)ch;

151 }

152 }

153 if(ch==32){

154 if(j==0){

155 j=1;

156 Stringstr=newString(chusr,0,k);

157 k=0;

158 if(str.equals(etUser.getText().toString())){

159 etUser.setText(str);

160 jump=1;

161 }

162 }

163 else{

164 j=0;

165 Stringstr=newString(chsec,0,m);

166 m=0;

167 recnum=recnum+1;

168 if(str.equals(etSecret.getText().toString())){

169 if(jump==1){

170 loc=recnum-1;

171 etUser.setText("");

172 etSecret.setText("");

173 break;

174 }

175 }

176 else{

177 jump=0;

178 }

179 }

180 }

181 }

182 }catch(IOExceptione){

183 e.printStackTrace();

184 }

185 finally{

186 try{

187 fr.close();

188 fis.close();

189 }catch(IOExceptione){

190 e.printStackTrace();

191 }

192 }

193 }catch(FileNotFoundExceptione1){

194 e1.printStackTrace();

195 }

196

197 if(loc>0){

198 try{

199 intch;

200 char[]chusr=newchar[30];

201 char[]chsec=newchar[30];

202 FileInputStreamfis=MyFileOpAct.this

203 .openFileInput("userinfo.txt");

204 InputStreamReaderfr=newInputStreamReader(fis);

205 FileOutputStreamfos=this.openFileOutput("temp.txt",

206 MODE_PRIVATE);

207 OutputStreamWriterfw=newOutputStreamWriter(fos);

208 try{

209 intj=0;

210 intk=0;

211 intm=0;

212 intrecnum=1;

213 while((ch=fr.read())!=-1){

214 if(ch!=32){

215 if(j==0){

216 chusr[k++]=(char)ch;

217 }

218 else{

219 chsec[m++]=(char)ch;

220 }

221 }

222 if(ch==32){

223 if(j==0){

224 j=1;

225 Stringstr=newString(chusr,0,k);

226 k=0;

227 if(loc==recnum){

228 }

229 else{

230 fw.write(str+"");

231 }

232 }

233 else{

234 j=0;

235 Stringstr=newString(chsec,0,m);

236 m=0;

237 recnum=recnum+1;

238 if(loc+1==recnum){

239 }

240 else{

241 fw.write(str+"");

242 }

243 }

244 }

245 }

246 }catch(IOExceptione){

247 e.printStackTrace();

248 }

249 finally{

250 try{

251 fr.close();

252 fis.close();

253 fw.close();

254 fos.close();

255 }catch(IOExceptione){

256 e.printStackTrace();

257 }

258 }

259 }catch(FileNotFoundExceptione1){

260 e1.printStackTrace();

261 }

262

263 try{

264 intch;

265 char[]chusr=newchar[30];

266 char[]chsec=newchar[30];

267 FileInputStreamfis=MyFileOpAct.this.openFileInput("temp.txt");

268 InputStreamReaderfr=newInputStreamReader(fis);

269 FileOutputStreamfos=this.openFileOutput("userinfo.txt",

270 MODE_PRIVATE);

271 OutputStreamWriterfw=newOutputStreamWriter(fos);

272 try{

273 intj=0;

274 intk=0;

275 intm=0;

276 while((ch=fr.read())!=-1){

277 if(ch!=32){

278 if(j==0){

279 chusr[k++]=(char)ch;

280 }

281 else{

282 chsec[m++]=(char)ch;

283 }

284 }

285 if(ch==32){

286 if(j==0){

287 j=1;

288 Stringstr=newString(chusr,0,k);

289 k=0;

290 fw.append(str+"");

291 }

292 else{

293 j=0;

294 Stringstr=newString(chsec,0,m);

295 m=0;

296 fw.append(str+"");

297 }

298 }

299 }

300 }catch(IOExceptione){

301 e.printStackTrace();

302 }

303 finally{

304 try{

305 fr.close();

306 fis.close();

307 fw.close();

308 fos.close();

309 }catch(IOExceptione){

310 e.printStackTrace();

311 }

312 }

313 }catch(FileNotFoundExceptione1){

314 e1.printStackTrace();

315 }

316 }

317 }

318}

319publicvoidmyDelallMD(Viewv){

320 try{

321 FileOutputStreamfos=this.openFileOutput("userinfo.txt",

322 MODE_PRIVATE);

323 OutputStreamWriterfw=newOutputStreamWriter(fos);

324 try{

325 fw.write("");

326 }

327 catch(IOExceptione){

328 e.printStackTrace();

329 }

330 finally{

331 try{

332 fw.close();

333 fos.close();

334 }

335 catch(IOExceptione){

336 e.printStackTrace();

337 }

338 }

339 }

340 catch(FileNotFoundExceptione1){

341 e1.printStackTrace();

342 }

343 etUser.setText("");

344 etSecret.setText("");

345}

第319~345行為圖6-1(a)中點擊“清除記錄”按鈕的事件響應(yīng)方法,該方法清除文件userinfo.txt中所有的記錄。只需要以MODE_PRIVATE方式打開文件userinfo.txt,然后向文件中寫入一個空格即可清除全部記錄,如第325行所示。

346publicvoidmyDispMD(Viewv)throwsIOException{

347FileInputStreamfis;

348InputStreamReaderfr=null;

349intch;

350char[]chusr=newchar[30];

351char[]chsec=newchar[30];

352myMap=newHashMap<String,String>();

353 try{

354 fis=this.openFileInput("userinfo.txt");

355 fr=newInputStreamReader(fis);

356 try{

357 intj=0;

358 intk=0;

359 intm=0;

360 intrecnum=1;

361 while((ch=fr.read())!=-1){

362 if(ch!=32){

363 if(j==0){

364 chusr[k++]=(char)ch;

365 }

366 else{

367 chsec[m++]=(char)ch;

368 }

369 }

370 if(ch==32){

371 if(j==0){

372 j=1;

373 Stringstr=newString(chusr,0,k);

374 myMap.put("USER"+String.valueOf(recnum),str);

375 k=0;

376 }

377 else{

378 j=0;

379 Stringstr=newString(chsec,0,m);

380 myMap.put("SECRET"+String.valueOf(recnum),str);

381 m=0;

382 recnum=recnum+1;

383 }

384 }

385 }

386 ArrayList<HashMap<String,String>>arrayList=

387 newArrayList<HashMap<String,String>>();

388 for(inti=1;i<recnum;i++){

389 HashMap<String,String>hashMap=newHashMap<String,

390 String>();

391 hashMap.put("user_name",myMap.get("USER"

392 +String.valueOf(i)));

393 hashMap.put("user_secret",myMap.get("SECRET"

394 +String.valueOf(i)));

395 arrayList.add(hashMap);

396 }

397 SimpleAdapterlistAdapter=newSimpleAdapter(this,arrayList,

398 R.layout.userlist,

399 newString[]{"user_name","user_secret"},

400 newint[]{R.id.user_name,R.id.user_secret});

401 lvUsers.setAdapter(listAdapter);

402 }

403 finally{

404 try{

405 fr.close();

406 fis.close();

407 }catch(IOExceptione){

408 e.printStackTrace();

409 }

410 }

411 }catch(FileNotFoundExceptione1){

412 e1.printStackTrace();

413 }

414}

415}第346~414行為圖6-1(a)中按鈕“查看用戶”的點擊事件響應(yīng)方法。第347~385行代碼采用圖6-5類似的方法從文件userinfo.txt中讀出全部記錄,并將這些記錄寫入HashMap表對象myMap中。第386~396行將myMap中的記錄寫入到ArrayList對象arrayList中。第397~400行將arrayList和列表框布局資源關(guān)聯(lián)起來,生成SimpleAdapter類的適配器對象listAdapter。第401行調(diào)用列表框控件對象的setAdapter方法來顯示文件userinfo.txt中的全部記錄。若執(zhí)行工程ex06_03,并在如圖6-6中輸入四條記錄,文件userinfo.txt將位于圖6-7所示的目錄中,即位于“/data/data/cn.jxufe.zhangenhe/files/”目錄中。將文件傳輸?shù)絎indows系統(tǒng)中,并使用UltraEdit等文本編輯軟件打開,其內(nèi)容為“張恩赫123456張云植123654張澤睿654321張瀾瀟987621”,每條記錄都采取“用戶名?+?空格?+?密碼?+?空格”的形式保存。圖6-6工程ex06_03執(zhí)行結(jié)果圖6-7文件userinfo.txt存儲位置

6.3SQLite關(guān)系數(shù)據(jù)庫

6.3.1SQLite數(shù)據(jù)庫訪問方法

SQLite數(shù)據(jù)庫對應(yīng)著一個擴展名為.db的文件,該文件名稱為數(shù)據(jù)庫名。數(shù)據(jù)庫中可以創(chuàng)建多個數(shù)據(jù)表,每個數(shù)據(jù)表由多個字段構(gòu)成,每個字段對應(yīng)于數(shù)據(jù)表的列,字段可以為任意類型,常被稱為無類型;數(shù)據(jù)表中的每一行是各個字段的具體取值。表6-1為數(shù)據(jù)表的典型示例,這個表是例6.4中的userinfo表。表6-1userinfo表的典型結(jié)構(gòu)新建一個名為myuser.db的數(shù)據(jù)庫的方法為:

1privateSQLiteDatabasemyDB=null;

2myDB=this.openOrCreateDatabase("myuser.db",MODE_PRIVATE,null);

第1行定義一個SQLiteDatabase數(shù)據(jù)庫對象myDB。第2行調(diào)用方法openOrCreateDatabase創(chuàng)建數(shù)據(jù)庫myuser.db,如果該數(shù)據(jù)庫已存在,則打開它,常量MODE_PRIVATE說明數(shù)據(jù)庫僅限于打開它的類調(diào)用。

在數(shù)據(jù)庫myDB中創(chuàng)建一個名為userinfo的表的方法如下:

1myDB.execSQL("CREATETABLEIFNOTEXISTSuserinfo"+

2 "(_idINTEGERPRIMARYKEY,userTEXT,secretTEXT)");數(shù)據(jù)庫中表的操作主要有記錄添加、記錄刪除、記錄查詢和記錄清空等。向表userinfo中添加一條記錄的方法為:

1ContentValuescv=newContentValues();

2cv.put("user","張恩赫");

3cv.put("secret","123456");

4myDB.insert("userinfo",null,cv);查詢表userinfo中字段user和secret分別為“張恩赫”和“123456”的記錄的方法如下:

1Cursorcursor=myDB.query("userinfo",

2 null,

3 "user='張恩赫'"+

4 "ANDsecret='123456'",

5 null,null,null,null);

6if(cursor!=null){

7 cursor.moveToFirst();

8 intloc=cursor.getColumnIndex("secret");

9 Stringstr=cursor.getString(loc);

10}如果要讀取表中所有的記錄,則使用以下語句:

1Cursorcursor=myDB.query("userinfo",

2 null,

3 null,null,null,null,"_id");

第1~3行表示讀出數(shù)據(jù)表userinfo中的所有記錄,并存入cursor對象中;第3行中的“_id”表示讀出的記錄按主鍵_id的值從小到大排序。

刪除數(shù)據(jù)表userinfo中的字段user和secret分別為“張恩赫”和“123456”的記錄的方法為:

1myDB.delete("userinfo","user='張恩赫'"+

2 "ANDsecret='123456'",null);借助于數(shù)據(jù)庫對象myDB的delete方法和WHERE條件“"user='張恩赫'ANDsecret='123456'"”,可以刪除滿足條件的記錄。這里常犯的錯誤是忽視了字段值需要用單引號括起來,即“'張恩赫'”。如果字段值是整型,則不需要用單引號括起來。

刪除數(shù)據(jù)表userinfo中的所有記錄值的方法為:

1myDB.delete("userinfo",null,null);刪除數(shù)據(jù)庫文件myuser.db的方法為:

1this.deleteDatabase("myuser.db");

調(diào)用Acitivity對象的deleteDatabase方法,其參數(shù)為數(shù)據(jù)庫名。

例6.4SQLite數(shù)據(jù)庫訪問技術(shù)。

例6.4執(zhí)行的結(jié)果與例6.3相同。在例6.4中,“查看用戶”按鈕(見圖6-1(a))的作用被集成在“添加”、“刪除”和“清除記錄”按鈕(見圖6-1(a))的點擊事件中了,即點擊“添加”、“刪除”和“清除記錄”按鈕后,將自動顯示數(shù)據(jù)庫中的記錄數(shù)。因此,例6.4中可以刪去“查看用戶”按鈕。新建工程ex06_04,應(yīng)用名為MySQLDBApp,包名為cn.jxufe.zhangenhe,活動界面名為MySQLDBAct。工程ex06_04包括源文件MySQLDBAct.java、漢字字符串資源文件mystrings_hz.xml、顏色資源文件myguicolor.xml、活動界面布局文件main.xml和ListView控件布局文件userlist.xml等。除了源文件MySQLDBAct.java之外,其他文件與工程ex06_03中的同名文件完全相同。

源文件MySQLDBAct.java的內(nèi)容如下所示:

1packagecn.jxufe.zhangenhe;

2

3importandroid.app.Activity;

4importandroid.content.ContentValues;

5importandroid.database.Cursor;

6importandroid.database.sqlite.SQLiteDatabase;

7importandroid.os.Bundle;

8importandroid.view.View;

9importandroid.widget.AdapterView;

10importa

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論