美文网首页
数据持久化

数据持久化

作者: Amy木婉清 | 来源:发表于2021-05-17 16:19 被阅读0次

1.什么是数据持久化?

在介绍数据持久化技术之前,我们先引用一个概念,瞬时数据
瞬时数据是指那些存储在内存当中,有可能会因为程序关闭或其他原因导致内存被回收而丢失的数据。这对于一些关键性的数据信息来说是不能容忍的。
例如:自己发了一条朋友圈,刷新一下数据就消失了,这是很不友好的。
那么怎样才能保证一些关键性信息不丢失呢?这时就需要引用数据持久化技术了。
数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在电脑或手机在关闭状态,这些数据仍然不会消失。保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是持久状态的。持久化技术则是提供了一种机制可以让数据在瞬时状态和持久状态之间转换。

2.Android的持久化技术

Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即:

1.文件存储
2.SharedPreference 存储
3.数据库存储

除了以上三种方式,还可以将数据保存在手机的SD卡中,不过使用以上三种方式相对简单来些,而且比直接保存在SD卡中相对较安全。

3.SharedPreferences存储

3.1.使用键值对的方式来存储数据,SharedPreferences文件都是存放在/data/data/<packagename>/shared_prefs/目录下的
3.2.获取SharedPreferences对象的三种方法

1)Context类中的getSharedPreferences()方法
2)Activity类中的getPreferences()方法
3)PreferenceManager 类中的getDefaultSharedPreferences()方法

3.3.写数据到SharedPreferences中

为了把数据写到SharedPreferences文件,需要通过执行edit()创建一个 SharedPreferences.Editor,然后通过Editor对象的putXxx()方法存入键值对数据,最后commit()方法提交数据

SharedPreferences sp= getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();
3.4.从SharedPreferences读取数据
public class Calc extends Activity {
    public static final String PREFS_NAME = "MyPrefsFile";

    @Override
    protected void onCreate(Bundle state){
       super.onCreate(state);
       SharedPreferences sp= getSharedPreferences(PREFS_NAME, 0);
       boolean silent = sp.getBoolean("silentMode", false);
       setSilent(silent);
    }

    @Override
    protected void onStop(){
       super.onStop();
      SharedPreferences sp= getSharedPreferences(PREFS_NAME, 0);
      SharedPreferences.Editor editor = sp.edit();
      editor.putBoolean("silentMode", mSilentMode);
      editor.commit();
    }
}

4.手机内存

保存在手机内存的数据是应用私有的,其他应哟无权访问,当用户卸载应用的时候,数据也会随之被删除。
通过Activity的openFileOutput()和 openFileInput()方法可以拿到输出流和输入流,然后通过流读写数据。

4.1创建并写入文件到手机内存
String FILENAME = "hello_file";
String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();

openFileOutput(),参数1:文件名,参数2:文件访问模式,文件默认存储到/data/data/<packagename>/files/目录下的

模式及其说明:

MODE_PRIVATE: 私有模式,默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容
MODE_WORLD_READABLE: 只读模式,API 17后过时
MODE_WORLD_WRITEABLE: 只写模式,API 17后过时
MODE_APPEND: 追加模式,如果该文件已存在就往文件里面追加内容,不存在就创建新文件

注意:Android 7.0 之后,使用 FileProvider分享私有数据

4.2从手机内存读取文件
 FileInputStream inputStream = null;
        try {
            inputStream = openFileInput(FILENAME);
            ...
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (inputStream != null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
4.3缓存文件

1)getCacheDir:获取缓存路径
2)getFilesDir:获取缓存的绝对路径

File.createTempFile()
public File getTempFile(Context context, String url) {
    File file;
    try {
        String fileName = Uri.parse(url).getLastPathSegment();
        file = File.createTempFile(fileName, null, context.getCacheDir());
    catch (IOException e) {
        // Error while creating file
    }
    return file;
}

5.手机外部存储

5.1读写文件权限,在清单文件中配置
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

动态检查权限

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}

将文件以public形式保存在外部存储

public File getAlbumStorageDir(String albumName) {
    // Get the directory for the user's public pictures directory.
    File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES), albumName);
    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}

将文件以private形式保存在外部存储中

public File getAlbumStorageDir(Context context, String albumName) {
    // Get the directory for the app's private pictures directory.
    File file = new File(context.getExternalFilesDir(
            Environment.DIRECTORY_PICTURES), albumName);
    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}
查询剩余空间

可以通过File类的getFreeSpace()方法获取剩余空间,getTotalSpace()方法获取总大小

删除文件

可以通过File对象的delete方法删除文件,如果文件保存在内部存储,可以通过Context的deleteFile(fileName)方法删除

Environment

