Android 数据保存

Android数据保存方法

android数据保存主要保存以下三种:

1、共享参数文件中保存简单的键值对数据;

2、保存任意的文件数据到Android的文件系统中;

3、使用SQLite数据库管理

保存键值集

通过使用SharePreferences API来保存简单的键值对数据。

共享参数文件的获取或创建:

可以通过以下两种方法来获取:

getSharedPreferences()  该方法需要提供一个共享参数文件的名称标识,该方法可以在任意Context中调用

getPreferences()  使用该方法主要是为一个activity的私有数据存储使用,该方法不提供文件的名称。

eg:

[java] view plaincopy

  1. Context context = getActivity();
  2. SharedPreferences sharedPref = context.getSharedPreferences(getString(R.string.preference_file_key),Context.MODE_PRIVATE);

在该示例中,通过一个资源文件值:R.string.preference_file_key来指定了共享数据文件的名称。

如果要在一个Activity中使用唯一的一个共享数据文件,则可以使用下面的方法:

[java] view plaincopy

  1. SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);

注意:

在创建一个共享参数文件时,使用了 MODE_WORLD_READABLE 或者MODE_WORLD_WRITEABLE,则如果其他APP知道了该文件的名字标识,也可以访问该共享文件。

向共享参数文件中写入数据

通过调用SharedPreferecnes的edit()方法创建一个SharedPreferebces.Editor。 通过其putInt()、putString()等方法来写入相应的键值数据,并通过调用commit()来保存数据。

eg:

[java] view plaincopy

  1. SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
  2. SharedPreferences.Editor eidtor = sharedPref.edit();
  3. editor.putInt(getString(R.string.save_high_score),newHighScore);
  4. editor.commit();

从共享参数文件中读取数据

通过调用getInt()、getString()方法来从共享参数文件中获取对应的值,并且可以提供一个默认的值,如果在共享参数文件中不存在该键值时,就使用默认值。

eg.

[java] view plaincopy

  1. SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
  2. int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
  3. long highScore = sharedPref.getInt(getString(R.sting.saved_high_score),defaultValue);

将数据保存于文件中

android 设备都包括两个存储区域,内部和外部存储。

内部存储为默认的存储设备,如果希望数据为app私有(不被用户和其他app程序访问),则应将数据保存到内部存储设备上。

如果对存储数据没有访问限制,并且希望和其他APP或者用户访问,外部存储设备为最佳存储。

获取外部存储设备的访问许可

为了将数据保存到外部存储设备,必须在mainifest文件中请求WRITE_EXTERNAL_STORAGE权限:

[html] view plaincopy

  1. <mainifets ...>
  2. <uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE”/>
  3. </manifest>

指定对外部存储的只读许可:

[html] view plaincopy

  1. <manifest ...>
  2. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  3. ...
  4. </manifest>

如果你的app使用WRITE_EXTERNAL_STORAGE许可,则同时也具有读外部存储的许可。

对于内部存储,我们不需要任何保存文件的许可,因为我们的应用程序总是具有内部存储的read和write文件的许可。

将文件保存到内部存储器

可以通过以下两种方法获取文件或者文件目录:

getFilesDir()  返回一个内部存储器上的文件夹

getCacheDir() 返回一个给当前app的内部存储器上的临时缓存文件,当在不需要使用该文件时,必须删除该文件,并且应指定一个合适的内存大小限制,比如1MB,如果系统开始运行缓慢,则会无警告的删除这些缓存文件。

可以通过上面的方法获取的文件夹在内部存储器上创建一个新的文件:

[java] view plaincopy

  1. File file = new File(context.getFilesDir(),filename);

通过调用方法openFileOutput()去获取FileOutPutStream对象:

eg.

[java] view plaincopy

  1. String filename = "myfile";
  2. String string = "Hello world!";
  3. FileOutPutStream outputStream;
  4. try{
  5. outputStream = openFileOutput(filename,Context.MODE_PRIVATE);
  6. outputStream.write(string.getBytes());
  7. outputStream.close();
  8. }catch(Exception e){
  9. e.printStackTrace();
  10. }

如果需要缓存一些文件,则调用createTempFile(),例如,下面的方法,从一个URL地址中提取文件名,并且用其在内部存储器缓存文件夹上创建一个文件。

[java] view plaincopy

  1. public File getTempFile(Context context,String url){
  2. File file;
  3. try{
  4. String filename = Uril.parse(url).getLastPathSegment();
  5. file = File.createTempFile(filename,null,context.getCacheDir());
  6. }catch(IOException e){
  7. //
  8. }
  9. return file;
  10. }

Note:

你的app的内部存储文件夹由你的app包名来指定,并存储在android文件系统的一个特殊位置。严格意义上讲,如果你设置了文件的mode为可读的(readable),其他app也可以读取你的内部文件。然而,其他app也需要知道你的app的包名和文件名。其他app不能浏览你的内部文件夹,并且不能read和write.除非你明确的设定了文件为readable或者writable,

将文件保存到外部存储器

在将文件写到外部存储器上之前,必须先检查外部存储器是否可用。通过调用方法getExternalStorageState()方法来查询外部存储器的状态,如果返回的状态为MEDIAZ_MOUNTED,则此时你可以在外部存储器上读写文件。

eg.

[java] view plaincopy

  1. //该方法判断外部存储器是否挂载上(是否可读写)。
  2. public boolean isExternalStorageWritable(){
  3. String state = Environment.getExternalStorageState();
  4. if(Environment.MEDIA_MOUNTED.equals(state)){
  5. returen true;
  6. }
  7. return false;
  8. }

[java] view plaincopy

  1. //检查外部存储器是否至少为可读的
  2. public boolean isExternalStorageReadable(){
  3. String state = Environment.getExternalStorageState();
  4. if(Environment.MEDIA_MOUNTED.equals(state) ||
  5. Environment.MEIDA_MOUNTED_READ_ONLY.equals(state)){
  6. returen true;
  7. }
  8. return false;
  9. }

虽然外部存储是用户或者其他app是可修改的,有两种文件你需要保存到这里:

共享文件

这种文件可以自由的被其他app和用户访问,当用户卸载掉app时,这些文件依然可以被用户访问。比如你的app的截图,或者其他下载文件。

私有文件

这些文件属于你的app,且这些文件在你卸载掉该app时也会被删除掉。虽然这些文件可以被用户和其他app访问,因为这些数据存储在外部存储器上的,实际上这些文件在自身的app以外不提供数据。比如通过你的app下载的额外的资源或者临时多媒体文件。

如果想保存一个公共文件到外部存储器,则使用方法:getExternalStoragePublicDirectory()来获取一个文件。该方法具有一个特定的参数来标识你想保存的文件类型。比如DIRECTORY_MUSI 或者 DIRECTORY_PICTURES.

eg.

[java] view plaincopy

  1. //该方法获取用户的公共图片文件夹文件
  2. public File getAlbumStorageDir(String albumName){
  3. File file = new File(Environment.getExternalStoragePublicDirectory(Evironment.DIRECTORY_PICTURES),albumName);
  4. if(!file.mkdirs()){
  5. Log.e(LOG_TAG,"Directory not created");
  6. }
  7. return file;
  8. }

如果要保存一个app的私有文件,可以通过调用方法getExternalFilesDir()

eg.下面的方法可以用来创建一个个人照片相册:

[java] view plaincopy

  1. public File getAlbumStorageDir(Context context,String albumName){
  2. //Get the directory for the app‘s private pictures directory.
  3. File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES),albumName);
  4. if(!file.mkdirs()){
  5. Log.e(LOG_TAG,"Directory not created");
  6. }
  7. return file;
  8. }

记住getExternalFileDir()为在一个文件夹中创建一个文件夹且会在用户卸载掉当前app时删除掉创建的文件夹。如果想要在卸载时保存这些文件,则应该用方法:getExternalStoragePublicDirectory()方法代替。

查询剩余空间

调用方法getFreeSpace() 和getTaotalSpace().这两个方法分别查询当前存储盘的可用空间和总容量。

我们没必要在写文件之前去检查存储盘的可用空间,我们可以通过对catch IOException 进行分析。

文件的删除

如果要删除一个文件,这可以直接调用delete()方法来删除。 eg.  myFile.delete();

如果要删除的文件为内部存储器上的文件,则也可以调用Context的deleteFile()方法去删除该文件

eg:

[java] view plaincopy

  1. myContext.deleteFile(fileName);

Note:

当用户在卸载app时,android系统会删除以下文件:

通过app保存到内部存储的所有文件;

通过getExternalFilesDir()方法保存到外部存储器的所有文件。

然而,你需要手动的删除所有通过getCacheDir()方法创建的文件。

将数据保存到SQL数据库中

定义数据库表结构

这里通过JAVA类定义了一个数据表的结构

[java] view plaincopy

  1. public final class FeedReaderContract {
  2. public FeedReaderContract() {}
  3. //内部类定义表结构
  4. public static abstract class FeedEntry implements BaseColumns {
  5. public static final String TABLE_NAME = "entry";
  6. public static final String COLUMN_NAME_ENTRY_ID = "entryid";
  7. public static final String COLUMN_NAME_TITLE = "title";
  8. public static final String COLUMN_NAME_SUBTITLE = "subtitle";
  9. ...
  10. }
  11. }
