Android系统的五种数据存储形式实例(一)


本文整理自网络,侵删。

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文件,其的路径如下:

阅读剩余部分

相关阅读 >>

Sqlitestudio优雅调试android手机数据库Sqlite(推荐)

Sqlite3 命令行操作指南

django基础之数据库操作方法(详解)

详解android数据存储—使用Sqlite数据库

python创建sql数据库流程逐步讲解

android毕业设计备忘录app

android调试工具adb命令大全

android开发笔记之android中数据的存储方式(一)

详解Sqlite中的查询规划器

pandas直接读取sql脚本的方法

更多相关阅读请进入《Sqlite》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...