文件存储与事务的使用
1.将数据存储到文件中(文本的形式,有权限,并且只能存在指定的文件夹里)
Context类中提供了一个 openFileOutput()方法,可以用于将数据存储到指定的文件中。
这个方法接收两个参数,第一个参数是文件名,在文件创建的时候使用的就是这个名称,注
意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data/<package
name>/files/ 目 录下 的 。第 二 个 参数 是 文件 的 操作 模 式 ,主 要 有两 种 模式 可 选 ,
MODE_PRIVATE 和 MODE_APPEND。其中 MODE_PRIVATE 是默认的操作模式,表示当指
定同样文件名的时候,所写入的内容将会覆盖原文件中的内容,而 MODE_APPEND 则表示
如果该文件已存在就往文件里面追加内容,不存在就创建新文件。其实文件的操作模式本来
还有另外两种,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE,这两种模
式表示允许其他的应用程序对我们程序中的文件进行读写操作,不过由于这两种模式过于危
险,很容易引起应用的安全性漏洞,现已在 Android 4.2 版本中被废弃。常用方法:
ContextWrapper extends Context,里面的重要方法: getFilesDir();//得到内部存储的路径目录,输出为: data/data/<packagename>/files fileList();//获取data/data/<packagename>/files/下的所有文件 deleteFile(name);//删除data/data/<packagename>/files/下的指定文件
2.将数据存储到 SharedPreferences中(键值对的形式)
要想使用SharedPreferences来存储数据,首先需要获取到SharedPreferences对象。Android
中主要提供了三种方法用于得到 SharedPreferences 对象。
1.Context类中的 getSharedPreferences()方法
此方法接收两个参数,第一个参数用于指定 SharedPreferences文件的名称,如果指
定的文件不存在则会创建一个,SharedPreferences 文件都是存放在/data/data/<package
name>/shared_prefs/目录下的。第二个参数用于指定操作模式,主要有两种模式可以选
择,MODE_PRIVATE 和 MODE_MULTI_PROCESS。MODE_PRIVATE 仍然是默认的操
作模式,和直接传入 0 效果是相同的,表示只有当前的应用程序才可以对这个
SharedPreferences文件进行读写。MODE_MULTI_PROCESS则一般是用于会有多个进程中
对同一个 SharedPreferences文件进行读写的情况。类似地,MODE_WORLD_READABLE
和 MODE_WORLD_WRITEABLE 这两种模式已在 Android 4.2 版本中被废弃。
2. Activity 类中的 getPreferences()方法
这个方法和 Context 中的 getSharedPreferences()方法很相似,不过它只接收一个操
作模式参数,因为使用这个方法时会自动将当前活动的类名作为 SharedPreferences的文
件名。
3. PreferenceManager 类中的 getDefaultSharedPreferences()方法
这是一个静态方法,它接收一个 Context 参数,并自动使用当前应用程序的包名作
为前缀来命名 SharedPreferences 文件。
得到了 SharedPreferences对象之后,就可以开始向 SharedPreferences文件中存储数据了,
主要可以分为三步实现。
1. 调用 SharedPreferences 对象的 edit()方法来获取一个 SharedPreferences.Editor 对象。
2. 向 SharedPreferences.Editor 对象中添加数据,比如添加一个布尔型数据就使用
putBoolean 方法,添加一个字符串则使用 putString()方法,以此类推。
3. 调用 commit()方法将添加的数据提交,从而完成数据存储操作。
常用的api 根据key去xml文件中获取对应的值 String username = sharedPreferences.getString("USER_NAME", ""); 1.获得所有的数据 //获取所有的数据 Map<String, ?> all = sharedPreferences.getAll(); for(Entry<String, ?> data : all.entrySet()){ data.getVaiues() 2.//判断xml中是否有该key sharedPreferences.contains(key) 3.//根据key移除对应的数据 edit.remove(key)
对于第一种openFileOutput()以文件的方式存储:
1.Context.MODE_APPEND;//内容追加模式。只适用于openFileOutput方式,这样就不会覆盖文件里之前的内容
2.Context.MODE_PRIVATE;//默认操作模式。在该模式下,文件作为私有数据,只能被该应用程序本身访问。并且,在该模式下,写入的内容会覆盖原文件的内容.
3.Context.MODE_WORLD_READABLE;//可读模式。在该模式下,别的应用程序可以读取该文件内容。
4.Context.MODE_WORLD_WRITEABLE;//可写模式。在该模式下,别的应用程序可以将内容写入该文件。
对于SharedPreferences方式存数据(xml键值对的形式)
1.Context.MODE_PRIVATE:与上面不同的是不会覆盖之前的内容,但是键相同就会覆盖
2.MODE_MULTI_PROCESS:用于会有多个进程中对同一个 SharedPreferences文件进行读写的情况,但是一般用ContentProvider方式
模式之间可以使用"+" 连接
注意:追加模式对SharedPreferences无效,并且MODE_PRIVATE模式下不会覆盖该文件原内容,键相同才会覆盖
但是,对于以文本方式存储的openFileOutput方式,MODE_PRIVATE模式会覆盖该文件之前的内容,
文件不存在就会创建,如果想追加内容就需要MODE_APPEND模式
第三种方法:SQList
create table Book ( 创建数据的语句,id为主键自动增长
id integer primary key autoincrement,
author text, //表示浮点型
price real,
pages integer,
name text)
4.外部存储(跟第一种方法类似,不过这个可以自己用IO流随便存和取,需要权限)
需要的权限:
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 文件的创建和删除权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 文件里面的写的权限
特点: 1.当我们设计一个程序时.程序里面的文件想其他app也可以使用,使用外部存储
2.通常存储在sd卡
3.当外部设备正常挂载上,并且有一定的空间的时候才能使用
4.外部存储,android将外部存储划分为私有部分和公有部分,私有部分的文件,会随着程序的卸载而删除
使用事务:事务的特性可以保证让某一系列的操作要么全部完成,要么一个都不会完成。
比如你正在进行一次转账操作,银行会将转账的金额先从你的账户中扣除,然后再向收
款方的账户中添加等量的金额。看上去好像没什么问题吧?可是,如果当你账户中的金额刚
刚被扣除,这时由于一些异常原因导致对方收款失败,这一部分钱就凭空消失了!当然银行
肯定已经充分考虑到了这种情况,它会保证扣钱和收款的操作要么一起成功,要么都不会成
功,而使用的技术当然就是事务了。如下代码:只有事务执行成功表格的数据才会变化
Button but= (Button) findViewById(R.id.replace_data); but.setOnClickListener(new OnClickListener() { public void onClick(View v) { SQLiteDatabase db = dbHelper.getWritableDatabase(); db.beginTransaction(); // 开启事务 try { db.delete("Book", null, null); if (true) { throw new NullPointerException();//在这里手动抛出一个异常,让事务失败 } ContentValues values = new ContentValues(); values.put("name", "Game of Thrones"); values.put("author", "George Martin"); values.put("pages", 720); values.put("price", 20.85); db.insert("Book", null, values); db.setTransactionSuccessful(); //事务已经执行成功 } catch (Exception e) { e.printStackTrace(); } finally { db.endTransaction(); //结束事务 } });
例子:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button but=(Button) findViewById(R.id.but); Button but2=(Button) findViewById(R.id.but2); Button but3=(Button) findViewById(R.id.but3); Button but_r=(Button) findViewById(R.id.but_read); but.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String start = Environment.getExternalStorageState(); if(!Environment.MEDIA_MOUNTED.equals(start)){ System.out.println("没有安装SDcard"); return; } System.out.println("文件路径:"+getFilesDir());//内存卡路径 try { FileOutputStream os = openFileOutput("data", MODE_PRIVATE); os.write("存放数据".getBytes());//文件名(不可以包含路径),文件的操作模式 os.close(); } catch (Exception e) { e.printStackTrace(); } } }); but_r.setOnClickListener(new OnClickListener() { public void onClick(View v) { try { FileInputStream is = openFileInput("data");//打开默认位置 byte[] arr=new byte[1024]; int len=is.read(arr); System.out.println("读取的数据:"+new String(arr,0,len)); } catch (Exception e) { e.printStackTrace(); } } }); but2.setOnClickListener(new OnClickListener() {//SharedPreferences public void onClick(View v) { SharedPreferences shared= getSharedPreferences("data2", MODE_PRIVATE); Editor edit = shared.edit();//获得写入数据对象 edit.putString("数据键", "数据的值"); edit.commit();//提交 } }); but3.setOnClickListener(new OnClickListener() {//SharedPreferences public void onClick(View v) { SharedPreferences shared= getSharedPreferences("data2", MODE_PRIVATE); String value= shared.getString("数据键", "默认"); System.out.println("数据为:"+value); } }); } }