国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android系統(tǒng)的五種數據存儲形式實例(一)

2019-12-12 04:23:57
字體:
來源:轉載
供稿:網友

Android系統(tǒng)有五種數據存儲形式,分別是文件存儲、SP存儲、數據庫存儲、contentprovider 內容提供者、網絡存儲。其中,前四個是本地存儲。存儲的類型包括簡單文本、窗口狀態(tài)存儲、音頻視頻數據、XML注冊文件的各種數據。各種存儲形式的特點不盡相同,因此對于不同的數據類型有著固定的存儲形式,本文為演示方便給出的案例基本相同,都是是采用賬號登錄來演示數據存儲,保存賬號和密碼信息,下次登錄時記住賬號和密碼。重在說明各種存儲形式的原理。

文件存儲:

以I/O流的形式把數據存入手機內存或SD卡,可以存儲大數據,如音樂、圖片或視頻等。對于手機內存來說系統(tǒng)會根據每個應用的包名創(chuàng)建一個/data/data/包名/的文件夾,訪問自己包名下的目錄是不需要權限的,并且 Android 已經提供了非常簡便的 API 可以直接去訪問該文件夾。訪問時可以用getFilesDir()和getCacheDir(),兩個的區(qū)別是系統(tǒng)會自動清理后者中的內容。

SD卡中的文件通常位于mnt/sdcard目錄下,不同生產商生產的手機這個路徑可能不同。操作sd卡的時通常要判斷下sd卡是否可用以及剩余空間是否足夠,因為部分手機的SD卡可卸載,SD卡處于非掛載狀態(tài)時,無法進行讀寫操作。另外一點,對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文件,以鍵值對的形式存入手機內存中。常用于存儲簡單的參數設置,如登陸賬號密碼的存儲,窗口功能狀態(tài)的存儲等,該存儲文件位于: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語法,是項目中經常被采用的一種數據存儲方式,通常用于存儲用戶信息等,例如在手機上做一個學生信息管理系統(tǒng)。SQLite 是一款內置到移動設備上的輕量型的數據庫,SQLiteOpenHelper 是Android 提供的一個抽象工具類,負責管理數據庫的創(chuàng)建、升級工作。數據庫的路徑為:/data/data/應用包名/databases/數據庫。如果想創(chuàng)建數據庫,就需要自定義一個類繼承SQLiteOpenHelper,然后覆寫其中的抽象方法,指定數據庫名、版本號。在onCreate() 方法中通過執(zhí)行sql 語句實現表的創(chuàng)建。如果只是創(chuàng)建出來該類并不會真正的去創(chuàng)建數據庫,而是需要通過執(zhí)行helper.getWritableDatabase()或者hepler.getReadableDatabase()。另外想要對創(chuàng)建的數據庫進行增刪改查的操作可以單獨定義一個類實現。增刪改查操作有兩種方式,一是直接執(zhí)行sql語句,另一個是Android自身的API實現。用數據庫實現賬號登錄顯得有些大材小用,為演示數據庫的原理本文給出的案例是用數據庫記錄多個用戶的賬號和密碼信息,并把最后一個賬號信息回顯在界面。但實際應用中很少這樣做。

從手機文件中導出數據庫文件并不可以直接打開,因此可以用可視化工具和sqlite3操作工具進行查看。這里介紹sqlite3工具的使用。具體需要的步驟如下:

1. 執(zhí)行adb shell命令進入Linuxne內核;

2. 使用cd進入數據庫所在的路徑 cd: /data/data/應用包名/databases;

3. 進入數據庫模式: sqlite3 數據庫名.db;

4. 執(zhí)行SQL語句       

Sqlite3操作演示:

數據庫存儲路徑:

數據庫實現方法,先創(chuàng)建一個類繼承SqliteOpenHelper,在類中創(chuàng)建數據庫和表:

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 }}

創(chuàng)建一個工具類實現對數據庫的操作:

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();  } }}

用數據庫實現賬號登錄案例的目錄結構如下所示:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 太仆寺旗| 渑池县| 曲沃县| 资兴市| 苗栗市| 梁山县| 江油市| 固安县| 南川市| 齐齐哈尔市| 莱西市| 溧阳市| 柳林县| 金川县| 密山市| 郴州市| 吐鲁番市| 紫阳县| 原阳县| 宣威市| 厦门市| 云霄县| 吉安市| 彭阳县| 四川省| 会理县| 德江县| 六安市| 卫辉市| 桃园县| 若羌县| 保靖县| 衡阳县| 广灵县| 万山特区| 怀远县| 荔浦县| 西充县| 资溪县| 南皮县| 南雄市|