微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sqlite应用2

Android Studio sqlite数据库应用(二)

版本 Android Studio 1.5.1

事务处理
升级数据库的最佳写法

哈哈刚刚写完 sqlite数据库应用(一),接着把后面的写完吧;

事务处理

所谓事务处理就是,保证在完成一系列操作的时候,要么全部完成要么一个都完成不了。我还用之前的代码作为案例;现在我要把Book表中的数据都删掉,让后写入新的数据;如果在这个操作过程中出现了异常,那么表中的数据还是原先的,一切都回到事务开始之前。(具体看程序中的注释)

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
Button replaceData = (Button) findViewById(R.id.replace_data); replaceData.setonClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sqliteDatabase db = dbHelper.getWritableDatabase(); //开启一个事务 db.beginTransaction(); try { db.delete("Book",null,136)">null); //这边手动抛出一个异常(NullPointerException()) //这样之后添加新的数据是执行不到的,由于中途出现了异常导致事务的失败,那么旧的数据也是删不掉的,可以看下面的图片 if (true){ throw new NullPointerException(); } ContentValues values = new ContentValues(); values.put("name","Game of Thrones"); values.put("author",0)">"Katty"); values.put("pages",720); values.put("price",102)">60); db.insert(//事务执行成功 db.setTransactionSuccessful(); }catch (Exception e){ e.printstacktrace(); }finally { //结束事务 db.endTransaction(); } } });

当有异常时显示的还是上一篇Book表中的数据

取消异常后,原表中的数据都被删除,写入新的数据

事务操作的好处就在我们完成一系列操作的时候,防止因为异常的发生导致数据的丢失。就好比你支付宝转账给你盆友,结果中途出现了异常导致,你的支付宝的钱是被扣了,但是你盆友的支付宝了金额并没有增加,那岂不是很DT。哈哈。

升级数据库的最佳写法

之前一篇中数据升级是在onUpgrade()方法中删掉当前所有的表,然后强制执行onCreate()方法,实现数据库升级
我们都知道只要指定数据库的版本号比当前的数据库版本号高的时候就会进入到onUpgrade()中,这我先在onUpgrade()中先判断当前数据库的版本号,再执行相应的改变操作。

首先第一个版本(就是之前创建的两个表):
先将虚拟机上的APP删除

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • public class MainActivity extends AppCompatActivity { private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //版本1 dbHelper = new MyDatabaseHelper(this,0)">"BookStore.db",102)">1); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setonClickListener(void onClick(View v) { dbHelper.getWritableDatabase(); } });
      
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • MyDatabaseHelper sqliteOpenHelper { static final String CREATE_BOOK = "create table Book(" + //primary key 将id列设为主键 autoincrement表示id列是自增长的 "id integer primary key autoincrement," + "author text,0)">"price real,0)">"pages integer,0)">"name text)"; final String CREATE_CATEGORY = "create table Category (" + "category_name text,0)">"category_code integer)"; private Context mContext; //构造方法:第一个参数Context,第二个参数数据库名, // 第三个参数cursor允许我们在查询数据的时候返回一个自定义的光标位置, // 一般传入的都是null,第四个参数表示目前库的版本号(用于对库进行升级 public MyDatabaseHelper(Context context,String name,sqliteDatabase.CursorFactory factory,136)">int version){ super(context,name,factory,version); mContext = context; } void onCreate(sqliteDatabase db) { //调用sqliteDatabase中的execsql()执行建表语句。 db.execsql(CREATE_BOOK); db.execsql(CREATE_CATEGORY); Toast.makeText(mContext,0)">"Create succeeded",Toast.LENGTH_SHORT).show(); } void onUpgrade(sqliteDatabase db,136)">int oldVersion,136)">int newVersion) { } }

    好第一个版本安装完成后 按一下create database 数据库创建成功,然后按 add data添加数据。在数据库中的结果如下:

    好,现在已经在表中添加内容,接下来APP更新了,要在数据库中加入新的表。升级数据库版本 为2

      
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • //版本2 dbHelper = 2); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setonClickListener(void onClick(View v) { dbHelper.getWritableDatabase(); } });

    更改MyDatabaseHelper代码如下

      
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • "name text)"; "category_code integer)"; //创建Picture表 final String CREATE_PICTURE = "create table Picture(" + "name text,0)">"price real)"; //调用sqliteDatabase中的execsql()执行建表语句。 db.execsql(CREATE_BOOK); db.execsql(CREATE_CATEGORY); db.execsql(CREATE_PICTURE); Toast.makeText(mContext,136)">int newVersion) { //判断当前版本号。如果当前版本号是1,则只执行创建picture表的操作。 //如果之前没有安装过,则执行onCreate()中创建三个表的操作 switch(oldVersion){ case 1: db.execsql(CREATE_PICTURE); default: } } }

    好现在安装到虚拟机上测试,结果如下:

    可以看到现在数据库中已有三个表。查看之前Book表中的数据也没有丢失。完成了一次完美的升级

    好接下来继续更新第三个版本 让Book表和Category表之间建立联系。我们可以在Book表中添加一个category_id 的字段,然后我们修改MyDatabaseHelper中的代码如下:

      
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • "category_id integer)"; //调用sqliteDatabase中的execsql()执行建表语句。 db.execsql(CREATE_BOOK); db.execsql(CREATE_CATEGORY); db.execsql(CREATE_PICTURE); Toast.makeText(mContext,136)">int newVersion) { 1: db.execsql(CREATE_PICTURE); 2: //执行alter命令在Book表新增一个category_id 列 db.execsql("alter table Book add column category_id integer"); 记得改完之后要在MainActivity 中将数据库的版本改为3。
    好,看一下结果:

    原文地址:https://www.jb51.cc/sqlite/198567.html

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

    相关推荐