android数据保存
永久保存数据的方法:
1.Shared Preferences 以键值对的形式存储基本数据类型( booleans, floats, ints, longs, and strings),存储的数据在限制在一个application(一个package)内部使用
2.Internal Storage 将私有文件存储到内部存储器中。这些文件是一个application私有的,其他application无法访问到
3.External Storage 将公共数据存储到外部存储器中
4.SQLite Databases
Store structured data in a private database.
5.Network Connection
Store data on the web with your own network server.
Android
provides a way for you to expose even your private data to other
applications — with a content provider. A content provider is an
optional component that exposes read/write access to your application
data, subject to whatever restrictions you want to impose
Using Shared Preferences
获取一个 SharedPreferences对象,两种方法:
getSharedPreferences() - 有多个 preferences files 时使用该方法。该方法的第一个参数指定想要操作的preferences file 的名字
getPreferences()
- 只有一个preferences file时使用该方法。Because this will be the only preferences
file for your Activity, you don't supply a name.
获取对象之后,就可以调用对象的方法读取preferences file中的数据和写入数据到preferences file
读取: 使用 SharedPreferences 的 getBoolean() 和getString()方法
写入:
调用 edit() 方法获取 SharedPreferences.Editor对象.
使用 putBoolean() and putString()写入值.
Commit the new values with commit() :使用该方法提交新写入的值
看下面的示例:
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, );
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, );
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode); // Commit the edits!
editor.commit();
}
}
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, );
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, );
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode); // Commit the edits!
editor.commit();
}
}
Using the Internal Storage
私有文件的存储。用户卸载application后该种数据会被移除
将私有文件写入到内存中:
调用 openFileOutput() 方法获取文件的输出流。在方法的参数中指定文件名和操作模式
使用 write()方法写入
关闭流: close().
示例:
view plaincopy to clipboardprint?
String FILENAME = "hello_file";
String string = "hello world!"; FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.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.
从内存中读取文件到程序中:
调用openFileInput() 方法获取输入流。方法参数指定文件名
使用read()方法读取.
关闭流: close().
在编译期读取只读的静态文件:
要把文件放在 res/raw/目录下, 使用openRawResource(R.raw.<filename>)方法打开文件,该方法返回一个输入流,使用这个流就可以读取文件内容了
Saving cache files
如果只想暂时性的保存数据而不是长久保存
使用 getCacheDir() 方法打开一个 File (application存放临时缓存数据的路径)
当设备内存不足时,系统可能会自动删除这类数据以释放内存空间。但是你不能依靠这个可能性,你要保证cache文件不能占用过多的内存空间。当application被卸载,这部分数据被移除
Other useful methods
getFilesDir()
Gets the absolute path to the filesystem directory where your internal files are saved.
获得基于存储 internal files 目录的完整路径(不同的文件系统获得路径会不同)
getDir()
Creates (or opens an existing) directory within your internal storage space.
在内存中创建一个目录
deleteFile()
Deletes a file saved on the internal storage.
删除内存中的一个文件
fileList()
Returns an array of files currently saved by your application.
获得一个application存储的所有文件,并存储在数组中
Using the External Storage
外部存储。这些文件可以在设备之间随意的读写,只要设备的系统与android兼容。容易丢失,所以操作的时候要格外小心
用于存储的storage有:可移动的media storage(如SD卡)和不可移动的storage
Checking media availability
检查media是否可用
media在使用之前要先检查是否可用,调用 getExternalStorageState()方法获取media的状态。用法如下:
view plaincopy to clipboardprint?
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;
}
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;
}
一般常见的状态有:可读写、只读和不可用
getExternalStorageState()还会返回其他更多的状态,比如media有没有共享、安装是否正常、卸载时是否出错等等,以此来通知用户设备的状态
Accessing files on external storage
当你使用Level8或更高的API时, 使用getExternalFilesDir() 打开一个 File (表示external storage中本次数据存储的目录)。
不传递参数时表示external storage的根目录。有参数则对应着指定的目录类型,例如 DIRECTORY_MUSIC and
DIRECTORY_RINGTONES,分别代表音乐目录和铃声目录。如果指定的目录不存在,就会创建该目录。通过指定目录类型可以让android
多媒体扫描器给你的文件分类。如果你的application被用户卸载,这种方式存储的目录和内容会被移除
如果使用Level7或更低版本的API,使用 getExternalStorageDirectory(), 打开 File所代表的external storage的根目录。
还需要把数据写在下面的目录中:/Android/data/<package_name>/files/用户使用Level8或更高
版本的API卸载这个版本的应用时,上面的目录和目录中的内容会被移除Saving files that should be shared
如
果想保存与应用无关的文件,也就是说application卸载后保存的文件仍然保留,就要把文件保存在 external
storage的公共目录中,这些目录位于 external storage的根目录,比如 Music/, Pictures/,
Ringtones/等
当你使用Level8或更高的API时,使用 getExternalStoragePublicDirectory()方法,传递参数
DIRECTORY_MUSIC, DIRECTORY_PICTURES,
DIRECTORY_RINGTONES,就可以把文件保存在指定目录。目录不存在则创建
如果使用Level7或更低版本的API, 使用 getExternalStorageDirectory() 方法打开 File 所代表的 external storage的根目录, 把共享文件存储到下面的目录中一个即可:
Music/ - Media scanner classifies all media found here as user music.
Podcasts/ - Media scanner classifies all media found here as a podcast.
Ringtones/ - Media scanner classifies all media found here as a ringtone.
Alarms/ - Media scanner classifies all media found here as an alarm sound.
Notifications/ - Media scanner classifies all media found here as a notification sound.
Pictures/ - All photos (excluding those taken with the camera).
Movies/ - All movies (excluding those taken with the camcorder).
Download/ - Miscellaneous downloads.
Saving cache files
如同上面提到的,根据不同的API版本使用不同的方法:
高版本API: 使用getExternalCacheDir()
低版本API: getExternalStorageDirectory()打开根目录,cache data 写到/Android/data/<package_name>/cache/目录中
Using Databases
android完全支持SQLite数据库
经典的创建SQLite数据库的方法是:构造SQLiteOpenHelper 的子类并覆盖onCreate()方法,就可以在方法中使用SQLite命令:
public class MyDbOpenHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = ;
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);
}
}
public class MyDbOpenHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = ;
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);
}
}
Android中使用SQLite 数据库的例子参见 Note Pad 和Searchable Dictionary 。
Android中SQLite 数据库的调试工具:sqlite3
Using a Network Connection
You can use the network (when it's
available) to store and retrieve data on your own web-based services. To
do network operations, use classes in the following packages:
java.net.*
android.net.*
android数据保存的更多相关文章
- Android数据保存之文件保存
前言: 上一篇文章写了在Android中利用SharedPreferences保存数据,SharedPreferences在保存数据的时候主要是保存一些应用程序的设置信息或者少量的用户信息,并且是以k ...
- Android数据保存之SharedPreference
前言: 程序中处理的大部分问题都与数据有关,读取数据显示在UI上,读取的数据可以是本地的,也可以是网络的.保存用户数据到存储空间,可以是本地的数据库,文件等,也可以是保存到网络服务器.总之大部分的程序 ...
- android数据保存之greendao
有时我们的数据属于保存到数据库,对于Android应用和IOS应用,我们一般都会使用SQLite这个嵌入式的数据库作为我们保存数据的工具.由于我们直接操作数据库比较麻烦,而且管理起来也非常的麻烦,以前 ...
- MTK Android Android数据保存到系统数据库
如果有留意Android中系统设置Settings里面的源码,你会发现代码中频繁用到了Settings.System操作,该类通过键值对的形式,将一些特定的值以全局的模式保存到Setting的数据库中 ...
- Android中的数据保存
形式 Android的数据保存分为3种形式:file, SharedPreference, Database 文件 主要思想就是通过Context类中提供的openFileInput和openFile ...
- Android少量数据保存之SharedPreferences接口实例
SharedPreferences数据保存主要是通过键值的方式存储在xml文件中 xml文件在data/此程序的包名/XX.xml 格式 <?xml version='1.0' encoding ...
- Android数据存储(1)少量数据保存之SharedPreferences接口实例
SharedPreferences数据保存主要是通过键值的方式存储在xml文件中 xml文件在data/此程序的包名/XX.xml 格式 <?xml version='1.0' encoding ...
- android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法
android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法 SharedPreferences保存数据到xml文件 有时候要保存activity的某些状 ...
- [Android] Android GreenDao 保存 JavaBean 或者List <JavaBean>类型数据
Android GreenDao 保存 JavaBean 或者List <JavaBean>类型数据 简介 数据库存储数据基本上每个APP都有用到,GreenDAO 是一个将对象映射到 S ...
随机推荐
- os即时通讯客户端开发之-mac上安装MySQL
一.安装 到MySQL官网上http://dev.mysql.com/downloads/mysql/,下载mysql可安装dmg版本 比如:Mac OS X ver. 10.7 (x86, 64-b ...
- TortoiseGit上传代码到GitHub
Github是管理软件开发的首选托管网站,12306的火车票插件一时让国内当时很多小白开发者(当然也包括我)认识到了这个网站.GitHub可以托管各种git库,并提供一个web界面,与 SourceF ...
- JAVA设计模式(09):结构型-代理模式(Proxy)
代理模式是经常使用的结构型设计模式之中的一个,当无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接 ...
- myeclipse快捷键收集整理
Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt ...
- [Javascript] Array methods in depth - slice
Array slice creates a shallow copy of an array. In this lesson we cover, in detail, exactly what a ' ...
- android studio 的部分设置
1.android studio 如何提示方法的用法 在 Eclipse中鼠标放上去就可以提示方法的用法,实际上Android Studio也可以设置的.如图 Preferences > Edi ...
- Android组件系列----BroadcastReceiver广播接收器
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- 多线程、Service与IntentService的比较
资料摘自网络(侵删) Service Thread IntentService AsyncTask When to use ? Task with no UI, but shouldn't b ...
- poj 3671 Dining Cows (Dp)
/* 一开始并没有想出On的正解 后来发现题解的思路也是十分的巧妙的 还是没能把握住题目的 只有1 2这两个数的条件 dp还带练练啊 ... */ #include<iostream> # ...
- C# Html网页生成图片解决方案1
1.使用System.Windows.Forms命名空间下的WebBrowser控件加载网页并生成图片 GiHub参考地址: https://github.com/tianma3798/FileOpa ...