第一行代码-6.5 SQLite数据库的最佳实践
来源:互联网 发布:lte网络优化仿真 编辑:程序博客网 时间:2024/05/16 23:06
1、事务使用
首先说明一下SQLite支持的技术:事务的作用。比如银行,现在我要转账给别人,那么有两个过程:自己账户扣钱、对方账户加钱。如果这两步是分开执行的,而且中间出现错误,就会导致自己的钱凭空消失。所以这两步必须同时执行才能保证安全性。
现在在DatabaseTest上测试事务的使用:比如现在数据库的内容太旧了,需要换成新的,就需要执行delete和insert操作,而且要同时执行。方法是通过database.beginTransaction()开启事务,然后再执行这两个操作。
mBReplace = (Button) findViewById(R.id.replace_button);mBReplace.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { SQLiteDatabase db = dbHelper.getWritableDatabase(); db.beginTransaction(); // 开始事务 try { db.delete(MyDatabaseHelper.TABLE_NAME, null, null); if (true) throw new NullPointerException(); // 手动抛出异常,让事务执行失败 ContentValues values = new ContentValues(); values.put("no", "30"); values.put("name", "kuritian"); values.put("number", "11111"); db.insert(MyDatabaseHelper.TABLE_NAME, null, values); db.setTransactionSuccessful(); // 事务已经执行成功 } catch (Exception e) {e.printStackTrace();} finally { db.endTransaction(); // 结束事务 } }});
手动抛出异常之后,再查询数据,可以发现数据并没有被删除掉。如果把那行代码删除掉,就可以实现数据替换了。
2、升级数据库的最佳写法
之前我们写的升级数据库的方法比较简单粗暴:在onUpgrade方法中,先删除掉所有的表,然后强行执行onCreate方法。这样会导致原来数据库的内容全部丢失。这个问题可以通过修改onUpgrade,增加switch-case语句来解决。
第一步:增加一张表,名为subject
// MyDatabaseHelper.javaprivate static final String CREATE_SUBJECT = "create table subject(id integer primary key autoincrement, " + "name text)";@Overridepublic void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_DB); db.execSQL(CREATE_SUBJECT); Toast.makeText(mContext, "创建数据库成功!", Toast.LENGTH_LONG).show();}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion) { case 1: db.execSQL(CREATE_SUBJECT); default: }}
第二步:修改创建student表,增加一列
private static final String CREATE_DB = "create table student(id integer primary key autoincrement, " + "no text, name text, number text, room text)";@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion) { case 1: db.execSQL(CREATE_SUBJECT); case 2: db.execSQL("alter table student add column room text"); default: }}
也就是对每一个版本的更新都执行不同的操作。
0 0
- 第一行代码-6.5 SQLite数据库的最佳实践
- 活动的最佳实践--第一行代码
- 第一行代码2.6-活动的最佳实践
- 第一行代码-3.7 编写界面的最佳实践
- 第一行代码-10.5 网络编程的最佳实践
- SQLite 数据库的最佳实践
- SQLite 数据库的最佳实践
- Android SQLite数据库 《第一行代码》
- 第一行代码-6.4 SQLite数据库存储
- 第一行代码-9.6 服务的最佳实践--后台执行的定时任务
- 第一行代码-5.5 广播的最佳实践 实现强制下线功能
- 第一行安卓代码——活动的最佳实践2.6
- 启动Activity的最佳写法--《第一行代码Android》
- Android Studio 活动的最佳实践 知晓当前是在哪一个活动 随时随地地进入程序 启动活动的最佳写法 第一行代码
- 《第一行代码》——(服务最佳实践)问题,解决,体会
- 《第一行代码》启动活动最佳写法
- 数据存储之SQLite 数据库存储——第一行代码Android学习笔记
- SQLite数据库学习笔记(《Android第一行代码》读书笔记1)
- 【Java】J2EE,启航
- C# 10进制和64进制相互转换
- 【Linux 优化篇】之 编译安装Mysql与管理
- Latex中IEEEtran中参考文献中斜体问题
- Xcode6: CocoaPods 错误 target overrides the `OTHER_LDFLAGS`...
- 第一行代码-6.5 SQLite数据库的最佳实践
- makefile.am
- 获取AppIdentifierPrefix
- Android/Linux USB HID驱动(即USB鼠标USB键盘等驱动)相关文件
- 获得spring容器中,实现某接口的所有实例;
- 中文输入法导致html input的onkeyup事件无法被触发,解决方法
- 如何上传代码到git上
- 150. Evaluate Reverse Polish Notation
- 基于jQuery的TreeGrid组件详解