Android的多种数据存储方式

1. 简介

作为一个完整的应用程序,数据存储操作是必不可少的。现在Android的离线缓存就是通过网络良好状态时将从服务器收到的数据保存到本地。Android系统中主要提供了3种方式进行数据存储,分别是文件存储、SharedPreference存储以及数据库存储。另外,还可以将数据存储在手机的SD卡中,但是前3种方式会比存储在SD卡中更加简单和安全。

2. 文件存储

文件存储是android中最基本的一种数据存储方式,它适用于存储一些简单的文本数据或者二进制数据。

2.1 将数据存储到文件中

   private void save(String input) throws IOException {
        FileOutputStream out = null;
        BufferedWriter writer = null;
        out = openFileOutput("data", Context.MODE_PRIVATE);
        writer = new BufferedWriter(new OutputStreamWriter(out));
        try {
            writer.write(input);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(writer !=null){
                writer.close();
            }
        }
    }

Context类中提供了openFileOutput()方法,可以将数据存储到指定的文件中。第一个参数是文件名,可以不包含完整路径,因为所有文件都默认存储到指定目录下。第二个参数是文件操作模式,MODE_PRIVATE(覆盖原文件内容)、MODE_APPEND(在原文件后追加内容) 返回值是FileOutputStream对象,然后借助这个对象构建出一个OutputStreamWriter对象,接着再构建出一个BufferedWriter对象写入文件。

2.2 从文件中读取数据

private String load() throws IOException {
        FileInputStream in = null;
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();
        in = openFileInput("data");
        reader = new BufferedReader(new InputStreamReader(in));
        String line = "";
        while((line = reader.readLine())!=null){
            content.append(line);
        }
        if(reader!=null){
            reader.close();
        }
        return content.toString();
    }

Context类中提供openFileInput()方法,只接受一个参数,就是要读取的文件名,然后返回FileInputStream对象,然后借助它又构建出一个InputStreamReader对象,接着再构建出一个BufferedReader对象,就可以一行行地读取,并且存放在StringBuilder里面。

3.SharedPreferences存储

3.1SharedPreferences文件存储数据

SharePreferences使用键值对的方式来存储数据,而且支持多种不同数据类型存储,即存储的数据是整型,那么读取出来的数据也是整型。SharePreferences文件是使用XML格式来对数据进行管理的。
使用SharedPreferences存储,首先要获取SharedPreferences对象。

  1. Context类中的getSharedPreferences()方法
    第一个参数是文件名、第二个参数是操作模式,只有MODE_PRIVATE模式可选,与0效果相同,表示只有当前的应用程序才能对SharedPreferences文件进行读写。
  2. Activity类中的getPreferences()方法
    只有一个操作数作为参数,文件名默认使用当前类名。
  3. PreferenceManager类中的getDefaultSharedPreferences()方法
    这是一个静态方法,只接受一个Context参数。自动使用当前包名作文SharedPreferences文件名。

然后开始存储数据

  1. 调用SharedPreferences对象的edit()方法获取SharedPreferences.Editor对象。
  2. 向SharedPreferences.Editor对象中添加数据。
  3. 调用apply()方法将添加的数据提交,从而完成数据存储操作。
BtPut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences.Editor editor =getSharedPreferences("data",MODE_PRIVATE).edit();
                editor.putString("data",editText.getText().toString());
                editor.apply();
            }
        });

3.2SharedPreferences文件读取数据

1.获取SharedPreferences对象,然后get出来。

SharedPreferences  pref = getSharedPreferences("data",MODE_PRIVATE);
                String strs = pref.getString("data","空");
                editText.setText(strs);

4.使用LitePal操作数据库存储数据

  1. 配置LitePal
    在build.gradle中增加语句
compile 'org.litepal.android:core:1.5.1'
  1. 在app/src/main/目录下创建一个目录assets,在该目录下新建一个litepal.xml文件(记得加后缀),接着编辑文件内容
<?xml version="1.0" encoding="utf-8"?>
    <litepal>
    <dbname value="BookStore" ></dbname>
    <version value="1" ></version>
</litepal>
  1. 修改AndroidManifest.xml中的代码
    在<application>中添加语句
android:name="org.litepal.LitePalApplication"
  1. 创建表
    只需要定义一个Book类,继承DataSupport。
    在litepal.xml中添加代码
<list>
        <mapping class ="com.example.peek_mapdemotest.filesave.Book"></mapping>
    </list>
  1. 新建数据库
BtPut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LitePal.getDatabase();
            }
        });
  1. 插入和查询数据库
BtGet.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Book book = new Book();
                book.setName("123");
                book.setId(123);
                book.setPages(456);
                book.setPrice(14.222);
                book.save();
                List<Book> books = DataSupport.findAll(Book.class);
                for(Book book1:books){
                Toast.makeText(MainActivity.this,book1.getName()+book1.getId()+book1.getPages(),Toast.LENGTH_SHORT).show();
                }
            }
        });

7.更新数据

book.setPrice(14.96);
                book.updateAll("name=? and author = ?","123","123");

8.删除数据

DataSupport.deleteAll(Book.class,"price< ? ","15");

sqllite数据库的操作相比于Litepal数据库操作的操作语句更加复杂,而且litepal能做到sqlite相同的效果,这里就不详细说明了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,598评论 25 707
  • 任何一个应用程序,其实说白了就是在不停地和数据打交道,我们聊QQ、看新闻、刷微博,所关心的都是里面的数据,...
    AndYMJ阅读 1,585评论 2 5
  • 她对他的喜欢,就像一只埋在沙里的风铃,没有风,不会响,他从来不给她一丝风的安慰。 那天,她紧紧攥着好朋友的手,手心...
    浮游Jean阅读 426评论 1 0
  • 和他在一起拘谨得像个要犯错的孩子,不知道为什么跟他在一起就是别扭不舒服,这不是爱情本应该有的状态。我并不快乐,如果...
    赵明娇阅读 210评论 0 0
  • 今天最值得记的一件事就是买成了10.18张火丁&王珮瑜《红棕烈马》的票。 ^_^ 中午将近12点时接到的电...
    白菜CHOUX阅读 191评论 3 1