最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年12月08日 11:41:40   作者:huang502  
Android系統(tǒng)有五種數(shù)據(jù)存儲形式,分別是文件存儲、SP存儲、數(shù)據(jù)庫存儲、contentprovider 內(nèi)容提供者、網(wǎng)絡(luò)存儲。本篇文章詳解的介紹了每種數(shù)據(jù)存儲的用法,有興趣的可以了解一下。

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

文件存儲:

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

SD卡中的文件通常位于mnt/sdcard目錄下,不同生產(chǎn)商生產(chǎn)的手機這個路徑可能不同。操作sd卡的時通常要判斷下sd卡是否可用以及剩余空間是否足夠,因為部分手機的SD卡可卸載,SD卡處于非掛載狀態(tài)時,無法進行讀寫操作。另外一點,對SD卡的讀取和寫入操作均需要相應(yīng)的權(quán)限,否則無法完成。獲取SD卡路徑的方法是Environment.getExternalStorageDirectory(),其余操作與文件存儲基本類似。

文件存儲位置:

SD卡存儲路徑:

數(shù)據(jù)存儲在手機內(nèi)存的實現(xiàn)方法:

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"); 緩存中存放數(shù)據(jù)
  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();
   }
  }
 }
} 

數(shù)據(jù)存儲在SD卡中的實現(xiàn)方法:     

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);
   //此處存儲數(shù)據(jù)較小就不進行判斷
   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存儲本質(zhì)上是一個XML文件,以鍵值對的形式存入手機內(nèi)存中。常用于存儲簡單的參數(shù)設(shè)置,如登陸賬號密碼的存儲,窗口功能狀態(tài)的存儲等,該存儲文件位于:data/data/包名/shared_prefs文件夾中。使用的時候,首先需要通過context.getSharedPrefrences(String name,int mode)獲取SharedPrefrences的實例對象,存儲數(shù)據(jù)時,用SharedPrefrences的實例對象得到SharedPrefrences文件的編輯器,在編輯器中用putXxx()添加數(shù)據(jù),之后務(wù)必用commit提交數(shù)據(jù),否則無法獲取數(shù)據(jù)。取數(shù)據(jù)時,直接用getXxx()方法。

sp存儲自動生成xml文件,其的路徑如下:

sp存儲的實現(xiàn)方法:

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

 數(shù)據(jù)庫存儲:

數(shù)據(jù)庫所有信息都存儲在單一文件內(nèi),占用內(nèi)存小,并且支持基本SQL語法,是項目中經(jīng)常被采用的一種數(shù)據(jù)存儲方式,通常用于存儲用戶信息等,例如在手機上做一個學(xué)生信息管理系統(tǒng)。SQLite 是一款內(nèi)置到移動設(shè)備上的輕量型的數(shù)據(jù)庫,SQLiteOpenHelper 是Android 提供的一個抽象工具類,負責(zé)管理數(shù)據(jù)庫的創(chuàng)建、升級工作。數(shù)據(jù)庫的路徑為:/data/data/應(yīng)用包名/databases/數(shù)據(jù)庫。如果想創(chuàng)建數(shù)據(jù)庫,就需要自定義一個類繼承SQLiteOpenHelper,然后覆寫其中的抽象方法,指定數(shù)據(jù)庫名、版本號。在onCreate() 方法中通過執(zhí)行sql 語句實現(xiàn)表的創(chuàng)建。如果只是創(chuàng)建出來該類并不會真正的去創(chuàng)建數(shù)據(jù)庫,而是需要通過執(zhí)行helper.getWritableDatabase()或者hepler.getReadableDatabase()。另外想要對創(chuàng)建的數(shù)據(jù)庫進行增刪改查的操作可以單獨定義一個類實現(xiàn)。增刪改查操作有兩種方式,一是直接執(zhí)行sql語句,另一個是Android自身的API實現(xiàn)。用數(shù)據(jù)庫實現(xiàn)賬號登錄顯得有些大材小用,為演示數(shù)據(jù)庫的原理本文給出的案例是用數(shù)據(jù)庫記錄多個用戶的賬號和密碼信息,并把最后一個賬號信息回顯在界面。但實際應(yīng)用中很少這樣做。

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

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

2. 使用cd進入數(shù)據(jù)庫所在的路徑 cd: /data/data/應(yīng)用包名/databases;

3. 進入數(shù)據(jù)庫模式: sqlite3 數(shù)據(jù)庫名.db;

4. 執(zhí)行SQL語句       

Sqlite3操作演示:

數(shù)據(jù)庫存儲路徑:

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

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)建一個工具類實現(xiàn)對數(shù)據(jù)庫的操作:

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語句實現(xiàn)增加數(shù)據(jù)的功能
  //db.execSQL("insert into user (name,passeord) values (?,?)", new Object[]{name,password});
  //android自身API實現(xiàn)修改功能可以有返回值
  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;
 }
}

在主方法中實現(xiàn)賬號登錄和記錄

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

用數(shù)據(jù)庫實現(xiàn)賬號登錄案例的目錄結(jié)構(gòu)如下所示:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android利用動畫實現(xiàn)背景逐漸變暗

    Android利用動畫實現(xiàn)背景逐漸變暗

    這篇文章主要為大家詳細介紹了Android利用動畫實現(xiàn)背景逐漸變暗的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android?自定義開源庫?EasyView實現(xiàn)詳解

    Android?自定義開源庫?EasyView實現(xiàn)詳解

    這篇文章主要為大家介紹了Android自定義開源庫EasyView實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 詳解AndroidStudio中代碼重構(gòu)菜單Refactor功能

    詳解AndroidStudio中代碼重構(gòu)菜單Refactor功能

    這篇文章主要介紹了AndroidStudio中代碼重構(gòu)菜單Refactor功能詳解,本文通過代碼演示,功能截圖來詳細說明as為大名重構(gòu)提供的各項功能,需要的朋友可以參考下
    2019-11-11
  • android webView截圖的4種方法

    android webView截圖的4種方法

    這篇文章主要為大家詳細介紹了android webView截圖的4種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android開發(fā)手冊Button按鈕實現(xiàn)點擊音效

    Android開發(fā)手冊Button按鈕實現(xiàn)點擊音效

    這篇文章主要為大家介紹了Android開發(fā)手冊Button按鈕實現(xiàn)點擊音效示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Android實現(xiàn)閱讀進度記憶功能

    Android實現(xiàn)閱讀進度記憶功能

    這篇文章主要介紹了Android實現(xiàn)閱讀進度記憶功能,Android控件WebView實現(xiàn)保存閱讀進度,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 如何用HMS Nearby Service給自己的App添加近距離數(shù)據(jù)傳輸功能

    如何用HMS Nearby Service給自己的App添加近距離數(shù)據(jù)傳輸功能

    這篇文章主要介紹了如何用HMS Nearby Service給自己的App添加近距離數(shù)據(jù)傳輸功能,本文通過圖文示例代碼相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Android藍牙庫FastBle的基礎(chǔ)入門使用

    Android藍牙庫FastBle的基礎(chǔ)入門使用

    這篇文章主要給大家介紹了關(guān)于Android藍牙庫FastBle的基礎(chǔ)入門使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Android?Flutter中Offstage組件的使用教程詳解

    Android?Flutter中Offstage組件的使用教程詳解

    這篇文章主要為大家詳細介紹了Android?Flutter中Offstage組件的使用教程,文中的示例代碼講解詳細,對我們了解Flutter有一定的幫助,需要的可以參考一下
    2023-02-02
  • 安卓Android Context類實例詳解

    安卓Android Context類實例詳解

    在開發(fā)Android的過程中,總是能遇見Context類或者它的實例.Context類的實例經(jīng)常被用來提供“應(yīng)用程序”的引用,下面舉例說明Contex類實例詳解
    2016-07-07

最新評論

盐津县| 夏河县| 乌兰县| 蒲城县| 文成县| 吴江市| 清水河县| 靖西县| 冀州市| 青神县| 竹溪县| 方山县| 铜陵市| 慈溪市| 理塘县| 万安县| 招远市| 陈巴尔虎旗| 珠海市| 色达县| 定日县| 河北省| 精河县| 承德县| 称多县| 遵义县| 永顺县| 渝中区| 渭源县| 富平县| 十堰市| 马边| 东莞市| 大同县| 昌吉市| 大邑县| 安阳市| 界首市| 云和县| 黄梅县| 凤凰县|