android数据保存

永久保存数据的方法:
1.Shared Preferences 以键值对的形式存储基本数据类型( booleans, floats, ints, longs, and strings),存储的数据在限制在一个application(一个package)内部使用
 
2.Internal Storage 将私有文件存储到内部存储器中。这些文件是一个application私有的,其他application无法访问到
3.External Storage 将公共数据存储到外部存储器中

4.SQLite Databases
Store structured data in a private database.
5.Network Connection
Store data on the web with your own network server.
Android
provides a way for you to expose even your private data to other
applications — with a content provider. A content provider is an
optional component that exposes read/write access to your application
data, subject to whatever restrictions you want to impose

Using Shared Preferences
获取一个 SharedPreferences对象,两种方法:

getSharedPreferences() - 有多个 preferences files 时使用该方法。该方法的第一个参数指定想要操作的preferences file 的名字
getPreferences()
- 只有一个preferences file时使用该方法。Because this will be the only preferences
file for your Activity, you don‘t supply a name.
获取对象之后,就可以调用对象的方法读取preferences file中的数据和写入数据到preferences file

读取: 使用 SharedPreferences 的 getBoolean() 和getString()方法

写入:

调用 edit() 方法获取 SharedPreferences.Editor对象.
使用 putBoolean() and putString()写入值.
Commit the new values with commit() :使用该方法提交新写入的值
看下面的示例:

public class Calc extends Activity {
    public static final String PREFS_NAME = "MyPrefsFile";    

    @Override
    protected void onCreate(Bundle state){
       super.onCreate(state);
       . . .    

       // Restore preferences
       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
       boolean silent = settings.getBoolean("silentMode", false);
       setSilent(silent);
    }    

    @Override
    protected void onStop(){
       super.onStop();    

      // We need an Editor object to make preference changes.
      // All objects are from android.context.Context
      SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
      SharedPreferences.Editor editor = settings.edit();
      editor.putBoolean("silentMode", mSilentMode);    

      // Commit the edits!
      editor.commit();
    }
}
public class Calc extends Activity {
    public static final String PREFS_NAME = "MyPrefsFile"; 

    @Override
    protected void onCreate(Bundle state){
       super.onCreate(state);
       . . . 

       // Restore preferences
       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
       boolean silent = settings.getBoolean("silentMode", false);
       setSilent(silent);
    } 

    @Override
    protected void onStop(){
       super.onStop(); 

      // We need an Editor object to make preference changes.
      // All objects are from android.context.Context
      SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
      SharedPreferences.Editor editor = settings.edit();
      editor.putBoolean("silentMode", mSilentMode); 

      // Commit the edits!
      editor.commit();
    }
}

Using the Internal Storage
私有文件的存储。用户卸载application后该种数据会被移除

将私有文件写入到内存中:

调用 openFileOutput() 方法获取文件的输出流。在方法的参数中指定文件名和操作模式
使用 write()方法写入
关闭流: close().
示例:

view plaincopy to clipboardprint?
String FILENAME = "hello_file";
String string = "hello world!";    

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
String FILENAME = "hello_file";
String string = "hello world!"; 

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();

可用模式有:MODE_PRIVATE, MODE_APPEND, MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE.

从内存中读取文件到程序中:

调用openFileInput() 方法获取输入流。方法参数指定文件名
使用read()方法读取.
关闭流: close().
在编译期读取只读的静态文件:

要把文件放在 res/raw/目录下, 使用openRawResource(R.raw.<filename>)方法打开文件,该方法返回一个输入流,使用这个流就可以读取文件内容了

Saving cache files

如果只想暂时性的保存数据而不是长久保存

使用 getCacheDir() 方法打开一个 File (application存放临时缓存数据的路径)

当设备内存不足时,系统可能会自动删除这类数据以释放内存空间。但是你不能依靠这个可能性,你要保证cache文件不能占用过多的内存空间。当application被卸载,这部分数据被移除

Other useful methods
getFilesDir()
Gets the absolute path to the filesystem directory where your internal files are saved.
获得基于存储 internal files 目录的完整路径(不同的文件系统获得路径会不同)
getDir()
Creates (or opens an existing) directory within your internal storage space.
在内存中创建一个目录
deleteFile()
Deletes a file saved on the internal storage.
删除内存中的一个文件
fileList()
Returns an array of files currently saved by your application.
获得一个application存储的所有文件,并存储在数组中
Using the External Storage
外部存储。这些文件可以在设备之间随意的读写,只要设备的系统与android兼容。容易丢失,所以操作的时候要格外小心

