本课程涵盖了云计算功能的应用不同的策略。它涵盖了同步数据和使用云自己的后端的Web应用程序,并使用云,这样一个新的设备上安装应用程序时,用户可以恢复他们的数据备份数据。
存储选项
Android提供了几个选项,为您节省持久应用程序数据。您选择的解决方案取决于您的特定需求,如数据是否应该是私有的应用程序或访问其他应用程序(和用户),并多少空间您的数据需要。
您的数据存储选项如下:
Shared Preferences
存储在键值对私人的基本数据。
Internal Storage
存储在设备内存的私人数据。
External Storage
存储在共享外部存储公共数据。
SQLite Databases
在专用数据库存储结构化数据。
Network Connection
用自己的网络服务器在网络上存储数据。
Android提供了一个方法可以让你即使您的私人数据暴露给其他应用程序 - 与内容提供商。内容提供商是一个可选组件,公开读给你的应用程序数据/写访问,受要强加任何限制。有关使用内容提供商的更多信息,请参阅内容提供商的文档。
使用Shared Preferences
该SharedPreferences类提供了一个总体框架,使您可以保存和检索的原始数据类型的持久键 - 值对。您可以使用SharedPreferences保存任何基本数据:布尔型,浮点数,整型,长整型和字符串。该数据将在用户会话持久(即使你的应用程序被杀害)。
用户首选项
共享偏好不严格用于保存“用户首选项”,比如什么铃声用户选择。如果您有兴趣为应用程序创建用户喜好,看PreferenceActivity,它提供了一个框架的活动,为您创建用户喜好,这将是自动持久(使用共享喜好)。
要获得SharedPreferences对象为你的应用程序,使用以下两种方法之一:
getSharedPreferences() - 如果你需要通过名称标识多个首选项文件,你的第一个参数指定使用此。
的getPreferences() - 如果你只需要一个为你的活动喜好文件中使用此。因为这将是唯一的喜好提交您的活动,你不提供一个名称。
写值:
调用编辑()得到一个SharedPreferences.Editor。
与方法,如putBoolean()和putString添加值()。
提交与提交新的值()
要读取值,使用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(); } }使用内部存储
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。
<manifest ...> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ... </manifest>如果您需要同时读取和写入文件,则需要请求只有WRITE_EXTERNAL_STORAGE权限,因为它隐含需要读取访问以及。
/* 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()方法返回,你可能要检查其他国家,如媒体是否被共享(连接到计算机),完全丢失,已删除严重,等等。你可以使用这些与通知用户当你的应用程序需要访问媒体的更多信息。
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; }节约是应用程序专用文件。
<manifest ...> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" /> ... </manifest>注意:当用户卸载应用程序,这个目录及其所有内容将被删除。此外,系统的介质扫描仪没有在这些目录读取文件,所以它们不从MediaStore内容提供商访问。因此,你不应该使用这些目录的媒体,最终属于用户,如捕获或与您的应用程序,或音乐的用户与您购买的编辑照片的应用程序,这些文件应该被保存在公共目录。
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实现的实例。要写入,并从数据库中读取,调用getWritableDatabase()和getReadableDatabase(),分别为。这些均返回表示数据库,并提供了SQLite的操作方法SQLiteDatabase对象。