国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

sqlite應用2

2019-11-09 17:33:14
字體:
來源:轉載
供稿:網友

Android Studio SQLite數據庫應用(二)

版本 Android Studio 1.5.1

事務處理 升級數據庫的最佳寫法

哈哈剛剛寫完 SQLite數據庫應用(一),接著把后面的寫完吧;

事務處理

所謂事務處理就是,保證在完成一系列操作的時候,要么全部完成要么一個都完成不了。我還用之前的代碼作為案例;現在我要把Book表中的數據都刪掉,讓后寫入新的數據;如果在這個操作過程中出現了異常,那么表中的數據還是原先的,一切都回到事務開始之前。(具體看程序中的注釋)

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,null); //這邊手動拋出一個異常(NullPointerException()) //這樣之后添加新的數據是執行不到的,由于中途出現了異常導致事務的失敗,那么舊的數據也是刪不掉的,可以看下面的圖片。 if (true){ throw new NullPointerException(); } ContentValues values = new ContentValues(); values.put("name","Game of Thrones"); values.put("author","Katty"); values.put("pages",720); values.put("PRice",60); db.insert("Book", null, values); //事務執行成功 db.setTransactionSuccessful(); }catch (Exception e){ e.printStackTrace(); }finally { //結束事務 db.endTransaction(); } } });123456789101112131415161718192021222324252627282930

這里寫圖片描述

當有異常時顯示的還是上一篇Book表中的數據

這里寫圖片描述

取消異常后,原表中的數據都被刪除,寫入新的數據 這里寫圖片描述

事務操作的好處就在我們完成一系列操作的時候,防止因為異常的發生導致數據的丟失。就好比你支付寶轉賬給你盆友,結果中途出現了異常導致,你的支付寶的錢是被扣了,但是你盆友的支付寶了金額并沒有增加,那豈不是很DT。哈哈。

升級數據庫的最佳寫法

之前一篇中數據升級是在onUpgrade()方法中刪掉當前所有的表,然后強制執行onCreate()方法,實現數據庫升級。 我們都知道只要指定數據庫的版本號比當前的數據庫版本號高的時候就會進入到onUpgrade()中,這我先在onUpgrade()中先判斷當前數據庫的版本號,再執行相應的改變操作。

首先第一個版本(就是之前創建的兩個表): 先將虛擬機上的APP刪除掉

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,"BookStore.db",null,1); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dbHelper.getWritableDatabase(); } });123456789101112131415161718public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table Book(" + //primary key 將id列設為主鍵 autoincrement表示id列是自增長的 "id integer primary key autoincrement," + "author text," + "price real," + "pages integer," + "name text)"; public static final String CREATE_CATEGORY = "create table Category (" + "id integer primary key autoincrement," + "category_name text," + "category_code integer)"; private Context mContext; //構造方法:第一個參數Context,第二個參數數據庫名, // 第三個參數cursor允許我們在查詢數據的時候返回一個自定義的光標位置, // 一般傳入的都是null,第四個參數表示目前庫的版本號(用于對庫進行升級) public MyDatabaseHelper(Context context,String name,SQLiteDatabase.CursorFactory factory , int version){ super(context,name ,factory,version); mContext = context; } @Override public void onCreate(SQLiteDatabase db) { //調用SQLiteDatabase中的execSQL()執行建表語句。 db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY); Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}123456789101112131415161718192021222324252627282930313233343536373839

好第一個版本安裝完成后 按一下create database 數據庫創建成功,然后按 add data添加數據。在數據庫中的結果如下: 這里寫圖片描述

好,現在已經在表中添加了內容,接下來APP更新了,要在數據庫中加入新的表。升級數據庫版本 為2

public class MainActivity extends AppCompatActivity { private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //版本2 dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,2); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dbHelper.getWritableDatabase(); } });1234567891011121314151617

更改MyDatabaseHelper代碼如下

public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table Book(" + //primary key 將id列設為主鍵 autoincrement表示id列是自增長的 "id integer primary key autoincrement," + "author text," + "price real," + "pages integer," + "name text)"; public static final String CREATE_CATEGORY = "create table Category (" + "id integer primary key autoincrement," + "category_name text," + "category_code integer)";//創建Picture表 public static final String CREATE_PICTURE = "create table Picture(" + "id integer primary key autoincrement," + "name text," + "price real)"; private Context mContext; //構造方法:第一個參數Context,第二個參數數據庫名, // 第三個參數cursor允許我們在查詢數據的時候返回一個自定義的光標位置, // 一般傳入的都是null,第四個參數表示目前庫的版本號(用于對庫進行升級) public MyDatabaseHelper(Context context,String name,SQLiteDatabase.CursorFactory factory , int version){ super(context,name ,factory,version); mContext = context; } @Override public void onCreate(SQLiteDatabase db) { //調用SQLiteDatabase中的execSQL()執行建表語句。 db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY); db.execSQL(CREATE_PICTURE); Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //判斷當前版本號。如果當前版本號是1,則只執行創建picture表的操作。 //如果之前沒有安裝過,則執行onCreate()中創建三個表的操作 switch(oldVersion){ case 1: db.execSQL(CREATE_PICTURE); default: } }}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152

好現在安裝到虛擬機上測試,結果如下: 這里寫圖片描述 可以看到現在數據庫中已有三個表。查看之前Book表中的數據也沒有丟失。完成了一次完美的升級。

好接下來繼續更新第三個版本 讓Book表和Category表之間建立聯系。我們可以在Book表中添加一個category_id 的字段,然后我們修改MyDatabaseHelper中的代碼如下:

public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table Book(" + //primary key 將id列設為主鍵 autoincrement表示id列是自增長的 "id integer primary key autoincrement," + "author text," + "price real," + "pages integer," + "name text," + "category_id integer)"; public static final String CREATE_CATEGORY = "create table Category (" + "id integer primary key autoincrement," + "category_name text," + "category_code integer)"; public static final String CREATE_PICTURE = "create table Picture(" + "id integer primary key autoincrement," + "name text," + "price real)"; private Context mContext; //構造方法:第一個參數Context,第二個參數數據庫名, // 第三個參數cursor允許我們在查詢數據的時候返回一個自定義的光標位置, // 一般傳入的都是null,第四個參數表示目前庫的版本號(用于對庫進行升級) public MyDatabaseHelper(Context context,String name,SQLiteDatabase.CursorFactory factory , int version){ super(context,name ,factory,version); mContext = context; } @Override public void onCreate(SQLiteDatabase db) { //調用SQLiteDatabase中的execSQL()執行建表語句。 db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY); db.execSQL(CREATE_PICTURE); Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch(oldVersion){ case 1: db.execSQL(CREATE_PICTURE); case 2: //執行alter命令在Book表新增一個category_id 列 db.execSQL("alter table Book add column category_id integer"); default: } }}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253

記得改完之后要在MainActivity 中將數據庫的版本改為3。 好,看一下結果: 這里寫圖片描述


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 呼图壁县| 大足县| 柘城县| 安化县| 蕉岭县| 镇沅| 桂林市| 德保县| 永善县| 舞钢市| 尼玛县| 永兴县| 都昌县| 漳州市| 太仓市| 特克斯县| 石渠县| 云阳县| 青岛市| 衢州市| 项城市| 轮台县| 平舆县| 光泽县| 双江| 辰溪县| 乳山市| 静海县| 兴文县| 龙岩市| 汝城县| 彝良县| 沁水县| 河北省| 沧州市| 鄯善县| 梧州市| 吉安市| 蒲城县| 宝清县| 丰城市|