




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 北京2025年北京服裝學(xué)院招聘筆試歷年參考題庫附帶答案詳解
- 二零二五版二手房銷售協(xié)議
- 配送水果合同二零二五年
- 2025商業(yè)大廈租戶裝修管理合同
- 2025合同違約金的計算與處理程序
- 2025中國農(nóng)業(yè)銀行個人汽車貸款合同
- 2025華能石島灣核電開發(fā)有限公司培訓(xùn)中心辦公室改造施工合同
- 2025協(xié)商解除勞動合同合同書范本專業(yè)版(合同示范文本)
- 2025《合同法》第所規(guī)定無效合同之情形
- 2025標(biāo)準(zhǔn)版養(yǎng)殖保險合同
- 譚其驤歷史地理十講
- 新版DFMEA基礎(chǔ)知識解析與運用-培訓(xùn)教材
- 年度IT投資預(yù)算表格
- 學(xué)習(xí)質(zhì)量評價:SOLO分類理論
- 2023年上海學(xué)業(yè)水平考試生命科學(xué)試卷含答案
- 中醫(yī)內(nèi)科學(xué)總論-課件
- 免疫學(xué)防治(免疫學(xué)檢驗課件)
- 消防水泵房操作規(guī)程
- 腹腔雙套管沖洗操作
- 《微型消防站建設(shè)標(biāo)準(zhǔn)》
- 中國少年先鋒隊入隊申請書 帶拼音
評論
0/150
提交評論