软件世界网 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
移动开发 架构设计 编程语言 Web前端 互联网
开发杂谈 系统运维 研发管理 数据库 云计算 Android开发资料
  软件世界网 -> 移动开发 -> Android面试准备第二天第五例数据存储 -> 正文阅读

[移动开发]Android面试准备第二天第五例数据存储


参考:http://blog.csdn.net/lmj623565791/article/details/24015867
5、Activity用SharedPreferences保存数据,大小有木有限制?
个人理解:SharedPreferences是哪种存储数据的方式竟然记不清楚了,个人印象中在第一行代码中,介绍了三种数据存储的方式,记得包含SharedPreferences,还有通过IO流把数据存储到手机本地文件下,只记得SQLite数据库存储的方式,不过它们的使用方式已经忘干净了。

所以学习编程对我来说是背书嘛?还是编程有些固定的规则或者思路,供我有迹可循的背书,假定我默认了编程是思想的一种训练的,真的想知道学习编程和未学习对思考是否有本质的影响。
标准答案:这个真心查不到。
二次理解:我需要把数据存储的相关知识点再进行一次学习,试图通过重复记忆的方式探索对我个人思考是否有有效的帮组,比如重复多次以后我更深刻的记住了怎么使用相关方法,甚至更加神奇的我可以举一反三,能更加快速的学习相似的内容。我目前悲观的认为,学习Android知识更多是知道提供哪些功能,熟悉它怎么使用,怎么更加的灵活的使用组装出符合要求的软件,至于为什么提供了这些对象和方法,我想更多的时候是因为Google在宏观层面,根据整体框架设计的需要而来,菜鸟的我只能是盲人摸象。
知识点巩固:
根据第一行代码第六章 数据存储全方案,详解持久化技术,Android提供了三种存储数据的方式:
1、文件存储。
2、SharedPreference存储。
3、SQLite数据库存储
其中关于文件存储和SharedPreference存储,导致我记忆混乱的原因,大概是这两个存储方式的原理和使用方式几乎是一样的,都会在手机指定目录下生成一个文件,而区别则是文件存储原封不动把你的内容复制文件中;而SharedPreference存储要求使用键值对的方式去存储数据,并且系统会根据键值对的内容,生成格式化的xml文件,这种方式对于程序员来说,首先xml是一种规范的文本形式,可以很方便的读取和形成共享,所以我估计大部分开发都会选择后面这种方式。


一、文件存储:
只要记住一个方法,即openFileOutput(Filename,Mode),由Context提供,参数有两个,第一个参数是文件名,它不需要指定路径,因为Android默认会在指定路线下生成该文件;第二个参数其实是设置项,分为MODE_PRIVATE和MODE_APPEND,就是判断当程序执行时发现该名称的文件已经存在时,是直接覆盖该文件,还是在该文件内容基础上追加新的内容,最后openFileOutput方法返回一个字符输出流(FileOutputStream)。
代码实例:
UIActivity.xml:
package com.noodles.uipractice;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class UIActivity extends AppCompatActivity implements View.OnClickListener {

    /**
     * 1、把控件对象设置为成员变量,一般学习教程里面都是这样做的,
     * 我感觉从JAVA的语言的特性来说,这样做变量的生命周期更长,
     * 不会因为创建它的函数执行完毕后消失
     */
    private EditText editText;

    private Button btnSave;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ui);

        /**
         * 2、获取控件的对象的引用
         */
        editText = (EditText) findViewById(R.id.edit_text);
        btnSave = (Button) findViewById(R.id.btn_save);

        /**
         * 3、给按钮定义事件,点击后把editText中内容保存下来。
         */
        btnSave.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_save:
                String text = editText.getText().toString();
                if ("".equals(text)) {
                    Toast.makeText(this, "文本内容为空", Toast.LENGTH_SHORT).show();
                } else {
                    BufferedWriter bw = null;
                    try {
                        FileOutputStream fos = openFileOutput("data", MODE_PRIVATE);
                        bw = new BufferedWriter(new OutputStreamWriter(fos));
                        bw.write(text);
                    } catch (java.io.IOException e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            if(bw != null) {
                                bw.close();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                    }
                }
                break;
            default:break;
        }
    }
}
activity_ui.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn_save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Save" />

