Android系統的五種資料存放區形式執行個體(一)_Android

來源:互聯網
上載者:User

Android系統有五種資料存放區形式,分別是檔案儲存體、SP儲存、資料庫儲存、contentprovider 內容提供者、網路儲存。其中,前四個是本機存放區。儲存的類型包括簡單文本、視窗狀態儲存、音頻視頻資料、XML註冊檔案的各種資料。各種儲存形式的特點不盡相同,因此對於不同的資料類型有著固定的儲存形式,本文為示範方便給出的案例基本相同,都是是採用帳號登入來示範資料存放區,儲存帳號和密碼資訊,下次登入時記住帳號和密碼。重在說明各種儲存形式的原理。

檔案儲存體:

以I/O流的形式把資料存入手機記憶體或SD卡,可以儲存大資料,如音樂、圖片或視頻等。對於手機記憶體來說系統會根據每個應用的包名建立一個/data/data/包名/的檔案夾,訪問自己包名下的目錄是不需要許可權的,並且 Android 已經提供了非常簡便的 API 可以直接去訪問該檔案夾。訪問時可以用getFilesDir()和getCacheDir(),兩個的區別是系統會自動清理後者中的內容。

SD卡中的檔案通常位於mnt/sdcard目錄下,不同生產商生產的手機這個路徑可能不同。操作sd卡的時通常要判斷下sd卡是否可用以及剩餘空間是否足夠,因為部分手機的SD卡可卸載,SD卡處於非掛載狀態時,無法進行讀寫操作。另外一點,對SD卡的讀取和寫入操作均需要相應的許可權,否則無法完成。擷取SD卡路徑的方法是Environment.getExternalStorageDirectory(),其餘操作與檔案儲存體基本類似。

檔案儲存體位置:

SD卡儲存路徑:

資料存放區在手機記憶體的實現方法:

