Android中的Serializable、Parcelable">Android中的Serializable、Parcelable
907
2022-05-29
目錄
一. 使用SharedPreferences存儲數據
二. 數據的存儲位置和格式
三、存儲數據的獲取
四. 存取復雜類型的數據
五. 設置數據文件的訪問權限
Hello,你好呀,我是灰小猿,一個超會寫bug的程序猿!
時隔好幾天,我又回來了,最近一直忙著考試沒時間更新~
今天來和大家分享一篇有關Android中數據存儲的文章,它可以說是Android對數據的所有存儲方式中最簡單的一種存儲了,它就是SharedPreferences.
這篇文章,我將詳細的和大家講一下如何使用SharePreferences進行數據的存儲和讀取,
一. 使用SharedPreferences存儲數據
使用SharedPreferences進行存儲的數據是存放在一個XML文件中的,同時它的存儲方式是是以key-value的形式,key對應著將要存儲的數據的名稱,value對應存儲的值,
使用 SharedPreferences 保存key-value對的步驟一般是這樣
:
1、使用Activity類的getSharedPreferences方法獲取到 SharedPreferences 對象,并且在其中指定文件名和該文件的訪問權限。在使用該方法時,如果該名稱的文件不存在就創建愛你它,如果存在就直接打開。
SharedPreferences sharedPreferences = getSharedPreferences("logininfo", MODE_PRIVATE);
其中的第一個參數是文件名,第二個參數是訪問權限,我們平常都會將其訪問權限設置為private類型,以保護數據不被外界所訪問
2、通過sharedPreferences的edit()方法,我們可以獲取到該對象的修改權限,并返回SharedPreferences.Editor對象,
SharedPreferences.Editor edits = sharedPreferences.edit();
3、使用該對象的 putXxx方法保存key-value對。如我們要在文件中保存用戶名為“張三”的這條信。
edits.putString("username",張三);
4、通過SharedPreferences.Editor的commit方法保存(提交)key-value對。這樣該條信息就會被寫入到文件中,并且在不刪除的情況下會一直保存。
edits.commit();
下面我們通過一個實例來完整的看下數據存儲到SharedPreferences的過程,存儲用戶登錄的用戶名和密碼。
//獲取一個文件名為login、權限為private的xml文件的SharedPreferences對象 SharedPreferences sharedPreferences = getSharedPreferences("login", MODE_PRIVATE); //得到SharedPreferences.Editor對象,并保存數據到該對象中 SharedPreferences.Editor editor = sharedPreferences.edit(); //保存key-value對到文件中 editor.putString("username", “灰小猿”); editor.putString("password", “123456”); editor.commit();
我們上面也說過,使用該對象的 putXxx方法保存key-value對。
所以?SharedPreferences 提供可以直接保存的數據格式肯定不僅只有String,還有 int、boolean、float、long以及Set
二. 數據的存儲位置和格式
既然是將數據存儲到了文件中,那么總會有文件的存儲位置的,實際上,SharedPreferences 將數據文件寫在了手機內存私有的目錄中該app的文件夾下。
下面是在AndroidStudio中查看該文件的方法。
首先打開手機文件的存放目錄【File Explorer】,在里面找到data\data\程序包名\shared_prefs目錄,
就可以發現你命名的login.xml文件。
點擊文件并查看:
三、存儲數據的獲取
上面我們已經講解了如何對數據進行存儲,那么這些存儲的數據我們是應該如何獲取的呢?
其實通過sharedPreferences存儲的數據的讀取也是十分容易的,我們只需要使用getSharedPreferences()方法獲取到對應的XML文件之后,使用其getXxx方法傳入存儲時的key即可,
代碼如下:
SharedPreferences sharedPreferences = getSharedPreferences("logininfo", MODE_PRIVATE); String username = sharedPreferences.getString("username", ""); String password = sharedPreferences.getString("password", "");
其中的getString()方法中的第一個參數是key的名稱,
第二個參數的含義是:“如果沒有找到以該key存儲的value,那就返回該參數”,如上代碼,沒有相應的username或password的話就返回“”。
四. 存取復雜類型的數據
如果要用 SharedPreferences 存取復雜的數據類型(類,圖像等),就需要對這些數據進行編碼。通常會將復雜類型的數據轉換成Base64編碼,然后將轉換后的數據以字符串的形式保存在XML文件中。
實例:
使用 SharedPreferences 保存Product類的一個對象和一張圖片。
這里提供了兩個Button,用來保存和獲取使用 SharedPreferences 保存的Product對象和圖片。
保存按鈕的點擊事件:
bt_prod_save.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { //保存對象 Product product = new Product(); product.setId(et_prod_id.getText().toString().trim()); product.setName(et_prod_name.getText().toString().trim()); SharedPreferences sharedPreferences = getSharedPreferences("base64", MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(product); String base64Product = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT); editor.putString("product", base64Product); //保存圖片 ByteArrayOutputStream baos2 = new ByteArrayOutputStream(); ((BitmapDrawable) getResources().getDrawable(R.drawable.lanbojini)).getBitmap().compress(Bitmap.CompressFormat.JPEG, 100, baos2); String imageBase64 = Base64.encodeToString(baos2.toByteArray(), Base64.DEFAULT); editor.putString("productImg", imageBase64); editor.commit(); baos.close(); oos.close(); Toast.makeText(MainActivity.this, "保存成功!!!", Toast.LENGTH_SHORT).show(); } catch (Exception e) { Toast.makeText(MainActivity.this, "保存出錯了!!!" + e.getMessage(), Toast.LENGTH_SHORT).show(); } } });
回顯按鈕的點擊事件:
bt_prod_show.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { //獲取對象 et_prod_id = (EditText) findViewById(R.id.et_prod_id); et_prod_name = (EditText) findViewById(R.id.et_prod_name); SharedPreferences sharedPreferences = getSharedPreferences("base64", MODE_PRIVATE); String productString = sharedPreferences.getString("product", ""); byte[] base64Product = Base64.decode(productString, Base64.DEFAULT); ByteArrayInputStream bais = new ByteArrayInputStream(base64Product); ObjectInputStream ois = new ObjectInputStream(bais); Product product = (Product) ois.readObject(); et_prod_id.setText(product.getId()); et_prod_name.setText(product.getName()); //獲取圖片 iv_prod_img = (ImageView) findViewById(R.id.iv_prod_img); byte[] imagByte = Base64.decode(sharedPreferences.getString("productImg",""), Base64.DEFAULT); ByteArrayInputStream bais2 = new ByteArrayInputStream(imagByte); iv_prod_img.setImageDrawable(Drawable.createFromStream(bais2, "imagByte")); } catch (Exception e) { e.printStackTrace(); } } });
原理:使用Base64把Product對象和圖片進行編碼成字符串后,然后通過 SharedPreferences 把轉換后的字符串保存到xml文件中,在需要使用該對象或者圖片時,通過Base64把從 SharedPreferences 獲取的字符串解碼成對象或者圖片再使用。
查看base64.xml?文件,會看到如下內容:
注意:
雖然可以采用編碼的方式通過 SharedPreferences 保存任何類型的數據,但不建議使用 SharedPreferences 保存尺寸很大的數據。如果要存取更多的數據,一般使用文件存儲、SQLite數據庫等技術。
五. 設置數據文件的訪問權限
我們知道Android系統本質上是Linux,那么Android文件權限也和Linux一致。Linux文件屬性分為4段,
第一段:
[d]:表示目錄
[-]:表示文件
[l]:表示鏈接文件
[b]:表示可供存儲的接口設備文件
[c]:表示串口設備文件,例如鍵盤、鼠標
第二段:
[r]:表示可讀
[w]:表示可寫
[x]:表示可執行
如果不具備某個屬性,該項將以[-]代替,例如rw-、--x等
第三段和第四段和第二段相同,區別在于,第二段表示文件所有者擁有的權限,第三段表示文件所有者所在的用戶組中其他用戶的權限,第四段表示其他用戶的權限。
例如:-rw-rw-rw,表示這是一個文件,并且該用戶和該組內其他用戶和其他用戶的權限都為可讀和可寫不可執行。
那么現在來對比一下我們這篇文章中文件的存儲權限,我們在獲取 SharedPreferences 對象時,使用的是下面這行代碼:
SharedPreferences sharedPreferences = this.getSharedPreferences("test", MODE_PRIVATE);
其中getSharedPreferences方法第二個參數就是對文件權限的描述。
這個參數有四個可選值:
Activity.MODE_PRIVATE:表示該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容
Activity.MODE_APPEND:也是私有數據,新寫入的內容會追加到原文件中
Activity.MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取
Activity.MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入
但是出于對數據文件安全性的考慮,我們一般使用MODE_PRIVATE權限對文件進行存儲。
好了,關于Android中使用SharedPreferences對數據進行存儲的方法就和大家分享到這里,
有問題的小伙伴可以評論區留言或者添加我的微信!
我是灰小猿,我們下期見!
Android XML
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。