android数据存储

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android数据存储相关的知识,希望对你有一定的参考价值。

  数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失,保存在内存中的数据是处于持久状态的,持久化技术则是提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换。android主要提供了三种方式用于简单地实现数据持久化功能,即文件存储,SharedPreference存储以及数据库存储。当然,也可以存储到SD卡中,但使用以上三种方式相比会更安全。

一、文件存储

  Context类中提供了openFileOutput()方法,共两个参数,第一个参数是文件名(不可包含路径),所有的文件默认存储到/data/data/<packagename>/files/目录下的;第二个参数是文件的操作模式,有MODE_PRIVATE(默认),MODE_APPEND两种,MODE_PRIVATE表示当指定同样的文件名时,所写入的内容将会覆盖原文件的内容,MODE_APPEND表示如果该文件已存在则往文件里添加新内容,不存在就创建。此方法返回FileOutputStream对象,得到了这个对象之后就可以使用Java流的方式写入到文件当中。

public void save()
{
          String data = "Data to Save";
          FileOutputStream out = null;
          BufferedWriter writer = null;
          try{
               out = openFileOutput("data",Context.MODE_PRIVATE);
               writer = new BufferedWriter(new OutputStreamWriter(out));
               writer.write(data);
         }catch(Exception e)
         {
               e.printStackTrace();
          }finally
          {
             try{
               if(writer!=null)
               {
                    writer.close();
                }
               }catch(Exception e)
               {  e.printStackTrace(); }
           }
}    

  Context还提供了openFileInput()方法用于从文件中读取数据,只接受一个参数,即要读取的文件名,然后系统会自动到/data/data/<package name>/files/目录下去加载这个文件,并返回FileInputStream对象。

public String read()
    {
        FileInputStream fis = null;
        BufferedReader reader = null;
        StringBuffer content = new StringBuffer();
        try
        {
            fis = this.openFileInput("data");
            reader = new BufferedReader(new InputStreamReader(fis));
            String line = "";
            while ((line=reader.readLine())!=null)
            {
                content.append(line);
            }
        }catch (IOException e)
        {
            e.printStackTrace();
        }finally
        {
            try
            {
                if (reader != null)
                {
                    reader.close();
                }
            }catch (IOException e)
            {
                e.printStackTrace();
            }
        }

        return content.toString();
    }

二、SharedPreferences存储

  SharedPreferences是使用键值对的方式来存储数据的。

  android中提供如下三种方法获取SharedPreferences对象:

  1.Context类中的getSharedPreferences()方法,接收两个参数,第一参数用于指定SharedPreferences文件的名称,SharedPreferences文件都是存放在/data/data/<package name>/shared_prefs/目录下的;第二个参数用于指定操作模式,默认为MODE_PRIVATE表示只有当前应用程序可以对此SharedPreferences文件进行读写,和直接传入0效果是相同的,MODE_MULTI_PROCESS则一般用于会有多个进程对同一个SharedPreferences文件进行读写,类似地,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE这两种操作模式已在Android 4.2版本中被废弃。

  2.Activity类中的getPreferences()

  这个方法和Context中的getSharedPreferences()很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为SharedPreferences的文件名。

  3.PreferenceManager类中的getDefaultSharedPreferences()方法

  这是一个静态方法,接收一个Context参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件。

   得到了SharedPreferences对象后,存储可分为以下三步:

  a.调用SharedPreferences对象的edit()方法获取SharedPreferences.Editor对象。

  b.通过SharedPreferences.Editor对象的诸如putString()等方法完成添加数据。

  c.调用SharedPreferences.Editor对象的commit()方法将添加的数据提交。

   读取:通过SharedPreferences对象的如getString(String key,String defaultIfNull)方法获取对应键的值。

 

三、SQLite数据库存储

  Android专门提供了一个SQLiteOpenHelper帮助类,借助这个类可以非常简单地对数据库进行创建和升级。SQLiteOpenHelper是一个抽象类,有两个抽象方法onCreate()和onUpgrade(),分别用于实现创建、升级数据库。

  getReadableDatabase()和getWritableDatabase()都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同点是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。

  SQLiteOpenHelper构造方法接收四个参数,第一个参数是Context,第二个参数是数据库名,第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null,第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。构建出SQLiteOpenHelper的实例之后,再调用其getReadableDatabase()或getWritableDatabase()方法就能创建数据库了,数据库文件会存放在/data/data/<package name>/databases/目录下,此时,重写的onCreate()方法也会得到执行,所以通常会在这里去处理一些创建表的逻辑。

  create table Book(

    id integer primary key autoincrement,

    author text,

    price real,

    pages integer,

    name text

  )

  SQLite中integer表示整型,real表示浮点型,text表示文本类型,blob表示二进制类型。每个SQLite都会自动生成android_metadata表。

  升级数据库:在onUpgrade()方法中加入要创建表或修改表等逻辑,在实例化实现SQLiteOpenHelper抽象类的自定义类时,让其第四个参数即版本号在原有基础上加1,就可以让onUpgrade()方法得到执行。

  

以上是关于android数据存储的主要内容,如果未能解决你的问题,请参考以下文章

任何更改后的 Android Firebase 数据库活动/片段正在关闭

重新加载时刷新片段

如何在片段中使用 GetJsonFromUrlTask​​.java

viewpager 中的 3 个 android 片段,如何让它们全部存活?

我可以在 android studio 的片段上使用 Firebase 吗?

当sqlite android片段中的数据更改或删除时如何刷新recyclerview?