Android学习笔记(Google官方教程)(五)

Saving Data

Saving Key-Value Sets

处理SharedPreferences

  • 可以通过调用一以下两种方法中的一种,创建一个shared preference文件或者访问已经存在的
  • getSharedPreferences():可以从你App中的任何上下文调用此方法
  • getPreference():从Activity中调用这个方法,因为会访问属于这个activity的默认的preference文件,所以你不需要提供名字

  • Context context = getActivity();
    SharedPreferences sharedPref = context.getSharedPreferences(
    getString(R.string.preference_file_key), Context.MODE_PRIVATE);
  • 通过资源string文件R.string.preference_file_key访问shared preferences,使用只能被你app才能访问的私有模式启用它
  • 如果你以MODE_WORLD_READABLE 或 MODE_WORLD_WRITEABLE创建一个shared preferences file,其他任何app只要知道文件标识符便能访问你的数据

写进SharedPreferences

  • 为了写进shared preferences file,用你的SharedPreferences调用edit()来创建一个 SharedPreferences.Editor
  • 将你想写入的键和值传入方法中,比如putInt() and putString(),然后调用commit()保存更改

    SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putInt(getString(R.string.saved_high_score), newHighScore);
    editor.commit();
    

读取SharedPreferences

  • 从一个 shared preferences file来检索值,调用例如getInt() and getString()方法,提供键去获取你想要的值。如果这个键不存在,将会视情况返回一个默认值

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

保存文件

选择内部或者外部存储

  • 所有的Android设备都有内部存储和外部存储两个存储区域
内部存储
  • 总是可用
  • 保存的文件默认情况下仅能被你的app所访问
  • 当用户卸载app,系统讲从内部存储移除你所有的app文件
  • 当你不想让用户或其他应用访问时,使用内部存储是最好的方式
外部存储
  • 并不总是可用
  • 全局可读
  • 当用户卸载app,系统只会移除你用getExternalFilesDir()保存的文件
  • 不需要访问限制,想和其他app分享数据或者让使用者用电脑访问时,外部存储将是最好的文件保存路径

尽管app默认安装在内部存储空间,但你可以通过在清单文件指定android:installLocation属性来设置存储路径

获取访问外部存储的权限
  • 为了写入外部存储,你必须在清单文件中请求WRITE_EXTERNAL_STORAGE权限

    <manifest ...>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        ...
    </manifest>
    
  • 你不需要申请内部存储的权限,因为你的应用总有读写它内部存储的权限

将文件保存到内部存储
  • 通过调用getFilesDir()和getCacheDir()来获取合适的路径
  • getCacheDir():系统当以低内存运行时,将可能不经提醒删除你的缓存文件
  • 调用openFileOutput()得到FileOutputStream将文件写入到你的内部存储中

    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();
    }
    
  • 如果你希望缓存一些文件,你应该调用createTempFile()

    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;
    }
    
将文件保存到外部存储
  • 因为外部存储不一定是可用的,所以你必须通过调用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;
    }
    
  • 当用户卸载程序时,公有文件将被保留,私有文件将被系统自动删除
  • 如果你想要保存共有文件,使用getExternalStoragePublicDirectory()

    public File getAlbumStorageDir(String albumName) {
     // Get the directory for the user's public pictures directory. 
     File file = new File(Environment.getExternalStoragePublicDirectory(
         Environment.DIRECTORY_PICTURES), albumName);
     if (!file.mkdirs()) {
         Log.e(LOG_TAG, "Directory not created");
      }
      return file;
    }
    
  • 如果你想要保存私有文件,那可以使用getExternalFilesDir()

    public File getAlbumStorageDir(Context context, String albumName) {
       // Get the directory for the app's private pictures directory. 
      File file = new File(context.getExternalFilesDir(
             Environment.DIRECTORY_PICTURES), albumName);
     if (!file.mkdirs()) {
         Log.e(LOG_TAG, "Directory not created");
     }
     return file;
    }
    
  • 无论你用哪种方法,使用API提供的常量路径名,例如DIRECTORY_PICTURES,将会确保这些文件被系统合理地处理

查询可用空间
  • 你可以调用 getFreeSpace() or getTotalSpace()来获取可用的存储空间和总共的存储空间
删除文件
  • myFile.delete();
  • 如果文件保存在内部存储,可以通过请求上下文Context调用deleteFile()来删除一个文件

将数据保存到SQL数据库

使用SQL Helper创建一个数据库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值