Android数据存储

<span style="font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', Tahoma, Helvetica, sans-serif, 'Microsoft YaHei', Georgia, Helvetica, Arial, sans-serif, 宋体, PMingLiU, serif; background-color: rgb(255, 255, 255);">Android为应用程序的数据持久化提供了几种选择。所选择的方案取决于应用的特定需求,比如数据是私人数据或者其他应用可以访问的数据或者数据需要多少的空间。</span>
Shared Preferences:以键值对的方式存储私有数据
Internal Storage:内部存储器存储私有数据,data文件夹下
External Storage:存储在外部存储器上的数据,其他应用均可访问
SQLite Databases:存储在数据库中
Network Connection:存储在网络上
Android提供了另外一种方法能够让其他应用程序去访问你的私有数据-content provider.content provider是可选的组件去读写你的应用数据。

Shared Preference
SharedPreferences类能够让你去保存和查询基本数据类型的键值对,这些类型包括:boolean,float,int,long和String。
获得SharedPrefernces对象的方法有两种:
    getSharedPreferences()-如果你需要不同名字的preferences文件去,这个方法的第一个参数就是这个preferences的名字。
    getPreference()-如果你只需要一个preferences文件,不需要提供preferences的名字。
写入值:
    1.调用edit()得到SharedPreferences.Editor
    2.调用putBoolean()或者putString()等方法加入值
    3.提交数据的方法commit()

查询值,使用SharedPreferences提供的方法,比如getBoolean()或者getString();

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

Internal Storage
你能够将文件直接保存在设备的内部存储中,默认情况下,保存在内部存储中的私有数据是不能够被其他应用程序访问的,当用户卸载该应用时,这些文件也将会被删除。
如何在内部存储中创建和写入一个私有的文件:
1.调用openFileOutput(),返回FileOutputStream.
2.write()写入文件
3.关闭流close()
String FILENAME = "hello_file";
String string = "hello world!";

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



MODE_PRIVATE将创建或者替换一个相同名字的文件,并且使这个文件成为该应用的私有文件。
如何在内部存储中读取一个私有文件:
1.调用openFileInput()输入这个文件的名字,返回FileInputStream.
2.读取bytes通过read().
3.关闭流close().
如果你想要在编译时保存文件,需要把该文件放在工程res/raw/目录下。通过openRawResource()打开文件,这个方法返回InputStream,该文件夹下的文件,只能读取不能够去写入。

cache files
如果你想缓存数据,使用getCacheDir()来打开一个文件,代表应用程序的内部目录应该临时缓存这个文件。
当设备的内部存储空间不足时,Android会删除这些缓存文件恢复空间。但是,我们不能依赖系统清理这些文件。你应该将缓存文件保持在合理限制的空间。当用户卸载应用程序的时候,这些文件将被删除。
其他有用的方法:
getFilesDir()-获取文件系统的绝对路径
getDir()-创建或者打开已经存在的路径
deleteFile()-删除一个保存在内部存储空间里的文件
fileList()-返回当前程序的缓存文件列表

External Storage

每个android设备支持共享“外部存储器”,您可以用它来保存文件。这可能是一个可移动的存储介质(如一个SD卡)或内部(固定的)存储。文件保存到外部存储是公开的,可以由用户修改时启用USB大容量存储在电脑传输文件。

检查存储媒介可用性

在使用外部存储做任何事情之前,你必须调用getexternalStorageState()去检查存储是否可用,存储可能被安装在电脑上,可能丢失或者是只读状态,或者是其他的状态。

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



cache files
如果你想缓存数据,使用getCacheDir()来打开一个文件,代表应用程序的内部目录应该临时缓存这个文件。
当设备的内部存储空间不足时,Android会删除这些缓存文件恢复空间。但是,我们不能依赖系统清理这些文件。你应该将缓存文件保持在合理限制的空间。当用户卸载应用程序的时候,这些文件将被删除。
其他有用的方法:
getFilesDir()-获取文件系统的绝对路径
getDir()-创建或者打开已经存在的路径
deleteFile()-删除一个保存在内部存储空间里的文件
fileList()-返回当前程序的缓存文件列表

External Storage

每个android设备支持共享“外部存储器”,您可以用它来保存文件。这可能是一个可移动的存储介质(如一个SD卡)或内部(固定的)存储。文件保存到外部存储是公开的,可以由用户修改时启用USB大容量存储在电脑传输文件。

检查存储媒介可用性

在使用外部存储做任何事情之前,你必须调用getexternalStorageState()去检查存储是否可用,存储可能被安装在电脑上,可能丢失或者是只读状态,或者是其他的状态。