</LinearLayout>
保存页面:
[img]http://img.blog.csdn.net/20160403162908656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
文件路径:
[img]http://img.blog.csdn.net/20160403162934391?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

文件内容:
[img]http://img.blog.csdn.net/20160403162955610?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

二、SharedPreference存储。
1、获取SharedPreference对象,三种方式:
  • Context的getSharedPreference(),接收两个参数,第一个就是文件名,第二个模式有MODE_PRIVATE和MODE_MULTI_PROCESS,第1个参数表示只有本程序可以对该文件进行读写,第2个参数表示多个程序可以对该文件进行读写。
  • Activity的getPreference(),它接收一个操作模式参数,会以当前活动的类名为文件名,在活动中应该是两个方法都可以用,区别就是你需不需要自定义文件名。第三个方法同理,因为静态方法,通过类名调用,在任何类中都可以调用,所以只是文件名的区别吧。
  • 通过PreferenceManager类中getDefaultSharedPreference()方法,这是静态方法,自动使用应用程序的包名作为文件名。

吐槽:为什么通过方法调用的方式返回一个对象,而不是new去创建,这大概是因为所谓的设计模式的原因,但对于这些设计模式的好处,我现在没办法去了解,导致我只能记住它是这样用,这反而增加一个菜鸟学习的困扰。
2、调用SharedPreference对象的edit()方法返回一个SharedPreference.Editor对象,它应该是SharedPreference的内部类。
3、调用SharedPreference.Editor的putXXX方法,该方法接收两个参数以键值对的方式,存储不同类型的数据,XXX指具体数据类型。
4、最后调用commit方法提交内容。
package com.noodles.uipractice;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class UIActivity extends AppCompatActivity implements View.OnClickListener {


    private EditText editText;

    private Button btnSave,btnRead;

    private TextView textView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ui);

        /**
         * 2、获取控件的对象的引用
         */
        editText = (EditText) findViewById(R.id.edit_text);
        textView = (TextView) findViewById(R.id.text_view);
        btnSave = (Button) findViewById(R.id.btn_save);
        btnRead = (Button) findViewById(R.id.btn_read);

        /**
         * 3、给按钮定义事件,点击后把editText中内容保存下来。
         */
        btnSave.setOnClickListener(this);
        btnRead.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        SharedPreferences sharedPreferences = getSharedPreferences("data", MODE_PRIVATE);
        switch (v.getId()) {
            case R.id.btn_save:
                String text = editText.getText().toString();
                if ("".equals(text)) {
                    Toast.makeText(this, "文本内容为空", Toast.LENGTH_SHORT).show();
                } else {
                    //获取SharedPreference对象,调用Context的getSharedPreference方法
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putString("EditView",text);
                    editor.commit();
                }
                break;
            case R.id.btn_read:
                //通过获取的SharedPreference对象的getXXX方法获取文件中的值。
                String getText = sharedPreferences.getString("EditView", "");
                textView.setText(getText);
                break;
            default:break;
        }
    }
}

保存页面:
[img]http://img.blog.csdn.net/20160403174347091?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

路径:
[img]http://img.blog.csdn.net/20160403174432076?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

内容:
[img]http://img.blog.csdn.net/20160403174448092?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

......显示全文...
    点击查看全文


上一篇文章      下一篇文章      查看所有文章
2016-04-03 20:41:06  
移动开发 最新文章
深入了解android中的消息机制Handler
Android
Libgdx之BitmapFont字体
AndroidApp发布到应用市场的流程
Android开发找工作之前先看看这些知识点吧
View的事件分发机制解析
简单介绍了解白鹭引擎Egret
Cocos2d
android获取本地图片(二)
动画特效七:碰撞动画
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2018年1日历
2018-1-17 9:24:42
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  软件世界网 --