用于存储的storage有:可移动的media storage(如SD卡)和不可移动的storage
 
Checking media availability
检查media是否可用

media在使用之前要先检查是否可用,调用 getExternalStorageState()方法获取media的状态。用法如下:

view plaincopy to clipboardprint?
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();    

if (Environment.MEDIA_MOUNTED.equals(state)) {
    // We can read and write the media
    mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    // We can only read the media
    mExternalStorageAvailable = true;
    mExternalStorageWriteable = false;
} else {
    // Something else is wrong. It may be one of many other states, but all we need
    //  to know is we can neither read nor write
    mExternalStorageAvailable = mExternalStorageWriteable = false;
}
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState(); 

if (Environment.MEDIA_MOUNTED.equals(state)) {
    // We can read and write the media
    mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    // We can only read the media
    mExternalStorageAvailable = true;
    mExternalStorageWriteable = false;
} else {
    // Something else is wrong. It may be one of many other states, but all we need
    //  to know is we can neither read nor write
    mExternalStorageAvailable = mExternalStorageWriteable = false;
}

一般常见的状态有:可读写、只读和不可用

getExternalStorageState()还会返回其他更多的状态,比如media有没有共享、安装是否正常、卸载时是否出错等等,以此来通知用户设备的状态

Accessing files on external storage
当你使用Level8或更高的API时, 使用getExternalFilesDir() 打开一个 File (表示external storage中本次数据存储的目录)。

不传递参数时表示external storage的根目录。有参数则对应着指定的目录类型,例如 DIRECTORY_MUSIC and
DIRECTORY_RINGTONES,分别代表音乐目录和铃声目录。如果指定的目录不存在,就会创建该目录。通过指定目录类型可以让android
多媒体扫描器给你的文件分类。如果你的application被用户卸载,这种方式存储的目录和内容会被移除

如果使用Level7或更低版本的API,使用 getExternalStorageDirectory(), 打开 File所代表的external storage的根目录。

还需要把数据写在下面的目录中:/Android/data/<package_name>/files/用户使用Level8或更高
版本的API卸载这个版本的应用时,上面的目录和目录中的内容会被移除Saving files that should be shared

果想保存与应用无关的文件,也就是说application卸载后保存的文件仍然保留,就要把文件保存在 external
storage的公共目录中,这些目录位于 external storage的根目录,比如 Music/, Pictures/,
Ringtones/等

当你使用Level8或更高的API时,使用 getExternalStoragePublicDirectory()方法,传递参数
DIRECTORY_MUSIC, DIRECTORY_PICTURES,
DIRECTORY_RINGTONES,就可以把文件保存在指定目录。目录不存在则创建

如果使用Level7或更低版本的API, 使用 getExternalStorageDirectory() 方法打开 File 所代表的 external storage的根目录, 把共享文件存储到下面的目录中一个即可:

Music/ - Media scanner classifies all media found here as user music.
Podcasts/ - Media scanner classifies all media found here as a podcast.
Ringtones/ - Media scanner classifies all media found here as a ringtone.
Alarms/ - Media scanner classifies all media found here as an alarm sound.
Notifications/ - Media scanner classifies all media found here as a notification sound.
Pictures/ - All photos (excluding those taken with the camera).
Movies/ - All movies (excluding those taken with the camcorder).
Download/ - Miscellaneous downloads.
Saving cache files
如同上面提到的,根据不同的API版本使用不同的方法:

高版本API: 使用getExternalCacheDir()

低版本API: getExternalStorageDirectory()打开根目录,cache data 写到/Android/data/<package_name>/cache/目录中

Using Databases
android完全支持SQLite数据库

经典的创建SQLite数据库的方法是:构造SQLiteOpenHelper 的子类并覆盖onCreate()方法,就可以在方法中使用SQLite命令:

public class MyDbOpenHelper extends SQLiteOpenHelper {    

    private static final int DATABASE_VERSION = 2;
    private static final String DICTIONARY_TABLE_NAME = "dictionary";
    private static final String DICTIONARY_TABLE_CREATE =
                "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
                KEY_WORD + " TEXT, " +
                KEY_DEFINITION + " TEXT);";    

    DictionaryOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }    

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DICTIONARY_TABLE_CREATE);
    }
}
public class MyDbOpenHelper extends SQLiteOpenHelper { 

    private static final int DATABASE_VERSION = 2;
    private static final String DICTIONARY_TABLE_NAME = "dictionary";
    private static final String DICTIONARY_TABLE_CREATE =
                "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
                KEY_WORD + " TEXT, " +
                KEY_DEFINITION + " TEXT);"; 

    DictionaryOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    } 

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DICTIONARY_TABLE_CREATE);
    }
}

Android中使用SQLite 数据库的例子参见 Note Pad 和Searchable Dictionary 。

Android中SQLite 数据库的调试工具:sqlite3

Using a Network Connection
You can use the network (when it‘s
available) to store and retrieve data on your own web-based services. To
do network operations, use classes in the following packages:

java.net.*
android.net.*

时间: 2024-11-09 05:17:49

android数据保存的相关文章

Android 数据保存

Android数据保存方法 android数据保存主要保存以下三种: 1.共享参数文件中保存简单的键值对数据: 2.保存任意的文件数据到Android的文件系统中: 3.使用SQLite数据库管理 保存键值集 通过使用SharePreferences API来保存简单的键值对数据. 共享参数文件的获取或创建: 可以通过以下两种方法来获取: getSharedPreferences()  该方法需要提供一个共享参数文件的名称标识,该方法可以在任意Context中调用 getPreferences(

Android数据保存之文件保存

前言: 上一篇文章写了在Android中利用SharedPreferences保存数据,SharedPreferences在保存数据的时候主要是保存一些应用程序的设置信息或者少量的用户信息,而且是以key-value形式保存的String类的信息,比較有局限性. 比方你须要保存从网络获取的图片到本地作为缓存数据,而且数量比較大.SharedPreferences就不能满足你的需求了,这个时候就要用到基本上全部平台都会用到的文件保存. Android中以文件形式把数据保存到磁盘上与其它平台基本上都

Android数据保存之SharedPreference

SharedPreference非常适合用来保存零散的简单的数据,如用户名和密码等 package com.test.storage; import android.app.Activity; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.view.View; import and

Android数据保存的3种方式 SharedPreferences存储、文件存储、数据库存储SQLite 未完

1.文件存储 文件存储数据使用了Java中的IO操作来进行文件的保存和读取,只不过Android在Context类中封装好了输入流和输出流的获取方法. 创建的存储文件保存在/data/data/<package name>/files文件夹下.

android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法

android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法 09. 四 / android基础 / 没有评论 SharedPreferences保存数据到xml文件 有时候要保存activity的某些状态数据,就可以保存到SharedPreferences 很简单的保存和获取方法.但很实用. itcast是xml的文件名

【转】android笔记--保存和恢复activity的状态数据

一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留. 但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个activity重新回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发者可以覆写onSaveIn

Android native CursorWindow数据保存原理

我们通过Uri查询数据库所得到的数据集,保存在native层的CursorWindow中.CursorWindow的实质是共享内存的抽象,以实现跨进程数据共享.共享内存所采用的实现方式是文件映射. 在ContentProvider端透过SQLiteDatabase的封装查询到的数据集保存在CursorWindow所指向的共享内存中,然后通过Binder把这片共享内存传递到ContentResolver端,即查询端.这样客户就可以通过Cursor来访问这块共享内存中的数据集了. 那么CursorW

Android——数据存储(四种方式之一)SharedPrefereces

Android--数据存储(四种方式) 1.SharedPrefereces   轻量级.XML  存储文件名,数据保存在data/data/basepackage/shared_prefs/myopt.xml中   实例-收藏-记住密码自动登录 //一种轻量级的数据存储方式//通过KEY 存入数据--putxxxx(key,value) 取出数据--getxxxx(key  default)   2.读写SD卡  SD的根目录  适用于数据流读写 3.SQLite  轻量级.dp文件多用于手机

[Android]数据篇 --- SharedPreferences

转载请标注:转载于http://www.cnblogs.com/Liuyt-61/p/6637515.html --------------------------------------------------------------- Android数据的四种存储方式: 1.SharedPreferences 2.SQLite 3.Content Provider 4.File ----------------------分割线--------------------------------