【iOS-Android开发对比】之 数据存储
写在前面的话
相比Android和iOS,我觉得Android的数据存储更开放一些。Android天生就可以使用多Java I/O;并且天生开放的特性,开发者可以直接在SD卡中读写文件,自由度比较高。缺点吗,也是因为太开放,所以Android的相册和文件夹都惨不忍睹。
Android本身自带Java的反射和注解,很早就有了ORM数据库。这里解释一下,ORM就是 Object Relation Mapping, 对象关系映射。 通过建立对象来生成数据库字段,大大简化了代码。
Android的ORM我用过 GreenDao 和 ActiveAndroid , GreenDao需要写Java项目来生成,而且lib包也比较多。后来我用ActiveAndroid,类似于Ruby的ORM存储方式,用起来比较顺手。
IOS有Core Data, 但是用起来比较复杂。我一开始是直接使用 FMDB ,因为是SQLite的封装,还需要写SQLite代码,写起来还是比较麻烦。 当然,现在有了 MagicalRecord ,类似ORM数据库的Core Data封装, 能简化不少代码。
Android的4种数据存储方式
1 使用SharedPreferences存储数据;
SharedPreferences是用来存储一些Key/Value类似的成对的基本数据类型。
它只能存储基本数据类型,也即int, long, boolean, String, float。
IOS相对的就是NSUserDefaults
;
下面是示例代码:
void WriteSharedPreferences(String strName,String strPassword){
SharedPreferences user = getSharedPreferences(“user_info”,Context.MODE_PRIVATE);
user.edit();
user.putString(“NAME”, strName);
user.commit();
}
void ReadSharedPreferences(){
String strName,strPassword;
SharedPreferences user = getSharedPreferences(“user_info”,Context.MODE_PRIVATE);
strName = user.getString(“NAME”,””);
}
SharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File Explorer中的/data/data//shares_prefs下.
SharedPreferences同样是沙盒机制:只能在同一个包内使用,不能在不同的包之间使用。
<?xml version=”1.0″ encoding=”UTF-8″?>
<map>
<string name=”NAME”>XXXX</string>
</map>
2 文件存储数据;
Internal Storage内部存储空间
这里是指手机内置的存储空间,称为内部存储。使用内部存储主要有二个方式,一个是文件操作,一个是文件夹操作.
Context提供了两个方法来打开数据文件里的文件IO流
FileInputStream openFileInput(String name);
FileOutputStream(String name , int mode).
Context还提供了如下几个重要的方法:
getDir(String name , int mode); //在应用程序的数据文件夹下获取或者创建name对应的子目录
File getFilesDir(); //获取该应用程序的数据文件夹得绝对路径
String[] fileList(); //返回该应用数据文件夹的全部文件
Context.openFileOutput(String fileName, int mode)生成的文件自动存储在/data/data/Package Name/files
目录下,其全路径是/data/data/Package Name/files/fileName
。
注意下,这里的参数fileName不可以包含路径分割符(如”/”).
内部存储空间应该用来保存比较重要的数据,apk被卸载时,apk在内部存储空间的文件数据将被删除。
示例代码:
FileOutputStream output = Context.openOutputFile(filename, Context.MODE_PRIVATE);
output.write(data);// use output to write whatever you like
output.close();
FileInputStream input = Context.openInputFile(filename);
input.read();
input.close();
public String read() {
try {
FileInputStream inStream = this.openFileInput("message.txt");
byte[] buffer = new byte[1024];
int hasRead = 0;
StringBuilder sb = new StringBuilder();
while ((hasRead = inStream.read(buffer)) != -1) {
sb.append(new String(buffer, 0, hasRead));
}
inStream.close();
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void write(String msg){