1. 程式人生 > >Android常見資料儲存五種方式

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

本身是一個介面,程式無法直接建立SharedPreferences例項,只能通過Context提供的getSharedPreferences(String name, int mode)方法來獲取SharedPreferences例項,該方法中name表示要操作的xml檔名,第二個引數具體如下:

                 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