Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android筆記——Android中數據的存儲方式,android筆記

Android筆記——Android中數據的存儲方式,android筆記

編輯:關於android開發

Android筆記——Android中數據的存儲方式,android筆記


 

   Android中數據的存儲方式

  對於開發平台來講,如果對數據的存儲有良好的支持,那麼對應用程序的開發將會有很大的促進作用。
  總體的來講,數據存儲方式有三種:一個是文件,一個是數據庫,另一個則是網絡。其中文件和數據庫可能用的稍多一些,文件用起來較為方便,程序可以自己定義格式;數據庫用起稍煩鎖一些,但它有它的優點,比如在海量數據時性能優越,有查詢功能,可以加密,可以加鎖,可以跨應用,跨平台等等;網絡,則用於比較重要的事情,比如科研,勘探,航空等實時采集到的數據需要馬上通過網絡傳輸到數據處理中心進行存儲並進行處理,有時是性的需求等。
  對於Android平台來講,它的存儲方式也不外乎這幾種,按方式總體來分,也是文件,數據庫和網絡。但我認為從儲存標的來講它可以細分為以下五種方式:

1.1  方式

1.2  區別

  1.  Shared Preferences:

  Android提供用來存儲一些簡單的配置信息的一種機制,例如,一些默認歡迎語、登錄的用戶名和密碼等。其以鍵值對的方式存儲。

  SharedPreferences是以XML的格式以文件的方式自動保存的,在DDMS中的File Explorer中展開到/data/data/<packagename>/shared_prefs下,以自己的項目為例,可以看到一個叫做SETTING_Infos.xml的文件

  2.  Files

  在Android中,其提供了openFileInput 和 openFileOuput 方法讀取設備上的文件,下面看個例子代碼,具體如下所示:

String FILE_NAME = "tempfile.tmp"; //確定要操作文件的文件名

FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE); //初始化

FileInputStream fis = openFileInput(FILE_NAME); //創建寫入流

  上述代碼中兩個方法只支持讀取該應用目錄下的文件,讀取非其自身目錄下的文件將會拋出異常。需要提醒的是,如果調用

FileOutputStream 時指定的文件不存在,Android 會自動創建它,所以不需要判斷文件是否存在。另外,在默認情況下,寫入的時候會覆蓋原文件內容,如果想把

新寫入的內容附加到原文件內容後,則可以指定其模式為Context.MODE_APPEND,這裡涉及到OutputStream的四種模式,下文有詳細解釋和案例。

  3.  SQLite

  SQLite是Android所帶的一個標准的數據庫,它支持SQL語句,它是一個輕量級的嵌入式數據庫

  4.  NetWork:

  將數據上傳到網絡

補充:

1.3  例子

  1.  Shared Preferences:小案例:用戶輸入賬號密碼,點擊登錄按鈕,登錄的同時持久化保存賬號和密碼