getExternalStorageState()方法返回其他状态,您可能需要检查,如是否共享媒体(连接到一台计算机),完全不见了,已经被严重损坏等,您可以使用这些来通知用户更多信息时,您的应用程序需要访问存储。
访问外部存储上的文件
如果你使用API级别8或更高,使用getExternalFilesDir()来打开一个文件,代表了外部存储目录应该保存你的文件。这个方法需要一个类型参数指定子目录的类型你想要的,如DIRECTORY_MUSIC和DIRECTORY_RINGTONES(null传递给接收应用程序的文件的根目录)。该方法将在必要时创建适当的目录。通过指定目录的类型,你确保Android的媒体扫描仪将妥善分类你的文件系统中(例如,铃声被确定为铃声,而不是音乐)。如果用户卸载应用程序,此目录及其所有内容将被删除。
如果你使用API 7级或更低,使用getExternalStorageDirectory(),打开一个文件代表外部存储器的根源。你应该写你的数据在以下目录中:
/Android/data/<package_name>/files/
< package_name >是您的java风格的包名称,如“com.example.android.app”。如果用户的设备运行时API级别8或更高版本卸载应用程序,此目录及其所有内容将被删除.

保存可共享文件
如果需要保存普通文件并且该文件在你的应用卸载后不被删除,将它们保存在外部存储的一个公用目录下,这个目录在外部存储的根目录下,例如music/,pictures/,等等
在API8或者更高,使用getExternalStoragePublicDirectory(),输入这个公用目录的类型,比如DIRECTORY_MUSIC,DIRECTORY_PICTURES,DIRECTORY_RINGTONES,等等。这个方法将创建一个合适目录,如果该目录不存在,比如:Music/,Podcasts/,Ringtones/,Alarm/,Notifications/,Pictures,/Movies/,Download
保存缓存文件
如果你使用API8或更高,使用getExternalCacheDir()来打开一个文件,代表了外部存储目录应该保存缓存文件。如果用户卸载您的应用程序,这些文件将被自动删除。然而,在应用程序的生命周期内,你应该管理这些缓存文件和删除那些不需要文件。

使用数据库
Android完全支持SQLite数据库,应用程序中的所有类都可以通过名字去访问该应用创建的数据库。
创建SQLiteOpenHelper的子类,并重新onCreate()方法,在方法里执行SQLite命令去创建表
public class DictionaryOpenHelper 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);
    }
}



继承SQLiteOpenHelper,使用你定义的构造函数来获得一个SQLiteOpenHelper的实例,调用getWritableDatabase()和getReadableDatabase()去分别写或者读数据库。它们将返回一个SQLiteDataBase对象并提供SQLite的一些操作方法。
你能够执行SQLite查询使用SQLiteDatabase query()方法,接受各种查询参数,比如表查询,投影,列,分组查询等。对于复合查询,你应该使用SQLiteQueryBuilder,它提供了几个方便的方法来构建查询。

MODE_PRIVATE将创建或者替换一个相同名字的文件,并且使这个文件成为该应用的私有文件。
如何在内部存储中读取一个私有文件:
1.调用openFileInput()输入这个文件的名字,返回FileInputStream.
2.读取bytes通过read().
3.关闭流close().
如果你想要在编译时保存文件,需要把该文件放在工程res/raw/目录下。通过openRawResource()打开文件,这个方法返回InputStream,该文件夹下的文件,只能读取不能够去写入。

cache files
如果你想缓存数据,使用getCacheDir()来打开一个文件,代表应用程序的内部目录应该临时缓存这个文件。
当设备的内部存储空间不足时,Android会删除这些缓存文件恢复空间。但是,我们不能依赖系统清理这些文件。你应该将缓存文件保持在合理限制的空间。当用户卸载应用程序的时候,这些文件将被删除。
其他有用的方法:
getFilesDir()-获取文件系统的绝对路径
getDir()-创建或者打开已经存在的路径
deleteFile()-删除一个保存在内部存储空间里的文件
fileList()-返回当前程序的缓存文件列表

External Storage

每个android设备支持共享“外部存储器”,您可以用它来保存文件。这可能是一个可移动的存储介质(如一个SD卡)或内部(固定的)存储。文件保存到外部存储是公开的,可以由用户修改时启用USB大容量存储在电脑传输文件。

检查存储媒介可用性

在使用外部存储做任何事情之前,你必须调用getexternalStorageState()去检查存储是否可用,存储可能被安装在电脑上,可能丢失或者是只读状态,或者是其他的状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值