使用SQL Helper 来创建一个数据库:

[java] view plaincopy

  1. private static final String TEXT_TYPE = " TEXT";
  2. private static final String COMMA_SEP = ",";
  3. private static final String SQL_CREATE_ENTRIES =
  4. "CREATE TABLE " + FeedEntry.TABLE_NAME + " (" +
  5. FeedEntry._ID + " INTEGER PRIMARY KEY," +
  6. FeedEntry.COLUMN_NAME_ENTRY_ID + TEXT_TYPE + COMMA_SEP +
  7. FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
  8. ... // Any other options for the CREATE command
  9. " )";
  10. private static final String SQL_DELETE_ENTRIES =
  11. "DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME;
android将数据保存到程序的私有磁盘空间中,通常这里保存的数据不能被其他应用程序访问
要使用SQLiteOpenHelper类,需要实现其子类,该子类覆盖了onCreate(),onUpgrade(),onOpen()方法,你也可以。

[java] view plaincopy

  1. public class FeedReaderDbHelper extends SQLiteOpenHelper {
  2. // If you change the database schema, you must increment the database version.
  3. public static final int DATABASE_VERSION = 1;
  4. public static final String DATABASE_NAME = "FeedReader.db";
  5. public FeedReaderDbHelper(Context context) {
  6. super(context, DATABASE_NAME, null, DATABASE_VERSION);
  7. }
  8. public void onCreate(SQLiteDatabase db) {
  9. db.execSQL(SQL_CREATE_ENTRIES);
  10. }
  11. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  12. // This database is only a cache for online data, so its upgrade policy is
  13. // to simply to discard the data and start over
  14. db.execSQL(SQL_DELETE_ENTRIES);
  15. onCreate(db);
  16. }
  17. public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  18. onUpgrade(db, oldVersion, newVersion);
  19. }
  20. }
使用我们自定已的SQLiteOpenHelper类

[java] view plaincopy

  1. FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper(getContext());

向数据库中插入数据

通过使用ContentValues的instert()方法将数据插入到数据库中

[java] view plaincopy

  1. SQLiteDatabase db = mDbHelper.getWritableDatabase();
  2. ContentValues values = new ContentValues();
  3. values.put(FeedEntry.COLUMN_NAME_ENTRY_ID,id)
  4. values.put(FeedEntry.COLUMN_NAME_TITLE,title);
  5. values.put(FeedEntry.COLUMN_NAME_CONTENT,content);
  6. long newRowId;
  7. newRowId = db.insert(FeedEntry.TABLE_NAME,
  8. FeedEntry.COLUMN_NAME_NULLABLE,
  9. values);

从数据库中读取数据

要从数据库中读取数据,使用query方法

[java] view plaincopy

  1. SQLiteDatabase db = mDbHelper.getReadableDatabase();
  2. // Define a projection that specifies which columns from the database
  3. // you will actually use after this query.
  4. String[] projection = {
  5. FeedEntry._ID,
  6. FeedEntry.COLUMN_NAME_TITLE,
  7. FeedEntry.COLUMN_NAME_UPDATED,
  8. ...
  9. };
  10. // How you want the results sorted in the resulting Cursor
  11. String sortOrder = FeedEntry.COLUMN_NAME_UPDATED + " DESC";
  12. Cursor c = db.query(
  13. FeedEntry.TABLE_NAME,  // The table to query
  14. projection,            // The columns to return
  15. selection,             // The columns for the WHERE clause
  16. selectionArgs,         // The values for the WHERE clause
  17. null,                  // don‘t group the rows
  18. null,                  // don‘t filter by row groups
  19. sortOrder              // The sort order
  20. );
  21. <h2><a name="t14"></a>读取Cursor中的数据</h2>cursor.moveToFirst();
  22. long itemId = cursor.getLong(
  23. cursor.getColumnIndexOrThrow(FeedEntry._ID)
  24. );

删除数据库中的数据

[java] view plaincopy

  1. String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";
  2. String[] selectionArgs = { String.valueOf(rowId) };
  3. db.delete(table_name, selection, selectionArgs);

更新数据库数据

[java] view plaincopy

  1. SQLiteDatabase db = mDbHelper.getReadableDatabase();
  2. ContentValues values = new ContentValues();
  3. values.put(FeedEntry.COLUMN_NAME_TITLE, title);
  4. String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";
  5. String[] selectionArgs = { String.valueOf(rowId) };
  6. int count = db.update(
  7. FeedReaderDbHelper.FeedEntry.TABLE_NAME,
  8. values,
  9. selection,
  10. selectionArgs);
时间: 2024-09-30 13:04:00

Android 数据保存的相关文章

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数据保存

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

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 ----------------------分割线--------------------------------