用SharedPreference存儲賬號密碼

  • 往SharedPreference裡寫數據

    //拿到一個SharedPreference對象
    SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
    //拿到編輯器
    Editor ed = sp.edit();
    //寫數據
    ed.putString("name", name);
    ed.commit();

     注:這裡記住put完後,必須commit一下。

  • 從SharedPreference裡取數據

    SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
    //從SharedPreference裡取數據
    String name = sp.getBoolean("name", "");
     
  • 代碼:
    • 布局文件
      • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="vertical" > <EditText android:id="@+id/et_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請輸入用戶名" /> <EditText android:id="@+id/et_pass" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請輸入密碼" android:inputType="textPassword" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <CheckBox android:id="@+id/cb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="記住用戶名和密碼" android:layout_centerVertical="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登錄" android:layout_alignParentRight="true" android:onClick="login" /> </RelativeLayout> </LinearLayout> View Code
    • java代碼
      •   
        package com.bokeyuan.sharedpreference;
        
        import android.os.Bundle;
        import android.app.Activity;
        import android.content.SharedPreferences;
        import android.content.SharedPreferences.Editor;
        import android.view.Menu;
        import android.view.View;
        import android.widget.EditText;
        
        public class MainActivity extends Activity {
        
            private EditText et_name;
            private EditText et_pass;
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                
                et_name = (EditText) findViewById(R.id.et_name);
                et_pass = (EditText) findViewById(R.id.et_pass);
                
                //拿到SharedPreferences對象
                SharedPreferences sp = getSharedPreferences("info", MODE_PRIVATE);
                //從SharedPreferences中取出數據
                String name = sp.getString("name", "");
                String pass = sp.getString("pass", "");
                
                et_name.setText(name);
                et_pass.setText(pass);
            }
        
            public void login(View v){
                
                String name = et_name.getText().toString();
                String pass = et_pass.getText().toString();
                
                //拿到SharedPreferences對象
                SharedPreferences sp = getSharedPreferences("info", MODE_PRIVATE);
                //把數據存入SharedPreferences
                Editor ed = sp.edit();
                ed.putString("name", name);
                ed.putString("pass", pass);
                //提交
                ed.commit();
            }
        }

         

  2.  Files  小案例:用戶輸入賬號密碼,勾選“記住賬號密碼”,點擊登錄按鈕,登錄的同時持久化保存賬號和密碼

  • 在內部存儲空間中讀寫文件(RAM)

    •   布局文件:同上面的布局
    •   java代碼:
      •   
        package com.bokeyuan.rwinrom;
        
        import java.io.BufferedReader;
        import java.io.File;
        import java.io.FileInputStream;
        import java.io.FileNotFoundException;
        import java.io.FileOutputStream;
        import java.io.InputStreamReader;
        
        import android.os.Bundle;
        import android.annotation.SuppressLint;
        import android.app.Activity;
        import android.content.Context;
        import android.view.Menu;
        import android.view.View;
        import android.widget.CheckBox;
        import android.widget.EditText;
        import android.widget.Toast;
        
        public class MainActivity extends Activity {
        
            private EditText et_name;
            private EditText et_pass;
        
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                
                et_name = (EditText) findViewById(R.id.et_name);
                et_pass = (EditText) findViewById(R.id.et_pass);
                readAccount();
            }
            @SuppressLint("ShowToast") 

        public void login(View v){ String name = et_name.getText().toString(); String pass = et_pass.getText().toString(); CheckBox cb = (CheckBox) findViewById(R.id.cb); if(cb.isChecked()){ //指定Android的內部存儲空間的路徑 // File file = new File("data/data/com.bokeyuan.rwinrom/info.txt"); //返回一個File對象,它的路徑是:data/data/com.bokeyuan.rwinrom/files/ // File file = new File(getFilesDir(), "info.txt"); //返回一個File對象,它的路徑是:data/data/com.bokeyuan.rwinrom/cache/ File file = new File(getCacheDir(), "info.txt"); try { FileOutputStream fos = new FileOutputStream(file); fos.write((name + "##" + pass).getBytes()); fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //彈出提示框,提示用戶登錄成功 Toast.makeText(this, "登陸成功", 0).show(); } public void readAccount(){ //指定Android的內部存儲空間的路徑 // File file = new File("data/data/com.bokeyuan.rwinrom/info.txt"); // File file = new File(getFilesDir(), "info.txt"); File file = new File(getCacheDir(), "info.txt"); if(file.exists()){ try { FileInputStream fis = new FileInputStream(file); //把字節流轉換成字符流 BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String text = br.readLine(); String[] s = text.split("##"); et_name.setText(s[0]); et_pass.setText(s[1]); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

         

  • 在外部存儲空間中讀寫文件(SD卡)

    •   布局文件:同上面的布局
    •   java代碼:
      • package com.bokeyuan.rwinsd;
        
        import java.io.BufferedReader;
        import java.io.File;
        import java.io.FileInputStream;
        import java.io.FileNotFoundException;
        import java.io.FileOutputStream;
        import java.io.InputStreamReader;
        
        import com.bokeyuan.rwinsd.R;
        
        import android.os.Bundle;
        import android.os.Environment;
        import android.annotation.SuppressLint;
        import android.app.Activity;
        import android.content.Context;
        import android.view.Menu;
        import android.view.View;
        import android.widget.CheckBox;
        import android.widget.EditText;
        import android.widget.Toast;
        
        public class MainActivity extends Activity {
        
            private EditText et_name;
            private EditText et_pass;
        
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                
                et_name = (EditText) findViewById(R.id.et_name);
                et_pass = (EditText) findViewById(R.id.et_pass);
                readAccount();
            }
        
            public void login(View v){
                
                String name = et_name.getText().toString();
                String pass = et_pass.getText().toString();
                
                CheckBox cb = (CheckBox) findViewById(R.id.cb);
                if(cb.isChecked()){
                    
                    //檢測sd卡當前是否可用
                    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
                        
            //            File file = new File("sdcard/info.txt");
                        
                        //返回一個file對象,包含的路徑就是sd卡的真實路徑
                        File file = new File(Environment.getExternalStorageDirectory(), "info.txt");
                        
                        try {
                            FileOutputStream fos = new FileOutputStream(file);
                            fos.write((name + "##" + pass).getBytes());
                            fos.close();
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    else{
                        Toast.makeText(this, "sd卡不可用喲親", 0).show();
                    }
                }
                
                //彈出提示框,提示用戶登錄成功
                Toast.makeText(this, "登陸成功", 0).show();
            }
            
            public void readAccount(){
        //        File file = new File("sdcard/info.txt");
                File file = new File(Environment.getExternalStorageDirectory(), "info.txt");
                
                if(file.exists()){
                    try {
                        FileInputStream fis = new FileInputStream(file);
                        //把字節流轉換成字符流
                        BufferedReader br = new BufferedReader(new InputStreamReader(fis));
                        String text = br.readLine();
                        String[] s = text.split("##");
                        
                        et_name.setText(s[0]);
                        et_pass.setText(s[1]);
                        
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
          注:
      • //此api會把文件寫到data/data/com.itheima.permission/files/文件夾下
        •   FileOutputStream fos = openFileOutput("info1.txt", MODE_PRIVATE) ;
      • //此api會把文件讀到data/data/com.itheima.permission/files/文件夾下
        •   FileOutputStream fos = openFileOutput("info1.txt", MODE_PRIVATE) ;
      • 所以,以後用Android 自帶的API。可以看下面openFileOutput四種模式的小例子:
  • openFileOutput的四種模式

    • MODE_PRIVATE:-rw-rw----
    • MODE_APPEND:-rw-rw----
    • MODEWORLDWRITEABLE:-rw-rw--w-
    • MODEWORLDREADABLE:-rw-rw-r--

    Context.MODE_PRIVATE:為默認操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容,如果想把新寫入的內容追加到原文件中,可以使用Context.MODE_APPEND。
    Context.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件。
    Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有權限讀寫該文件。
    MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取;MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入。  

      •   布局文件:
        • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="vertical" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="創建文件1" android:onClick="click1" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="創建文件2" android:onClick="click2" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="創建文件3" android:onClick="click3" /> </LinearLayout> View Code
      •   代碼:
        •   
          package com.bokeyuan.permission;
          
          import java.io.File;
          import java.io.FileNotFoundException;
          import java.io.FileOutputStream;
          
          import android.os.Bundle;
          import android.annotation.SuppressLint;
          import android.app.Activity;
          import android.view.Menu;
          import android.view.View;
          
          @SuppressLint("WorldReadableFiles")
          public class MainActivity extends Activity {
          
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_main);
              }
          
              public void click1(View v){
                  //此api會把文件寫到data/data/com.bokeyuan.permission/files/文件夾下
                  try {
                      FileOutputStream fos = openFileOutput("info1.txt", MODE_PRIVATE) ;
                      fos.write("該文件是私有數據,只能被應用本身訪問".getBytes());
                      fos.close();
                  } catch (Exception e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
                  
              }
              public void click2(View v){
                  //此api會把文件寫到data/data/com.bokeyuan.permission/files/文件夾下
                  try {
                      @SuppressWarnings("deprecation")
                      FileOutputStream fos = openFileOutput("info2.txt", MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE) ;
                      fos.write("當前文件可以被其他應用讀取或寫入".getBytes());
                      fos.close();
                  } catch (Exception e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
              }
              public void click3(View v){
                  //此api會把文件寫到data/data/com.bokeyuan.permission/files/文件夾下
                  try {
                      @SuppressWarnings("deprecation")
                      FileOutputStream fos = openFileOutput("info3.txt", MODE_WORLD_WRITEABLE) ;
                      fos.write("當前文件可以被其他應用寫入".getBytes());
                      fos.close();
                  } catch (Exception e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
              }
          }

           

 

 

參考資料:

http://www.cnblogs.com/McCa/p/4204936.html

http://www.jb51.net/article/37225.htm

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved