android数据存储的选择

来源:互联网 发布:网络电视买什么牌子 编辑:程序博客网 时间:2024/06/06 14:03

存储的选择

android提供几种持久化应用数据的选择,选择何种方式依据你的具体需求,比如数据对你的应用来书是私有的还是可以让其他的应用程序(或者用户)得到以及你的数据需要多大的空间

  • Shared Preferences
    以键值对的形式存储私有的原始数据
  • 内存
    将私有数据存储在设备的内存中

  • 外部存储
    将共有数据存储在共享的外部存储

  • sqlite数据库
    将结构化的数据存储在私有的数据库中

  • 将数据存在你自己的网络服务器上

    android通过content provider提供一种让你将自己的私有数据暴露给其他的程序。

    使用Shared Preferences

    SharedPreferences类提供一个框架允许你存储和获取持久化的key-value对或者原始数据类型。你可以使用SharedPreferences来存储任何原始数据:booleans,floats,ints,longs,和strings。你可以使用以下的其中任何一种方法来获得SharedPreferences:

  • getSharedPreferences()-如果你需要一个以上preferences文件,你可以通过第一个参数来给文件命名用以区分文件。

    写数据流程:

  • 调用edit()来获得SharedPreferences.Editor。

  • 通过putBoolean()或者putString()这样的函数来添加值。
  • 用commit()函数提交新值

    读数据:
    使用SharedPreferences的getBoolean()和getString()等函数方法
    以下是一个将计算器静音模式存储在preferences文件中的例子

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();    } } 

使用内部存储

你可以将文件直接存储在设备的内部存储中,默认的情况,存储在内部存储中的文件对你的应用来说是私有的,并且其他的应用是无法获取的(对用户来说也是如此)。当用户卸载应用,这些文件也会被移除。
创建并且写入一个私有文件到内部存储中的流程:

  • 调用openFileOutput()函数并且传入文件名称和操作模式作为参数。返回FileOutputStream对象。
  • 用write()来写入文件
  • 用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
从内部存储中读取文件

  • 调用openFile()函数并且将文件名称传递过去,返回一个FileInputStream对象
  • 使用read()函数读取字节
  • 使用close()函数来关闭输入流

    存进缓存文件中

    如果你想缓存一些数据,而不是持久化它,你应该使用getCacheDir()打开应用临时存储缓存文件的文件目录。
    当设备的存储空间很少时,android可能会删除这些缓存文件来恢复内存空间。但是,你不应该依靠系统来清理这些缓存文件。你应该总是自己维护这些缓存文件并且让它们处于一个合理的内存空间消耗状态比如说:1MB。当用户移除应用,这些文件会被移除。

    其它一些有用的方法

  • getFilesDir():得到内部存储文件的绝对路径。

  • getDir():创建(或者打开已经存在)内部存储的目录
  • deleteFile():删除存储在内部存储中的文件。
  • 返回当前应用存储的文件列表

使用外部存储

每一个支持android系统的设备一般都支持添加外部存储来存储文件。可能是可移除的存储媒体(比如SD卡)或者是内部的不可移除的存储。存储在外部存储空间的文件全都可读并且可以在USB大容量存储设备间进行传输和修改。

注意:如果用户将外部存储挂载在电脑或者移除可能会导致外部存储不能使用,而且存储在外部存储的文件是没有安全性保障的。所有的用户可以读写存在外部存储的文件,并且用户可以移除这些文件。

与外部存储进行交互

为了能够读或者写外部存储的文件。你的应用必须获取READ_EXTERNAL_STORAGE 或者WRITE_EXTERNAL_STORAGE 的系统权限。比如:
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>

如果你既需要读又需要写文件,你只需要获取
WRITE_EXTERNAL_STORAGE权限,因为它也隐式包含读权限
注意:从android4.4以后,如果你读或者写那些对于你的app来说是私有的文件时候你就不需要这些权限。更多的可以查看一下“保存app私有的文件”

检查外部存储的可用性

在你对外部存储做任何工作前,你都应该首先调用getExternalStorageState()函数来检查设备是否可用。因为外部存储可能是被挂载在电脑上,丢失,只读状态,或者其他状态。
比如以下方法就可以用来检查外部存储是否可用:`/* 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; } `

getExternalStorageState()方法可以返回你可能希望检查的其他状态。比如媒介是否正在分享(连接到一个电脑上),是否完全就不可用等等。当用户需要接触这些媒介你可以用这些函数给用户更多的提示。

存储可能分享给其他软件的文件

总的来说,新建的用户可以通过你的app获取的文件应该存储在公共的位置,这些位置其他的app可以获取并且用户可以很方便的从这些位置拷贝。为了做到这些
你应该使用以下的公共文件目录,比如:Music/, Pictures/,Ringtones/.等等
为了能得到合适的公共存储目录,调用getExternalStoragePublicDirectory()函数,并且传递你想要获取的目录类型,比如: DIRECTORY_MUSIC, DIRECTORY_PICTURES, DIRECTORY_RINGTONES
或者是其他的。
比如:如下是一个在公共图片目录下为新的照片组创建目录的方法:

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;} 

保存app私有的文件

  • 如果你想保存那些不打算为其他apps所用的文件(比如那些仅仅给自己app使用的皮肤或者声音效果),你应该通过调用 getExternalFilesDir()函数来使用在外部存储上的私有存储目录。这个方法也使用一个type参数来确定子目录(比如DIRECTORY_MOVIES).如果你不需要一个具体的媒体目录,传递null参数,这样根目录就会作为你的app的私有目录。
  • 从Android4.4开始,读或者写文件到你的app私有目录,不需要获取 READ_EXTERNAL_STORAGE 或者WRITE_EXTERNAL_STORAGE权限。所以你可以通过添加maxSdkVersion属性来给仅仅低版本设备上需要权限的声明权限。
<manifest ...>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"                     android:maxSdkVersion="18" />    ...</manifest>

注意:当用户卸载你的应用,这个目录和所有的内容都会被删除。当然,设备媒体扫描器也无法读取这些目录中的文件,所以,这些文件也无法使用MediaStore content provider来获取。既然如痴,你不应该使用使用这些目录来存储那些理论上属于用户的数据,比如从你的app获取的或者是被你的app编辑的图片。或者是用户使用你的app获取的音乐。这些文件应该被保存在public 目录中。

保存缓存文件

  • 为了打开代表外部存储设备的保存缓存文件的文件夹,你需要调用getExternalCacheDir()函数。如果用户卸载你的应用,这些文件会被自动的删除。
  • 和上面提到的ContextCompat.getExternalFileDir(),通过调用ContextCompat.getExternalCacheDirs()你也可以获取外部的二级缓存文件夹(如果可以的话)。
    提示
    为了保留文件空间并且维持应用的性能,在你的应用生命周期期间小心地管理你的缓存文件并且移除那些不再需要的文件很重要。

使用数据库

android系统提供对SQLiTE数据库的完全支持。在应用内你创建的任何数据库,都可以被任何类所访问。当在应用外就不可。
推荐的做法是是通过创建一个SQLiteOpenHelperde 子类并且重写onCreate()方法来创建一个新的数据库。在onCreate()方法中可以执行SQLite命令来创建数据库中的表格。比如:
你可以使用你自己定义的构造函数来获得SQLiteOpenHelper的实例。为了从数据库中写和读取,分别调用getWritableDatabase()和getReadableDatabase()来获取SQLiteDatabase代表数据库的对象并且提供相应的SQLite操作方法。
你可以使用SQLiteDatabase.query()来执行sqlite查询。这个函数接收多个查询参数,比如要查询的表格,projection(投影),selection,column,grouping和其他的。对于复杂的查询,比如那些需要列别名的查询,你应该使用SQLiteQueryBuilder,这个对象方便的提供几种建立起查询的方法。
每个SQLite查询都会返回一个指向找到的满足条件的行的Cursor。这个Cursor是一个让你可以从database中查询,读取行和列的一个机制。

使用网络连接

你可以使用网络来从你的服务器上存储和获取数据。网络操作。需要使用以下包得函数:
java.net*
android.net.*

0 0