1、getExternalStorageState():获取外部存储状态
状态以及说明:
MEDIA_MOUNTED: SD卡已经挂载,可用
MEDIA_UNKNOWN: 不能识别SD卡
MEDIA_MOUNTED_READ_ONLY: 只读状态
MEDIA_UNMOUNTED: SD卡存在但是没有挂载
MEDIA_REMOVED: SD卡已经移除
MEDIA_CHECKING: SD卡正在准备

方法及说明:
getExternalStorageDirectory(): 获取外部存储路径
getExternalStoragePublicDirectory(): 获取public的外部路径
getExternalFilesDir(): 获取私有的外部路径
getDataDirectory(): rom内存

使用SQLite数据库

数据库文件会存放在/data/data/<package name>/databases/目录下

1、SQLiteOpenHelper

创建数据库的辅助类

public class MySQLiteOpenHelper extends SQLiteOpenHelper {

    private static final String DB_NAME = "user.db";
    private static final int VERSION = 1;

    public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        //name:数据库名称,version:数据库版本,factory:游标工厂
    }

    public MySQLiteOpenHelper(Context context) {
        super(context, DB_NAME, null, VERSION);
    }
    //数据库创建
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table person (_id integer primary key autoincrement, " +
                "name char(10), phone char(20), money integer(20))");
    }
    //数据库升级
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
    }
}

游标Cursor

moveToNext() 移动到下一个数据
moveToFirst() 移动到第一个数据
moveToPrevious() 移动到前一个数据
moveToLast() 移动到下一个数据
getString() 获取String类型的值
getInt() 获取int类型的值
getColumnIndex() 获取列索引
getColumnNames() 获取所有字段名字
getCount() 获取数据的个数

事务Transaction
try {
    //开启事务
    db.beginTransaction();
    ...........
    //设置事务执行成功
    db.setTransactionSuccessful();
} finally{
    //关闭事务
    //如果此时已经设置事务执行成功,则sql语句生效,否则不生效
    db.endTransaction();
}
数据库SQLiteDatabase

常用的一些方法:
execSQL(): 执行SQL语句实现增删操作
Cursor rawQuery(): 执行sql语句查询数据库
insert(): 往数据库插入数据
delete(): 从数据库删除数据
update(): 更新数据库
query(): 查询数据
beginTransaction(): 开始事务
setTransactionSuccessful(): 设置事务成功
endTransaction(): 结束事务

查询数据库
db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);

table 表名
columns 查询的字段
selection 查询条件,对应sql语句的where条件
selectionArgs 填充查询条件的占位符
groupBy 分组参数
having 分组条件
orderBy 排序,“字段名 desc/ ASC”
limit 分页查询,“m,n”,m表示从第几条开始查,n表示一个查询多少条数据

select * from blacknumber limit pagesize offset startindex
//pageSize每页有多少条数据,startIndex 从哪条数据开始
android的数据持久化方式分为五种:

1 使用SharedPreferences存储数据;
2 文件存储数据;xml,json
3 SQLite数据库存储数据;
4 使用ContentProvider存储数据;
5 网络存储数据;

相关文章

  • Docker学习(13) 卷与持久化数据

    Docker学习(13) 卷与持久化数据 卷与持久化数据——简介 数据主要分为两种:持久化和非持久化。 持久化:就...

  • iOS本地数据持久化

    iOS本地数据持久化 iOS本地数据持久化

  • Redis-2 数据持久化及持久化配置

    一、数据持久化 开启持久化功能后,重启redis,数据会自动通过持久化文件恢复!! 1、redis持久化 – 两种...

  • 面试相关

    数据持久化 什么是持久化狭义的理解: “持久化”仅仅指把域对象永久保存到数据库中;广义的理解,“持久化”包括和数据...

  • GeekBand iOS开发高级进阶学习笔记(第四周)

    简易数据存储 数据持久化分为本体持久化和云端持久化本体持久化可以存在本地文件或数据库。云端可以存在iCloud,存...

  • iOS数据持久化

    Title: iOS数据持久化 ##数据持久化概念 数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型...

  • redis与memcache区别

    1、持久化 redis是支持持久化存储,宕机重启数据不会丢失,memcache重启后数据丢失 redis持久化的方...

  • iOS本地数据持久化

    转载自:CocoaChina - iOS本地数据持久化 本文内容:iOS本地数据持久化的几种类型iOS本地数据持久...

  • Android数据持久化的设计

    title: Android数据持久化 版 本 历 史 1. 数据持久化简介 1.1 数据持久化的需求 在网络异常...

  • 浅谈iOS持久化存储——沙盒存储

    前言 持久化是将程序数据的持久状态和瞬时状态转化的机制,通俗的讲,就是瞬时数据持久化为持久数据。持久化(Persi...

网友评论

      本文标题:数据持久化

      本文链接:https://www.haomeiwen.com/subject/aoeejltx.html