软件世界网 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
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
生肖星座 三丰软件 视频 开发 Android开发 站长 古典小说 网文精选 搜图网 美图 中国文化英文版 多播 租车 短信
2017-7-25 20:37:45
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  软件世界网 --