日拱一卒(八)

1.文件存储

openFileOutput 和 openFileInput,其中openFileOutput 有两种模式MODE_PRIVATE(新写入的内容会覆盖先前的内容)、MODE_APPEND(新写入的内容追加到原有的内容);另外两种已经被废弃:MODE_WORLD_READABLE(表示当前文件可以被其他应用读取),MODE_WORLD_WRITEABLE(表示当前文件可以被其他应用写入

2.SharedPreferences:

存储用其内部类Editor操作

3.SQlite数据库:

  • SQLiteOpenHelper中getReadableDatabase()和getWritableDatabase()区别:当数据库不可写入的时候,getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。
  • 什么是事务?SQlite中如何使用事务?

事务是用来保证数据库操作的一系列操作都成功的机制,如果成功数据替换成新的,否则还原成原有的数据。

使用方式:主要三个方法

db.beginTransaction();-----------在需要开启事务的数据库一系列操作前面开启事务

db.setTransactionSuccessful();--------------在数据库一系列操作完成后标志事务成功

db.endTransaction(); ----------------标志事务结束:

public class MainActivity extends Activity {

	private MyDatabaseHelper dbHelper;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
		……
		Button replaceData = (Button) findViewById(R.id.replace_data);
		replaceData.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				SQLiteDatabase db = dbHelper.getWritableDatabase();
				<span style="color:#ff0000;">db.beginTransaction(); // 开启事务</span>
				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);
					<span style="color:#ff0000;">db.setTransactionSuccessful(); // 事务已经执行成功</span>
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					<span style="color:#ff0000;">db.endTransaction(); // 结束事务</span>
				}
			}
		});
	}

}

  • 如果数据库结构存在变动,数据库升级时如何避免先前的数据丢失?

主要是对onUpgrade方法的处理,不能简单粗暴的的删除所有表,在强制onCreate;不要删除先前的表,而是在先前的表上做修改或者添加的操作。






你可能感兴趣的:(android)