Android的四种储存方式(SQLite、FileSystem、SDCardSystem、SharedPreferences)
主要记录一下安卓中几种常用的存储方式的用法。
一、SQLite
1、创建SQLiteOpenHelper对象(当然SQLiteOpenHelper是抽象类,不能直接创建);
2、通过上面创建的对象调用getWritableDatabase()方法获取SQLiteDatabase对象;
3、通过SQLiteDatabase对象就可以操作数据库了。
- 创建一个类继承自SQLiteOpenHelper
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { private final static String TABLE_NAME="sun";//表名 public DBHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
} @Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table if not exists " + TABLE_NAME+"(id integer primary key autoincrement,sunValue varchar,Date integer)";
db.execSQL(sql);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String sql = "drop table if exists "+ TABLE_NAME;
db.execSQL(sql);
onCreate(db);
} }注意:至少需要创建一个构造方法并调用super方法,并覆写两个方法,第一个方法onCreate创建数据库时调用,第二个方法onUpgrade版本更新时调用。
- 这时可以创建SQLiteOpenHelper对象并调用getWritableDatabase()方法获取SQLiteDatabase对象
DBHelper dbHelper = new DBHelper(MainActivity.this, "db_Sun.db", null, 1);
SQLiteDatabase db = dbHelper.getWritableDatabase();注意:db_Sun.db是要创建的数据库名
- 获取到SQLiteDatabase对象就可操作数据库了,如 :插入一条数据
String sql = "insert into sun(sunValue,Date) values('"+value+"',"+new Date().getTime()+") ";
db.execSQL(sql); - 查询数据库中最新的一条数据(根据时间戳排序查询)
Cursor c = db.rawQuery("select * from sun order by Date desc limit 1", null);
c.moveToFirst();/*************************************/
while (!c.isAfterLast()) {/*************************************/
String sunValue = c.getString(c.getColumnIndex("sunValue"));
long date = c.getLong(c.getColumnIndex("Date"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date2 = new Date(date); Log.i(TAG, sunValue+"--"+sdf.format(date2));
recv_tv.setText(sunValue);
c.moveToNext();/**************************************/
}
c.close();/**************************************/
二、FileSystem
其实就是文件的读存
1、创建File对象 java.io.File.File(File dir, String name)
2、获取输出流/输入流
java.io.FileOutputStream.FileOutputStream(File file, boolean append) throws FileNotFoundException
java.io.FileInputStream.FileInputStream(File file) throws FileNotFoundException
3、写入或读取
4、关闭流
- 下面是一个完整FileSystemStorage的例子(其中Context为上下文,如:MainActivity.this)
package file; import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException; import android.content.Context; public class FileOperation { private FileInputStream fis;// 输入流
private FileOutputStream fos;// 输出流
private final String FILENAME = "fileContent.txt";
private Context context; public FileOperation(Context context) {
super();
this.context = context;
} /**
* 读取系统文件写入的内容
*
* @return
* @throws IOException
*/
public String readFileContent() throws IOException { String filecontent = null; File file = new File(context.getFilesDir(), FILENAME);
fis = new FileInputStream(file); filecontent = readFis(fis); // System.out.println("readFileContent="+filecontent);
return filecontent;
} /**
* 把输入流里面的内容读取到字节数组中
*
* @param fis
* 输入流
* @throws IOException
*/
private String readFis(FileInputStream fis) throws IOException { // 定义缓冲区
byte[] buf = new byte[1024]; int len = -1; StringBuilder sb = new StringBuilder(); // 循环读取fis中的数据
while ((len = fis.read(buf)) != -1) {
sb.append(new String(buf, 0, len));
}
// System.out.println("readFis="+sb.toString());
return sb.toString();
} /**
* 读取文件的最后一行数据
*
* @return
*/
public String readFisLastLine() {
File file = new File(context.getFilesDir(), FILENAME);
String lastLine = null;
String buf = null;
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
if (file.length() > 1024 * 1024 * 1024) {
br.skip(file.length() / 3 * 2);// 当文件超过1M大小的时候,跳过文本长度的2/3,具体跳过多少视实际情况而定,文件越大可以跳过的部分越多
}
while ((buf = br.readLine()) != null && buf != "\n") {
lastLine = buf;
}
br.close();
} catch (IOException e) {
if (br != null) {
try {
br.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
e.printStackTrace();
} return lastLine;
} /**
* 写入文件
*
* @param content
* @throws IOException
*/
public void writeContent(String filecontent) throws IOException {
// 通过传入的文件获得fos,默认为MODE_PRIVATE覆写
File file = new File(context.getFilesDir(), FILENAME);
if (false == file.exists()) {
file.createNewFile();
filecontent = "数据 " + "时间" + "\n" + filecontent;// 加个列名
} fos = new FileOutputStream(file, true);// 追加
// fos=openFileOutput(FILENAME, MODE_PRIVATE); // 向fos写入文件内容
fos.write(filecontent.getBytes());
// 刷新
fos.flush(); // 关闭流,释放资源
fos.close();
}
}
三、SDCardSystem
这和filesystem差不多,只是文件位置不同
- 文件写入方法
/**
* 写入内容
*/
protected void writeContent(String content) {
/**
* 检查SDCard的挂载(插入)状态
*/
String sdCardState = Environment.getExternalStorageState();
Log.i("state", sdCardState);
/**
* 把获取到的sdCard状态,进行判断是否挂载
*/
if (sdCardState.equals(Environment.MEDIA_MOUNTED)) {// SDCard已挂载
File file = new File(Environment.getExternalStorageDirectory(), FILENAME);
Log.i("文件路径:", Environment.getExternalStorageDirectory().getAbsolutePath());
try {
fos = new FileOutputStream(file);
fos.write(content.getBytes());
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
} - 文件读取方法
/**
* 读取SDCard文件的方法
*/ protected String readSdCardFile() {
/**
* 获取并判断SDCard挂载状态
*/
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
// SDCard已挂载
File file = new File(Environment.getExternalStorageDirectory(), FILENAME);
try {
fis = new FileInputStream(file);
content = readFis(fis);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return content;
} private String readFis(FileInputStream fis) throws IOException {
byte[] buf = new byte[1024];
int len = -1;
StringBuilder sb = new StringBuilder();
while ((len = fis.read(buf)) != -1) {// 循环读取fis中的数据
sb.append(new String(buf, 0, len));
}
// 关闭流
fis.close(); return sb.toString();
}
四、SharedPreferences(喜好.xml文件存储)
SharedPreferences文件是一个xml文件,保存的是键值对(key-value)。
1、通过上下文SharedPreferences对象;
2、获取Editor;
3、put值;
4、提交。
- 完整的存储读取类
package file; import java.util.Map;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor; public class FileOperation { private final String SPNAME = "fileContent";// 喜好文件名
private Context context;
private SharedPreferences sp; public FileOperation(Context context) {
super();
this.context = context;
} /**
* 读取系统文件写入的内容(这里读取最后一条)
* @return
*/
public String readFileContent() {
sp = context.getSharedPreferences(SPNAME, Context.MODE_PRIVATE);
// sp.getString(key, defValue);//通过key获取一个value Map<String, ?> map = sp.getAll();
/* for (Entry<String, String> entry : map.entrySet()) {//遍历所有的key-value System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); } */ String lastKey = null;
String lastValue = null;
for (String key : map.keySet()) {//遍历所有的Key,得到最后一个key
lastKey = key;
}
if (null != lastKey) {
lastValue = (String) map.get(lastKey);//获取最后一个value
// lastValue = sp.getString(lastKey, "");
}
return lastValue; } /**
* 写入文件
*
*/
public void writeContent(String key,String value) {
/*
* sp=MainActivity.this.getPreferences(mode);
* 这种方式获取的喜好文件一个Activity有且仅有一个 原因是:它得到的喜好文件的文件名为这个Activity的类名
*/ // 通过上下文获取sp
sp = context.getSharedPreferences(SPNAME, Context.MODE_PRIVATE);
// 获取editor
Editor editor=sp.edit();
//放入键值对
editor.putString(key, value); //注意:放入键值对后一定要提交
editor.commit();
}
}
小结:
SQLite、FileSystem、SharedPreferences方式的文件储存的位置都在根目录下data目录下的data目录下的当前包名下:/data/data/com.yyc.test/...
SDCardSystem方式的存储位置在sd卡中(我手机没有sd卡,不知道为什么直接在根目录下,欢迎右上角QQ交流)
Android的四种储存方式(SQLite、FileSystem、SDCardSystem、SharedPreferences)的更多相关文章
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite
SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中, ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
Android数据的四种存储方式SharedPreferences.SQLite.Content Provider和File (一) —— 总览 作为一个完成的应用程序,数据存储操作是必不可少的. ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences
除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider
ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制.一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.并且此种方式忽略了底层的数据存储实现,Cont ...
- (转)Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences
除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...
- [Android]Android数据的四种存储方式
存储方式 Android提供以下四种存储方式: SharePreference SQLite File ContentProvider Android系统中数据基本都是私有的,一般存放在“data/d ...
- [转][Android]Android数据的四种存储方式
android.database.sqlite类 SQLiteQueryBuilder java.lang.Object android.database.sqlite.SQLiteQueryBuil ...
- Android开发之基本控件和详解四种布局方式
Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方 ...
- Android下的数据储存方式( 二)
在上一篇文章中我们介绍了SharedPreferences的使用方法. 今天我们继续介绍另一种储存数据的方式:使用内部储存和外部储存 每一个Android设备都拥有两个数据储存区域:外部储存和外部储存 ...
随机推荐
- Powershell 脚本调用方法
方法一: Get-Content "D:\PowershellScripts\Test\ErrorMailNotice.ps1" | Invoke-Expression 方法二: ...
- 创建使用pycharm virtualenv
创建使用pycharm virtualenv 在python的世界里,真该感谢有PyCharm,pip,virtualenv 这些好东东,为python程序员提供了极大的方便. virtualenv ...
- MongoDB-4: 查询(二-数组、内嵌文档)
一.简介 我们上一篇介绍了db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段,我们今天介绍了对数组和内嵌文档的查询操作,尤其是 ...
- python多线程的适用场景
1.多线程对于计算密集型无用 需求:列表li1每个元素加1,列表li2每个元素加100 # 导入模块 import threading li1 = [11, 22, 33] # +1 li2 = [4 ...
- MySQL具体解释(20)-----------数据库备份和还原
数据备份: 使用mysqldump命令备份 mysqldump命令能够讲数据库中的数据备份成一个文本文件. 表结果和表中的数据将存储在生成的文本中.mysqldump的工作原理非常easy. 他先查出 ...
- mysql以下c连接mysql数据库
1.安装sudo yum install mysql-devel 安装组件和库 2. #include <stdio.h> #include <stdlib.h> #incl ...
- Java String.split() 使用注意
java的split()方法用于字符串中根据指定的字符进行分割,得到的是一个字符串数组 public String[] split(String regex) Splits this string a ...
- Redis四(Set操作)
1.Set操作 Set集合就是不允许重复的列表 集合操作(无序) sadd(name,values) 1 # name对应的集合中添加元素 scard(name) 1 获取name对应的集合中元素个数 ...
- Java 实现文件随机读写-RandomAccessFile
现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”.可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实 ...
- vue之 node.js 的简单介绍
一.什么是 node.js? 它是可以运行在JavaScript的服务平台 二.安装 1.node.js的特性 - 非阻塞IO模型 - 时间驱动 2.运用场景 - 高并发低业务 - 实时场景 - 聊天 ...