Android常見資料儲存五種方式
本文介紹Android平臺進行資料儲存的五大方式,分別如下:
下面詳細講解這五種方式的特點
第一種: SharedPreferences儲存資料
適用範圍:儲存少量的資料,且這些資料的格式非常簡單:字串型、基本型別的值。比如應用程式的各種配置資訊,解鎖口 令密碼等。
xml 處理時Dalvik會通過自帶底層的本地XML Parser解析,比如XMLpull方式,這樣對於記憶體資源佔用比較好。
優點:避免建立資料庫,建立表,寫SQL語句等諸多操作。
缺點:1.其職能儲存boolean,int,float,long和String五種簡單的資料型別,
2.其無法進行條件查詢等。
它只能是儲存方式的一種補充,而無法完全替代如SQLite資料庫這樣的其他資料儲存方式。
核心原理:儲存基於XML檔案儲存的key-value鍵值對資料,通常用來儲存一些簡單的配置資訊。SharedPreferences資料總是儲存在/data/data/<package
name>/shared_prefs目錄下。SharedPreferences物件本身只能獲取資料而不支援儲存和修改,儲存修改是通過SharedPreferences.edit()獲取的內部介面Editor物件實現。 SharedPreferences
Context.MODE_PRIVATE: 指定該SharedPreferences資料只能被本應用程式讀、寫。
Context.MODE_WORLD_READABLE: 指定該SharedPreferences資料能被
Context.MODE_WORLD_WRITEABLE: 指定該SharedPreferences資料能被其他應用程式讀,寫
Editor有如下主要重要方法:
SharedPreferences.Editor clear():清空SharedPreferences裡所有資料
SharedPreferences.Editor putXxx(String key , xxx value): 向SharedPreferences存入指定key對應的資料,其中xxx 可以是boolean,float,int等各種基本型別據
SharedPreferences.Editor remove(): 刪除SharedPreferences中指定key對應的資料項
boolean commit(): 當Editor編輯完成後,使用該方法提交修改
實際案例:執行介面如下
這裡只提供了兩個按鈕和一個輸入文字框,佈局簡單,故在此不給出介面佈局檔案了,程式核心程式碼如下:
class ViewOcl implements View.OnClickListener{ @Override public void onClick(View v) { switch(v.getId()){ case R.id.btnSet: //步驟1:獲取輸入值 String code = txtCode.getText().toString().trim(); //步驟2-1:建立一個SharedPreferences.Editor介面物件,lock表示要寫入的XML檔名,MODE_WORLD_WRITEABLE寫操作 SharedPreferences.Editor editor = getSharedPreferences("lock", MODE_WORLD_WRITEABLE).edit(); //步驟2-2:將獲取過來的值放入檔案 editor.putString("code", code); //步驟3:提交 editor.commit(); Toast.makeText(getApplicationContext(), "口令設定成功", Toast.LENGTH_LONG).show(); break; case R.id.btnGet: //步驟1:建立一個SharedPreferences介面物件 SharedPreferences read = getSharedPreferences("lock", MODE_WORLD_READABLE); //步驟2:獲取檔案中的值 String value = read.getString("code", ""); Toast.makeText(getApplicationContext(), "口令為:"+value, Toast.LENGTH_LONG).show(); break; } } }
讀寫其他應用的SharedPreferences: 步驟如下
1、在建立SharedPreferences時,指定MODE_WORLD_READABLE模式,表明該SharedPreferences資料可以被其他程式讀取
2、建立其他應用程式對應的Context: <注:com.tony.app就是其他程式的包名>
Context pvCount = createPackageContext("com.tony.app", Context.CONTEXT_IGNORE_SECURITY);
3、使用其他程式的Context獲取對應的SharedPreferences
SharedPreferences read = pvCount.getSharedPreferences("lock", Context.MODE_WORLD_READABLE);
4、如果是寫入資料,使用Editor介面即可,所有其他操作均和前面一致。
第二種: 檔案儲存資料
核心原理: Context提供了兩個方法來開啟資料檔案裡的檔案IO流 FileInputStream openFileInput(String name); FileOutputStream(String name , int mode),這兩個方法第一個引數 用於指定檔名,第二個引數指定開啟檔案的模式。具體有以下值可選:
MODE_PRIVATE:為預設操作模式,代表該檔案是私有資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔案的內容,如果想把新寫入的內容追加到原檔案中。可 以使用Context.MODE_APPEND
MODE_APPEND:模式會檢查檔案是否存在,存在就往檔案追加內容,否則就建立新檔案。
MODE_WORLD_READABLE:表示當前檔案可以被其他應用讀取;
MODE_WORLD_WRITEABLE:表示當前檔案可以被其他應用寫入。
除此之外,Context還提供瞭如下幾個重要的方法:
getDir(String name , int mode):在應用程式的資料資料夾下獲取或者建立name對應的子目錄
File getFilesDir():獲取該應用程式的資料資料夾得絕對路徑
String[] fileList():返回該應用資料資料夾的全部檔案
實際案例:介面沿用上圖
核心程式碼如下:
public String read() { try { FileInputStream inStream = this.openFileInput("message.txt"); byte[] buffer = new byte[1024]; int hasRead = 0; StringBuilder sb = new StringBuilder(); while ((hasRead = inStream.read(buffer)) != -1) { sb.append(new String(buffer, 0, hasRead)); } inStream.close(); return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } public void write(String msg){ // 步驟1:獲取輸入值 if(msg == null) return; try { // 步驟2:建立一個FileOutputStream物件,MODE_APPEND追加模式 FileOutputStream fos = openFileOutput("message.txt", MODE_APPEND); // 步驟3:將獲取過來的值放入檔案 fos.write(msg.getBytes()); // 步驟4:關閉資料流 fos.close(); } catch (Exception e) { e.printStackTrace(); } }
openFileOutput()方法的第一引數用於指定檔名稱,不能包含路徑分隔符“/” ,如果檔案不存在,Android 會自動建立它。建立的檔案儲存在/data/data/<package name>/files目錄,如: /data/data/cn.tony.app/files/message.txt,
下面講解某些特殊檔案讀寫需要注意的地方:
讀寫sdcard上的檔案
其中讀寫步驟按如下進行:
1、呼叫Environment的getExternalStorageState()方法判斷手機上是否插了sd卡,且應用程式具有讀寫SD卡的許可權,如下程式碼將返回true
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
2、呼叫Environment.getExternalStorageDirectory()方法來獲取外部儲存器,也就是SD卡的目錄,或者使用"/mnt/sdcard/"目錄
3、使用IO流操作SD卡上的檔案
注意點:手機應該已插入SD卡,對於模擬器而言,可通過mksdcard命令來建立虛擬儲存卡
必須在AndroidManifest.xml上配置讀寫SD卡的許可權
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
案例程式碼:
// 檔案寫操作函式 private void write(String content) { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 如果sdcard存在 File file = new File(Environment.getExternalStorageDirectory() .toString() + File.separator + DIR + File.separator + FILENAME); // 定義File類物件 if (!file.getParentFile().exists()) { // 父資料夾不存在 file.getParentFile().mkdirs(); // 建立資料夾 } PrintStream out = null; // 列印流物件用於輸出 try { out = new PrintStream(new FileOutputStream(file, true)); // 追加檔案 out.println(content); } catch (Exception e) { e.printStackTrace(); } finally { if (out != null) { out.close(); // 關閉列印流 } } } else { // SDCard不存在,使用Toast提示使用者 Toast.makeText(this, "儲存失敗,SD卡不存在!", Toast.LENGTH_LONG).show(); } } // 檔案讀操作函式 private String read() { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 如果sdcard存在 File file = new File(Environment.getExternalStorageDirectory() .toString() + File.separator + DIR + File.separator + FILENAME); // 定義File類物件 if (!file.getParentFile().exists()) { // 父資料夾不存在 file.getParentFile().mkdirs(); // 建立資料夾 } Scanner scan = null; // 掃描輸入 StringBuilder sb = new StringBuilder(); try { scan = new Scanner(new FileInputStream(file)); // 例項化Scanner while (scan.hasNext()) { // 迴圈讀取 sb.append(scan.next() + "\n"); // 設定文字 } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } finally { if (scan != null) { scan.close(); // 關閉列印流 } } } else { // SDCard不存在,使用Toast提示使用者 Toast.makeText(this, "讀取失敗,SD卡不存在!", Toast.LENGTH_LONG).show(); } return null; }
第三種:SQLite儲存資料
SQLite是輕量級嵌入式資料庫引擎,它支援 SQL 語言,並且只利用很少的記憶體就有很好的效能。現在的主流移動裝置像Android、iPhone等都使用SQLite作為複雜資料的儲存引擎,在我們為移動裝置開發應用程式時,也許就要使用到SQLite來儲存我們大量的資料,所以我們就需要掌握移動裝置上的SQLite開發技巧
SQLiteDatabase類為我們提供了很多種方法,上面的程式碼中基本上囊括了大部分的資料庫操作;對於新增、更新和刪除來說,我們都可以使用
1 db.executeSQL(String sql); 2 db.executeSQL(String sql, Object[] bindArgs);//sql語句中使用佔位符,然後第二個引數是實際的引數集
除了統一的形式之外,他們還有各自的操作方法:
1 db.insert(String table, String nullColumnHack, ContentValues values); 2 db.update(String table, Contentvalues values, String whereClause, String whereArgs); 3 db.delete(String table, String whereClause, String whereArgs);
以上三個方法的第一個引數都是表示要操作的表名;insert中的第二個引數表示如果插入的資料每一列都為空的話,需要指定此行中某一列的名稱,系統將此列設定為NULL,不至於出現錯誤;insert中的第三個引數是ContentValues型別的變數,是鍵值對組成的Map,key代表列名,value代表該列要插入的值;update的第二個引數也很類似,只不過它是更新該欄位key為最新的value值,第三個引數whereClause表示WHERE表示式,比如“age > ? and age < ?”等,最後的whereArgs引數是佔位符的實際引數值;delete方法的引數也是一樣
下面給出demo
資料的新增
1.使用insert方法
1 ContentValues cv = new ContentValues();//例項化一個ContentValues用來裝載待插入的資料 2 cv.put("title","you are beautiful");//新增title 3 cv.put("weather","sun"); //新增weather 4 cv.put("context","xxxx"); //新增context 5 String publish = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") 6 .format(new Date()); 7 cv.put("publish ",publish); //新增publish 8 db.insert("diary",null,cv);//執行插入操作
2.使用execSQL方式來實現
String sql = "insert into user(username,password) values ('Jack Johnson','iLovePopMuisc');//插入操作的SQL語句 db.execSQL(sql);//執行SQL語句
資料的刪除
同樣有2種方式可以實現
String whereClause = "username=?";//刪除的條件 String[] whereArgs = {"Jack Johnson"};//刪除的條件引數 db.delete("user",whereClause,whereArgs);//執行刪除
使用execSQL方式的實現
String sql = "delete from user where username='Jack Johnson'";//刪除操作的SQL語句 db.execSQL(sql);//執行刪除操作
資料修改
同上,仍是2種方式
ContentValues cv = new ContentValues();//例項化ContentValues cv.put("password","iHatePopMusic");//新增要更改的欄位及內容 String whereClause = "username=?";//修改條件 String[] whereArgs = {"Jack Johnson"};//修改條件的引數 db.update("user",cv,whereClause,whereArgs);//執行修改
使用execSQL方式的實現
String sql = "update user set password = 'iHatePopMusic' where username='Jack Johnson'";//修改的SQL語句 db.execSQL(sql);//執行修改
資料查詢
下面來說說查詢操作。查詢操作相對於上面的幾種操作要複雜些,因為我們經常要面對著各種各樣的查詢條件,所以系統也考慮到這種複雜性,為我們提供了較為豐富的查詢形式:
1 db.rawQuery(String sql, String[] selectionArgs); 2 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy); 3 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); 4 db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
上面幾種都是常用的查詢方法,第一種最為簡單,將所有的SQL語句都組織到一個字串中,使用佔位符代替實際引數,selectionArgs就是佔位符實際引數集;
各引數說明:
- table:表名稱
- colums:表示要查詢的列所有名稱集
- selection:表示WHERE之後的條件語句,可以使用佔位符
- selectionArgs:條件語句的引數陣列
- groupBy:指定分組的列名
- having:指定分組條件,配合groupBy使用
- orderBy:y指定排序的列名
- limit:指定分頁引數
- distinct:指定“true”或“false”表示要不要過濾重複值
- Cursor:返回值,相當於結果集ResultSet
最後,他們同時返回一個Cursor物件,代表資料集的遊標,有點類似於JavaSE中的ResultSet。下面是Cursor物件的常用方法:
相關推薦
Android常見資料儲存五種方式
本文介紹Android平臺進行資料儲存的五大方式,分別如下: 下面詳細講解這五種方式的特點 第一種: SharedPreferences儲存資料 適用範圍:儲存少量的資料,且這些資料的格式非常簡單:字串型、基本型別的值。
Android資料儲存五種方式
https://www.cnblogs.com/ITtangtang/p/3920916.html SharedPreferences的基本使用-----存,刪,改,查:https://www.cnblogs.com/qianzf/p/7582400.html Android Sha
Android資料儲存五種方式總結
SharePreferences是用來儲存一些簡單配置資訊的一種機制,使用Map資料結構來儲存資料,以鍵值對的方式儲存,採用了XML格式將資料儲存到裝置中。例如儲存登入使用者的使用者名稱和密碼。只能在同一個包內使用,不能在不同的包之間使用,其實也就是說只能在創建它的應用
Android 資料儲存五種方式使用與總結
轉載自http://blog.csdn.net/amazing7/article/details/51437435 1、概述 Android提供了5種方式來讓使用者儲存持久化應用程式資料。根據自己的需求來做選擇,比如資料是否是應用程式私有的,是否能被其他程式訪
資料儲存(五種方式)SharedPreferences儲存
一.SharedPreferences儲存 1.使用SharedPreferences儲存資料時,不需要指定檔案字尾,字尾自動設定為*.xml。 2.儲存資料---SaveData.java publicclass MySharedPreferencesDemo exte
資料儲存(五種方式二)-檔案儲存
檔案儲存 1.SharedPreference只能儲存一些簡單的資料,要想儲存更多型別的資料,需要使用檔案的儲存操作。有兩種形式: 形式一:直接利用Activity提供的檔案操作方法。此類操作的所有檔案路徑只能是“data\data\<packagename>
Hive中表的資料匯入(五種方式)
目錄 總結: load: insert: 建立表並載入資料(As Select): location: import: 總結: 總結: hive中一共有五種資料匯出的方式: ①:load data方式,如果路徑是local是追加,若為HDFS則
servlet 資料儲存幾種方式和jsp 作用域
有5個物件儲存資料: ServletContext ---application 當tomcat服務一啟動,資料儲存一致有效,當tomcat服務一停止,ServletContext物件消失。 session----session 當第一次使用者輸入一個網址,且帶有一些
SpringMVC的controller向jsp傳遞資料的五種方式詳解
第一種 使用model來儲存資料到前臺我的專案目錄為我的controller頁面程式碼@RequestMapping("/demo") public String Model(Model model
Hibernate查詢資料的五種方式
1.導航物件圖查詢:根據已經載入的物件,導航到其他物件。 例如,對於已經載入的Customer物件,呼叫它getOrders().iterator()方法就可以導航到所有關聯的Order物件,假如在關聯級別使用了延遲載入檢索策略,那麼首次執行此方法時,Hibernate
Android中常用的五種資料儲存方式
第一種: 使用SharedPreferences儲存資料 適用範圍: 儲存少量的資料,且這些資料的格式非常簡單:字串型、基本型別的值。比如應用程式的各種配置資訊(如是否開啟音效、是否使用震動效果、小遊戲的玩家積分等),解鎖口 令密碼等 核心原理: 儲存基
關於Android Activity之間傳遞資料的6種方式
使用Inten的putExtra傳遞 第一個Activity中 ? 1 2 3 4 5 6 //建立意圖物件 Intent intent = new Intent(this,TwoActivity.class); //設定傳
儲存資料的幾種方式比較
機身記憶體讀取主要用個兩個類檔案輸入流(FileInputStream)和檔案輸出流(FileOutputStream):FileInputStream fileInput = this.openFileInput("test.txt") 第一個引數為 data/此程式包名/data/test.txt
android開發之為listview繫結資料的三種方式
第一種,使用simple adapter simpleadapter 是最簡單的一種方式,但是其資料來源必須是map型別。 1.生成 SimpleAdapter()物件 2.設定資料來源 3.設定每個item的佈局 4.設定SimpleAdapter(Context con
Android 學習之路一:Activity之間傳遞資料的四種方式
傳遞資料 新建 Activity 在專案中右鍵,選擇 New,繼續選擇中下方的 Activity,最後是 Blank Activity。 此時 Android Studio 會為我們自動新增一個對應的佈局檔案,為佈局檔案中的 TextView 新增 I
Spark RDD/DataFrame map儲存資料的兩種方式
使用Spark RDD或DataFrame,有時需要在foreachPartition或foreachWith裡面儲存資料到本地或HDFS。 直接儲存資料 當然如果不需要在map裡面儲存資料,那麼針對RDD可以有如下方式 val rdd = // targ
Android中解析json資料的三種方式
Json簡介 JAVAScript Object Notation是一種輕量級的資料交換格式 具有良好的可讀和便於快速編寫的特性。 業內主流技術為其提供了完整的解決方案(有點類似於正則表示式 ,獲得了
iOS儲存資料的4種方式
在iOS開發過程中,不管是做什麼應用,都會碰到資料儲存的問題。將資料儲存到本地,能夠讓程式的執行更加流暢,不會出現讓人厭惡的菊花形狀,使得使用者體驗更好。下面介紹一下資料儲存的方式: 1.NSKeyedArchiver:採用歸檔的形式來儲存資料,該資料物件需要遵守NSCo
Android中常用的五種佈局方式:AbsoluteLayout
絕對佈局中將所有的子元素通過設定android:layout_x 和 android:layout_y屬性,將子元素的座標位置固定下來,即座標(android:layout_x, android:layout_y) ,layout_x用來表示橫座標,layout
【Android 開發】 : Activity之間傳遞資料的幾種方式
在Android開發中,我們通常需要在不同的Activity之間傳遞資料,下面我們就來總結一下在Activity之間資料傳遞的幾種方式。 1. 使用Intent來傳遞資料 Intent表示意圖,很多時候我們都會利用Android的Intent來在各個A