数据存储和访问

Posted 金洪光

tags:

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

1.SharedPreferences:

通过SharedPreferences可以将NVP(Name/Value Pair,名称/值对)保存在android的文件系统中, 还能够实现不同应用程序间的数据共享.

 

支持三种访问mode

私有(MODE_PRIVATE):仅有创建程序有权限对其进行读取或写入

全局读(MODE_WORLD_READABLE):不仅创建程序可以对其进行读取或写入,其他应用程序也读取操作的权限,但没有写入操作的权限

全局写(MODE_WORLD_WRITEABLE):创建程序和其他程序都可以对其进行写入操作,但没有读取的权限。

 *有的时候需要将SharedPreferences的访问模式设定为即可以全局读,也可以全局写,这样就需要将两种模式写成下面的方式

Public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE; //可读可写

 

SharedPreferences文件位置:

保存在/data/data/<package name>/shared_prefs目录下

-rw-rw-rw”表示SaveSetting.xml可以被创建者、同组用户和其他用户进行读取和写入操作,但不可执行。

-rw-rw ---”,表示仅有创建者和同组用户具有读写文件的权限。

 

打开SharedPreferences文件:

SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE); 

写入/编辑SharedPreferences文件:

SharedPreferences.Editor editor = sharedPreferences.edit(); 
editor.putString("Name", "Tom"); 
editor.putInt("Age", 20); 
editor.putFloat("Height", ); 
editor.commit();

读取 SharedPreferences文件:

SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE); 
String name = sharedPreferences.getString("Name","Default Name"); 
int age = sharedPreferences.getInt("Age", 20); 
float height = sharedPreferences.getFloat("Height",); 

 

下面是简单的例子:

package com.example.demo_simplepreference;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.EditText;

public class MainActivity extends Activity {

    private EditText nameText;
    private EditText ageText;
    private EditText heightText;
    public static final String PREFERENCE_NAME = "SaveSetting";
    public static int MODE = Context.MODE_WORLD_READABLE
            + Context.MODE_WORLD_WRITEABLE;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        nameText = (EditText) findViewById(R.id.name);
        ageText = (EditText) findViewById(R.id.age);
        heightText = (EditText) findViewById(R.id.height);
    }

    @Override
    public void onStart() {
        super.onStart();
        loadSharedPreferences();
    }

    @Override
    public void onStop() {
        super.onStop();
        saveSharedPreferences();
    }

    private void loadSharedPreferences() {
        SharedPreferences sharedPreferences = getSharedPreferences(
                PREFERENCE_NAME, MODE);
        String name = sharedPreferences.getString("Name", "Tom");
        int age = sharedPreferences.getInt("Age", 20);
        float height = sharedPreferences.getFloat("Height", (float) 180.5);

        nameText.setText(name);
        ageText.setText(String.valueOf(age));
        heightText.setText(String.valueOf(height));
    }

    private void saveSharedPreferences() {
        SharedPreferences sharedPreferences = getSharedPreferences(
                PREFERENCE_NAME, MODE);
        SharedPreferences.Editor editor = sharedPreferences.edit();

        editor.putString("Name", nameText.getText().toString());
        editor.putInt("Age", Integer.parseInt(ageText.getText().toString()));
        editor.putFloat("Height",
                Float.parseFloat(heightText.getText().toString()));
        editor.commit();
    }

}

运行结果:

 

2.File存储:

访问mode

文件保存在:

/data/data/工程(edu.hrbeu.InternalFileDemo)/files/目录下

写入:

String FILE_NAME = "fileDemo.txt"; 
FileOutputStream fos = openFileOutput(FILE_NAME,Context.MODE_PRIVATE) 
String text = “Some data”; 
fos.write(text.getBytes()); 
fos.flush(); 
fos.close(); 

在调用close()函数关闭文件前,务必要调用flush()函数,将缓冲区内所有的数据写入文件。

 

读取:

public FileInputStream openFileInput (String name) 
String FILE_NAME = "fileDemo.txt"; 
FileInputStream fis = openFileInput(FILE_NAME); 
byte[] readBytes = new byte[fis.available()]; 
while(fis.read(readBytes) != -1){ 
} 

 

下面是简单的例子:

package com.example.demo_internalfiledemo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {
    private TextView labelView;
    private EditText entryText;
    private Button readButton;
    private Button writeButton;
    private CheckBox appendBox;
    private EditText displayView;
    private final static String FILE_NAME = "test.txt";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        labelView = (TextView) findViewById(R.id.labelView);
        appendBox = (CheckBox) findViewById(R.id.appendBox);
        entryText = (EditText) findViewById(R.id.entryText);
        readButton = (Button) findViewById(R.id.readButton);
        writeButton = (Button) findViewById(R.id.writeButton);
        displayView = (EditText) findViewById(R.id.displayView);

        readButton.setOnClickListener(readButtonListener);
        writeButton.setOnClickListener(writeButtonListener);
    }

    OnClickListener writeButtonListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            FileOutputStream fos = null;
            try {
                if (appendBox.isChecked()) {
                    fos = openFileOutput(FILE_NAME, Context.MODE_APPEND);
                } else {
                    fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);
                }
                String text = entryText.getText().toString();
                fos.write(text.getBytes());
                labelView.setText("文件写入成功,写入长度:" + text.length());
                entryText.setText("");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (fos != null) {
                    try {
                        fos.flush();
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    };
    OnClickListener readButtonListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            displayView.setText("");
            FileInputStream fis = null;
            try {
                fis = openFileInput(FILE_NAME);
                if (fis.available() == 0) {
                    return;
                }
                byte[] readBytes = new byte[fis.available()];
                while (fis.read(readBytes) != -1) {
                }
                String text = new String(readBytes);
                displayView.setText(text);
                labelView.setText("文件读取成功,文件长度:" + text.length());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };

}

运行结果

创建目录:

String path = getFilesDir().getAbsolutePath(); //data/data/project package/files/
String path = Environment.getExternalStorageDirectory().getAbsolutePath(); //mnt/sdcard/
File file = new File(path + "/etc2/nihao/wo/jiao/jin");
if (!file.exists()) {
    file.mkdirs();
}

创建文件

File newFile = new File(path + "/etc2/nihao/wo/jiao/jin/test.txt");
newFile.createNewFile();

写入:

 FileOutputStream out = new FileOutputStream(file2);
 writer = new BufferedWriter(new OutputStreamWriter(out)) ; 
 writer.write("123123") ;
 writer.close() ;

读取:

FileInputStream out = new FileInputStream (file2);
reader = new BufferedReader(new InputStreamReader(out)) ; 
String input = null; 
//每读一行进行一次写入动作  
while(!(input = bufReader.readLine()).equals("quit"))  
{  
     //Do something..
}  
bufReader.close(); 

 

资源文件访问:

通过stream可以访问任何res文件夹中的文件。

Resources resources = this.getResources();
InputStream inputStream = inputStream = resources.openRawResource(R.raw.raw_file); 

也可以通过XmlPullParser访问xml文件夹中的xml文件

XmlPullParser parser = resources.getXml(R.xml.person);
        String msg = "";
        try {
            while (parser.next() != XmlPullParser.END_DOCUMENT) {
                String people = parser.getName();
                String name = null;
                String age = null;
                String height = null;
                if ((people != null) && people.equals("person")) {
                    int count = parser.getAttributeCount();
                    for (int i = 0; i < count; i++) {
                        String attrName = parser.getAttributeName(i);
                        String attrValue = parser.getAttributeValue(i);
                        if ((attrName != null) && attrName.equals("name")) {
                            name = attrValue;
                        } else if ((attrName != null) && attrName.equals("age")) {
                            age = attrValue;
                        } else if ((attrName != null)
                                && attrName.equals("height")) {
                            height = attrValue;
                        }
                    }
                    if ((name != null) && (age != null) && (height != null)) {
                        msg += "姓名:" + name + ",年龄:" + age + ",身高:" + height
                                + "\\n";
                    }
                }
            }
        } catch (Exception e) {
            Log.e("ResourceFileDemo", e.getMessage(), e);
        }

XmlPullParser的XML事件类型

XMLPull相关参考:http://blog.csdn.net/andyhuabing/article/details/8036340



 

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

从片段访问数据库以在列表中显示

如何在片段中访问 SQLite 数据到 ListView

sql 这些代码片段将演示如何逐步使用PolyBase。你应该有一个blob存储和存储秘密方便

如何将 r ggplot 图存储为 html 代码片段

如何管理在每个 git 版本中添加私有代码片段?

在片段着色器中使用 textureCube 访问环境贴图失败