package com.example.qqload;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.example.qqload_sp.R;import android.os.Bundle;import android.app.Activity;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.text.TextUtils;import android.view.Menu;import android.view.TextureView;import android.view.View;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity { private EditText et_qq; private EditText et_password; private CheckBox cb_remenber; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  et_qq = (EditText) findViewById(R.id.et_qq);  et_password = (EditText) findViewById(R.id.et_password);  cb_remenber = (CheckBox) findViewById(R.id.cb_remenber);  File file = new File(getFilesDir(), "info.txt");//  File file = new File(getCacheDir(), "info.txt"); 緩衝中存放資料  if (file.exists() && file.length() > 0) {   try {    FileInputStream fis = new FileInputStream(file);    BufferedReader br = new BufferedReader(new InputStreamReader(      fis));    String line = br.readLine();    String qq = line.split("##")[0];    String password = line.split("##")[1];    et_qq.setText(qq);    et_password.setText(password);    fis.close();   } catch (Exception e) {    // TODO Auto-generated catch block    e.printStackTrace();   }  } } public void login(View view) {  String qq = et_qq.getText().toString().trim();  String password = et_password.getText().toString().trim();  if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(password)) {   Toast.makeText(this, "密碼或者使用者名稱不可為空", 0).show();   return;  }  if (cb_remenber.isChecked()) {   File file = new File(getFilesDir(), "info.txt");   try {    FileOutputStream fos = new FileOutputStream(file);    fos.write((qq + "##" + password).getBytes());    fos.close();    Toast.makeText(MainActivity.this, "儲存成功", 0).show();   } catch (Exception e) {    Toast.makeText(MainActivity.this, "儲存失敗", 0).show();    e.printStackTrace();   }  } }} 

資料存放區在SD卡中的實現方法:     

package com.example.qqload;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 java.text.Format;import com.example.qqload_sp.R;import android.os.Bundle;import android.os.Environment;import android.app.Activity;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.text.TextUtils;import android.text.format.Formatter;import android.view.Menu;import android.view.TextureView;import android.view.View;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity { private EditText et_qq; private EditText et_password; private CheckBox cb_remenber; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  et_qq = (EditText) findViewById(R.id.et_qq);  et_password = (EditText) findViewById(R.id.et_password);  cb_remenber = (CheckBox) findViewById(R.id.cb_remenber);  File file = new File(Environment.getExternalStorageDirectory(), "info.txt");  if (file.exists() && file.length() > 0) {   try {    FileInputStream fis = new FileInputStream(file);    BufferedReader br = new BufferedReader(new InputStreamReader(      fis));    String line = br.readLine();    String qq = line.split("##")[0];    String password = line.split("##")[1];    et_qq.setText(qq);    et_password.setText(password);    fis.close();   } catch (Exception e) {    // TODO Auto-generated catch block    e.printStackTrace();   }  } } public void login(View view) {  String qq = et_qq.getText().toString().trim();  String password = et_password.getText().toString().trim();  if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(password)) {   Toast.makeText(this, "密碼或者使用者名稱不可為空", 0).show();   return;  }  if (cb_remenber.isChecked()) {   File file = new File(Environment.getExternalStorageDirectory(), "info.txt");   //判斷SD卡是否掛載   if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){    Toast.makeText(MainActivity.this, "SD卡不可用", 0).show();    return;   }   //判斷SD卡大小是否充足   long size = Environment.getExternalStorageDirectory().getFreeSpace();   String info = Formatter.formatFileSize(this, size);   //此處儲存資料較小就不進行判斷   Toast.makeText(this, "可用空間" + info, 0).show();      try {    FileOutputStream fos = new FileOutputStream(file);    fos.write((qq + "##" + password).getBytes());    fos.close();    Toast.makeText(MainActivity.this, "儲存成功", 0).show();   } catch (Exception e) {    Toast.makeText(MainActivity.this, "儲存失敗", 0).show();    e.printStackTrace();   }  } }}

SP儲存:

SP儲存本質上是一個XML檔案,以索引值對的形式存入手機記憶體中。常用於儲存簡單的參數設定,如登陸帳號密碼的儲存,視窗功能狀態的儲存等,該隱藏檔位於:data/data/包名/shared_prefs檔案夾中。使用的時候,首先需要通過context.getSharedPrefrences(String name,int mode)擷取SharedPrefrences的執行個體對象,儲存資料時,用SharedPrefrences的執行個體對象得到SharedPrefrences檔案的編輯器,在編輯器中用putXxx()添加資料,之後務必用commit提交資料,否則無法擷取資料。取資料時,直接用getXxx()方法。

sp儲存自動產生xml檔案,其的路徑如下:

sp儲存的實現方法:

package com.example.qqload;import com.example.qqload_sp.R;import android.os.Bundle;import android.app.Activity;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.text.TextUtils;import android.view.Menu;import android.view.TextureView;import android.view.View;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity { private EditText et_qq; private EditText et_password; private CheckBox cb_remenber;  private SharedPreferences sp; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  et_qq = (EditText) findViewById(R.id.et_qq);  et_password = (EditText) findViewById(R.id.et_password);  cb_remenber = (CheckBox) findViewById(R.id.cb_remenber);  sp = this.getSharedPreferences("config", 0);  String qq = sp.getString("qq","");  String password = sp.getString("password","");  et_qq.setText(qq);  et_password.setText(password); } public void login(View view){  String qq = et_qq.getText().toString().trim();  String password = et_password.getText().toString().trim();  if(TextUtils.isEmpty(qq)||TextUtils.isEmpty(password)){   Toast.makeText(this,"密碼或者使用者名稱不可為空",0).show();   return;  }  if(cb_remenber.isChecked()){   Editor edit = sp.edit();   edit.putString("qq",qq);   edit.putString("password",password);   edit.commit();  } }}

 資料庫儲存:

資料庫所有資訊都儲存在單一檔案內,佔用記憶體小,並且支援基本SQL文法,是項目中經常被採用的一種資料存放區方式,通常用於儲存使用者資訊等,例如在手機上做一個學生資訊管理系統。SQLite 是一款內建到行動裝置上的輕量型的資料庫,SQLiteOpenHelper 是Android 提供的一個抽象工具類,負責管理資料庫的建立、升級工作。資料庫的路徑為:/data/data/應用程式套件名/databases/資料庫。如果想建立資料庫,就需要自訂一個類繼承SQLiteOpenHelper,然後覆寫其中的抽象方法,指定資料庫名、版本號碼。在onCreate() 方法中通過執行sql 語句實現表的建立。如果只是建立出來該類並不會真正的去建立資料庫,而是需要通過執行helper.getWritableDatabase()或者hepler.getReadableDatabase()。另外想要對建立的資料庫進行增刪改查的操作可以單獨定義一個類實現。增刪改查操作有兩種方式,一是直接執行sql語句,另一個是Android自身的API實現。用資料庫實現帳號登入顯得有些大材小用,為示範資料庫的原理本文給出的案例是用資料庫記錄多個使用者的帳號和密碼資訊,並把最後一個帳號資訊回顯在介面。但實際應用中很少這樣做。

從手機檔案中匯出資料庫檔案並不可以直接開啟,因此可以用視覺化檢視和sqlite3操作工具進行查看。這裡介紹sqlite3工具的使用。具體需要的步驟如下:

1. 執行adb shell命令進入Linuxne核心;

2. 使用cd進入資料庫所在的路徑 cd: /data/data/應用程式套件名/databases;

3. 進入資料庫模式: sqlite3 資料庫名.db;

4. 執行SQL語句       

Sqlite3操作示範:

資料庫儲存路徑:

資料庫實現方法,先建立一個類繼承SqliteOpenHelper,在類中建立資料庫和表:

package com.example.qqload.db;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class UserDBOpenhelper extends SQLiteOpenHelper { public UserDBOpenhelper(Context context) {  super(context, "user.db", null, 1);  // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase arg0) {  arg0.execSQL("create table user (_id integer primary key autoincrement,name vachar(20),password varchar(20))"); } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {  // TODO Auto-generated method stub }}

建立一個工具類實現對資料庫的操作:

package com.example.qqload.db.dao;import java.util.ArrayList;import java.util.List;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import com.example.qqload.db.UserDBOpenhelper;public class UserDao { private UserDBOpenhelper helper;  public UserDao(Context context){  helper = new UserDBOpenhelper(context); } public long add(String name,String password){  SQLiteDatabase db = helper.getWritableDatabase();  //用SQL語句實現增加資料的功能  //db.execSQL("insert into user (name,passeord) values (?,?)", new Object[]{name,password});  //android自身API實現修改功能可以有傳回值  ContentValues values =new ContentValues();  values.put("name", name);  values.put("password", password);  long result = db.insert("user", null, values); //帶傳回值,表示添加在哪一行  db.close();  return result; } public List<user> findAll(){  List<user> list =new ArrayList<user>();  SQLiteDatabase db = helper.getReadableDatabase();  //Cursor cursor = db.rawQuery("select name, password from user", null);  Cursor cursor = db.query("user", new String[]{"name","password"}, null, null, null, null, null);  while(cursor.moveToNext()){   String name = cursor.getString(0);   String password = cursor.getString(1);   user us = new user();   us.setName(name);   us.setPassword(password);   list.add(us);  }  cursor.close();  db.close();  return list; }}

在主方法中實現帳號登入和記錄

package com.example.qqload;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 java.util.List;import com.example.qqload.db.dao.UserDao;import com.example.qqload.db.dao.user;import com.example.qqload.R;import android.os.Bundle;import android.app.Activity;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.text.TextUtils;import android.view.Menu;import android.view.TextureView;import android.view.View;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity { private EditText et_qq; private EditText et_password; private CheckBox cb_remenber; private UserDao dao; private List<user> list; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  et_qq = (EditText) findViewById(R.id.et_qq);  et_password = (EditText) findViewById(R.id.et_password);  cb_remenber = (CheckBox) findViewById(R.id.cb_remenber);  user u = new user();  dao = new UserDao(MainActivity.this);  list = dao.findAll();  if (list.size() == 0) {   et_qq.setText("");   et_password.setText("");  } else {   System.out.println("大小:" + list.size());   for (int i = 0; i < list.size(); i++) {    System.out.println(list.get(i).getName() + "::::" + list.get(i).getPassword());   }   u = list.get(list.size()-1);   String qq = u.getName();   String password = u.getPassword();   et_qq.setText(qq);   et_password.setText(password);  } } public void login(View view) {  String qq = et_qq.getText().toString().trim();  String password = et_password.getText().toString().trim();  if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(password)) {   Toast.makeText(this, "密碼或者使用者名稱不可為空", 0).show();   return;  }  if (cb_remenber.isChecked()) {   dao.add(qq, password);   //在工具類添加增加功能   Toast.makeText(MainActivity.this, "儲存成功", 0).show();  } }}

用資料庫實現帳號登入案例的目錄結構如下所示:

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.