Android 銀行轉賬(事務)
阿新 • • 發佈:2019-02-18
package com.example.a22_bank_transfer; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private MyOpenHelper myOpenHelper; // private List<Person> lists; // private ListView lv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // lists = new ArrayList<>(); // lv = (ListView) findViewById(R.id.lv); myOpenHelper = new MyOpenHelper(getApplicationContext()); } //點選按鈕進行轉賬的邏輯 public void click(View v) { SQLiteDatabase db = myOpenHelper.getReadableDatabase(); //使用事務進行轉賬 db.beginTransaction(); // 開啟事務 try { //實現轉賬的邏輯,實際上就是寫SQL語句 db.execSQL("update info set money = money - 100 where name = ?", new Object[]{"張三"}); // int i = 10 / 0; db.execSQL("update info set money = money + 100 where name = ?", new Object[]{"李四"}); //給當前事務設定一個成功的標記 db.setTransactionSuccessful(); } catch (Exception e) { Toast.makeText(getApplicationContext(), "伺服器忙,請稍後再轉", Toast.LENGTH_SHORT).show(); } finally { db.endTransaction(); //關閉事務 } } /*關於setTransactionSuccessful()和endTransaction() * setTransactionSuccessful()給事務一個成功的標記, * 如果在執行endTransaction()之前都沒有遇到成功標記,那麼所有事務都會回滾。 * 如果只有成功標記而沒有endTransaction(),就不知道在哪裡結束。 * 有時候事務涉及到多執行緒問題,主執行緒在執行到endTransaction的時候子執行緒還沒執行完, * 所以setTransactionSuccessful()和endTransaction()缺一不可。 * * 在setTransactionSuccessful()和endTransaction()絕對不能寫資料庫邏輯,儘量避免寫其他邏輯。 * If any errors are encountered between this and endTransaction the transaction will still be committed. * 因為無論任何錯誤發生在這兩個函式之間,事務都會提交。 * */ /** * 以下為個人測試程式碼 */ //點選按鈕進行查詢的邏輯 // public void click2(View v) { // SQLiteDatabase db = myOpenHelper.getReadableDatabase(); // Cursor cursor = db.query("info", null, null, null, null, null, null); // // if (cursor != null && cursor.getCount()>0) { // while (cursor.moveToNext()) { // String name = cursor.getString(1); // String money = cursor.getString(3); // Person person = new Person(); // person.setName(name); // person.setMoney(money); // lists.add(person); // } // lv.setAdapter(new MyAdapter()); // } // } //定義listview的介面卡 // private class MyAdapter extends BaseAdapter { // // @Override // public int getCount() { // return lists.size(); // } // // @Override // public Object getItem(int position) { // return null; // } // // @Override // public long getItemId(int position) { // return 0; // } // // @Override // public View getView(int position, View convertView, ViewGroup parent) { // View view; // if (convertView == null) { // //建立新的view物件 inflate打氣筒 // view = View.inflate(getApplicationContext(), R.layout.item, null); // } else { // view = convertView; // } // // //找到控制元件來載入資料 // TextView tv_name = (TextView) view.findViewById(R.id.tv_name); // TextView tv_money = (TextView) view.findViewById(R.id.tv_money); // // Person person =lists.get(position); // tv_name.setText(person.getName()); // tv_money.setText(person.getMoney()); // return view; // } // } }