对于数据的存储和访问是android的很重要的一块内容,比如参数的保存,文件的访问,数据库的存储和访问,对内容提供者的建立和访问等等。
这里我们就对下面的这些存储方式进行一下剖析:
------------------------------------------------------------------------------------------------
1) sharedpreferences
应用场景:保存简单、少量的键值对数据,一般用作应用参数的保存
实现:XML文件
好处:比自己写代码更简单
看一段保存数据的代码:
//得到一个实现Editor接口的对象,文件模式为private模式,表示只有当前应用可以访问并且新的文件内容会覆盖旧的文件内容
SharedPreferences.Editor editor = getSharedPreferences("test",MODE_PRIVATE).edit();
//在文件中加入键值对 text为键 内容为hello 当前内容在内存中 且存在于editor对象中
editor.putString("text", "hello");
//把内容提交给preference对象 对数据进行保存 文件保存在data/data/包名/shared_prefs中 文件名没加后缀 因为系统自动会给文件补加.xml
editor.commit();
下面是一段读取内容的代码:
//得到preference对象
SharedPreferences prefs = getSharedPreferences("test", MODE_PRIVATE);
//得到text键对应的内容
String restoredText = prefs.getString("text", null);
//可以把内容赋值给一个textview组建进行显示
if (restoredText != null) {
mSaved.setText(restoredText, TextView.BufferType.EDITABLE);
2) 应用程序内的数据保存
非键值对格式、或者自定义格式、数组字符串等
相对少量的字符串
例如:{”asfas“, "asfasfd", "132123"}
//打开一个输出流 如果文件不存在 系统会自动创建
FileOutputStream openFileOutput = openFileOutput("test.txt", MODE_APPEND);
//这里用了通用的字符流读写方式 把"test"转换为byte写入文件中
openFileOutput.write("test".getBytes());
文件的读取:
//打开一个输入流连接到test.txt文件上
FileInputStream openFileInput = openFileInput("test.txt");
//创建一个字节数组输出流 把文件读取的内容先暂时存到内存中
ByteArrayOutputStream stream = new ByteArrayOutputStream();
//创建一个1k的缓冲
byte[] buffer = new byte[1024];
int length = -1;
//判断是否读到了文件的末尾
while ((length = openFileInput.read(buffer)) != -1){
//由于文件最后的读入不一定是1024,所以用参数length来保证
stream.write(buffer, 0, length);
}
//把字节流转换为字符串
String str = stream.toString();
3)External store SD卡
场景:较大或者大量的文件
例如:极品飞车、实况足球等大型游戏,
数据包安装到SD卡上,节省内存空间。
缺点:读取速度相对内存较慢,以时间换空间
SDCard路径: "/mnt/sdcard/test.txt"
读写方式和应用程序内的数据类似
"/mnt/sdcard/"的目录可以用Environment.getExternalStorageDirectory()得到
File file = new File(Environment.getExternalStorageDirectory(), filename);
但是需要注意添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
4) 数据库SQLite
在Android中使用数据库的场景:
有大量相同类型数据需要增删改查
a) 联系人、短信、多媒体等系统应用
b) 管理类应用,比如Launcher、SoftMarket
SQLite步骤:
a) 声明一个类,继承SQLiteOpenHelper
b) 覆写onCreate()/onUpgrade()/构造方法
public XXXSQLiteHelper(Context context){
super(context, "test.db", null, 1);
}
c) 创建数据库辅助类的实例(new XXXSQLiteHelper())
d) 通过helper.getWritableDatabase()获取数据库访问实例
e) 用SQLiteDatabase的execSQL()方法实现增删改
用rawQuery()方法实现查询
创建表:
String sql = "CREATE TABLE person (personid integer primary key autoincrement, name varchar(20), phone VARCHAR(12) NULL)"
db.execSQL(sql);
插入语句:
SQLiteDatabase db = mDBHelper.getWritableDatabase();
db.execSQL("insert into person(name, phone) values(?, ?)", new String[]{"tom", "13812312312"});
升级表
db.execSQL("ALTER TABLE person ADD salary VARCHAR(12) NULL");
插入数据
SQLiteDatabase db = mHelper.getWritableDatabase();
db.execSQL("insert into person(name, phone) values(?, ?)", new String[]
{"tom", "13812312312"});
查询数据
SQLiteDatabase db = mHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select * from person where personid=?", new String[]
{"1"});
if (cursor.moveToFirst())
{
int personid1 = cursor.getInt(cursor.getColumnIndex("personid"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
System.out.println();
}
更新数据
db.execSQL("update person set name=?, phone=? where personid=?", new Object[]
{"tom", "18675510130", 1});
删除数据
"delete from person where personid=?", new Object[]{1}
本文出自 “安卓笔记” 博客,转载请与作者联系!