不一樣的_咩咩

若是美好,叫做精彩。若是糟糕,叫做經歷;

导航

Android关于保存数据(Saving data)

1.SharedPreferences(key-value)

  SharedPreferences保存的数据主要是类似于配置信息格式的数据,因此保存的数据主要是简单类型的键值对(key-value),它保存的是一个XML文件。

  (1)创建sharedPreferences的两种方法:getSharedPreferences(String name, int mode)----如果你需要通过一个标识(name)来区分不同的sharedPreferences文件

                       getPreferences(int mode)            ----如果在一个activity中只需要使用一个sharedPreferences,不需要区分      

     mode:是指定读写方式,其值有三种,分别为:

              Context.MODE_PRIVATE:指定该SharedPreferences数据只能被本应用程序读、写

              Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他应用程序读,但不能写

              Context.MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序读写。

  (2)编辑sharedPreferences    

方法名称

描述

public abstract boolean contains (String key)                                        

判断SharedPreferences是否包含特定key的数据

public abstract SharedPreferences.Editor edit ()

   返回一个Edit对象用于操作SharedPreferences

public abstract Map<String, ?> getAll ()

获取SharedPreferences数据里全部的key-value对

getXXX(String key,XXX defvlaue)

获取SharedPreferences数据指定key所对应的value,如果该key不存在,返回默认值defValue。其中XXX可以是boolean、float、int、long、String等基本类型的值

  (3)写入数据和读取数据

方法名称 描述

public abstract SharedPreferences.Editor clear ()              

清空SharedPreferences里所有的数据

public abstract boolean commit ()

当Editor编辑完成后,调用该方法可以提交修改,而且必须要调用这个数据才修改

public abstract SharedPreferences.Editor putXXX (String key, typexxx XXX)

向SharedPreferences存入指定的key对应的数据,其中XXX可以是boolean、float、int、long、String等基本类型的值

public abstract SharedPreferences.Editor getXXX (String key, typexxx XXX)

取出向SharedPreferences存入指定的key对应的数据,其中XXX可以是boolean、float、int、long、String等基本类型的值

public abstract SharedPreferences.Editor remove (String key)

删除SharedPreferences里指定key对应的数据项

2.Saving files

  所有的Andr​​oid设备有两个文件存储区:“内部”和“外部”存储。外部存储主要是SD卡;

  内部存储区域:总是可用,并且之辈自己的应用程序访问;

  外部存储设备:不总是可用,被用户或者一些软件挂在后便不可使用,这是世界可读的,所以在这里保存的文件可能会之外的控制读取。外部存储是不需要访问限制文件和要与其他应用程序共享或允许用户用电脑访问文件的最佳场所;

  (1)设置你的应用获得外部存储的权限(读和写)

<manifest ...>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    ...
</manifest>
<manifest ...>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    ...
</manifest>

  将文件存储在内部存储区域不需要设置任何权限  

  (2)将文件保存在内部存储区域

    获得内部存储文件目录的两个方法:

    getFilesDir():返回表示你的应用程序内部的目录文件。

    getCacheDir():返回表示你的应用程序的临时缓存文件内部目录中的文件

  创建非缓存目录文件方法:

File file = new File(context.getFilesDir(), filename);
String filename = "myfile";
String string = "Hello world!";
FileOutputStream outputStream;

try {
  outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
  outputStream.write(string.getBytes());
  outputStream.close();
} catch (Exception e) {
  e.printStackTrace();
}

  创建缓存目录下文件方法:

public File getTempFile(Context context, String url) {
    File file;
    try {
        String fileName = Uri.parse(url).getLastPathSegment();
        file = File.createTempFile(fileName, null, context.getCacheDir());
    catch (IOException e) {
        // Error while creating file
    }
    return file;
}

  (3)将文件保存在外部存储区域

    由于外部存储设备可能出现不能获取的情况 例如没有或者被挂载,因此在使用之前必须要检测是否可用,使用方法getExternalStorageState() 如果得到的值等于 MEDIA_MOUNTED,则表示外部存储设备是可使用的;

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}

  删除你保存的文件:

myFile.delete(); or

myContext.deleteFile(fileName);
3.将数据保存在SQL数据表里面 
      SQL数据表主要用于重复性数据或者结构化的数据;所有会用到的api均来源于android源码中的这个包:android.database.sqlite

    (1)定义一个SQL数据表

    

public final class FeedReaderContract {
    // To prevent someone from accidentally instantiating the contract class,
    // give it an empty constructor.
    public FeedReaderContract() {}

    /* Inner class that defines the table contents */
    public static abstract class FeedEntry implements BaseColumns {
        public static final String TABLE_NAME = "entry";
        public static final String COLUMN_NAME_ENTRY_ID = "entryid";
        public static final String COLUMN_NAME_TITLE = "title";
        public static final String COLUMN_NAME_SUBTITLE = "subtitle";
        ...
    }
}

private static final String TEXT_TYPE = " TEXT";
private static final String COMMA_SEP = ",";
private static final String SQL_CREATE_ENTRIES =
    "CREATE TABLE " + FeedEntry.TABLE_NAME + " (" +
    FeedEntry._ID + " INTEGER PRIMARY KEY," +
    FeedEntry.COLUMN_NAME_ENTRY_ID + TEXT_TYPE + COMMA_SEP +
    FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
    ... // Any other options for the CREATE command
    " )";

private static final String SQL_DELETE_ENTRIES =
    "DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME;


public class FeedReaderDbHelper extends SQLiteOpenHelper {
    // If you change the database schema, you must increment the database version.
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "FeedReader.db";

    public FeedReaderDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE_ENTRIES);
    }
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // This database is only a cache for online data, so its upgrade policy is
        // to simply to discard the data and start over
        db.execSQL(SQL_DELETE_ENTRIES);
        onCreate(db);
    }
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onUpgrade(db, oldVersion, newVersion);
    }
}

 

        

posted on 2015-02-05 16:20  咩咩_april  阅读(240)  评论(0编辑  收藏  举报