這幾天又看了點《代碼大全2》,想着這東西要運用一下啊,於是結合作者軟件構建的思維加Android的技術來練練手唄~雖然說系統有大有小,大系統大架構大考慮,小系統不需考慮那麼多。
開發過程中遇到了各種問題,看書時覺得挺簡單的東西,寫起來就會出各種bug,開發工具又不是太會用,解決個問題要費老大的勁啊,真是抓狂!做完了現在記錄下下~有的問題解決了,有的問題還是不知道怎麼回事……(′д` )…彡…彡
按照軟件開發過程,開始前的準備工作三部曲:問題定義、需求分析、軟件架構。
一、問題定義
從客戶的角度來看問題,用客戶的語言來描述問題:開發一個個人密碼管理工具
二、需求分析
通過口令(密碼)進入密碼本;
可以新增賬號,保存到數據庫;
可以查看全部賬號密碼信息,全部展示出來,就在一個頁面,類似記事本;
可以修改賬號信息,CRUD(增刪改查);
安全:暫時不做要求
三、系統架構
- 程序組織:密碼本是用來管理賬戶密碼的(這就是概述) 構造快:界面、數據庫操作、業務邏輯……只能想到這三個~(@_@;) 通信規則:Activity調用xml顯示界面,調用DB類操作數據庫;外部通信:暫時作爲本地服務,不與其他應用交互
- 主要類:MainActivity:登錄界面;ChooseOperationActivity:操作選擇;AddActivity:新增;DisplayAllActivity:查看全部信息;MyDataBaseHelper:數據庫操作
- 數據庫設計:一張表:secretbook;字段:id、site、account、password、note
- 界面設計:見需求分析,Login——》Select——》Edit——》ViewAll
- 安全性:暫時不考慮安全性能,因爲對SQLite數據庫不瞭解,對Android系統管理文件的情況也不清楚,也不知道加密規則
- 可擴展性:要考慮以後會增加到多張表,增加新功能
- 可行性:100%,完全是個人實踐之作,項目很小,就不多花時間準備了,第一次做,肯定會遇到問題,那就邊做邊解決問題吧
- ……不多說了,動手吧!<( ̄︶ ̄)>
package com.thsware.secretbook; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.widget.Toast; /** * Created by 世祥 on 2015/9/4. */ public class MyDataBaseHelper extends SQLiteOpenHelper { private static final String CREATE_SECRETBOOK="create table secretbook(" +"id integer primary key autoincrement," +"site text," +"account text," +"password text," +"note text," +"deleteFlag integer" +")"; private Context mContext; public MyDataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); mContext=context; } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { sqLiteDatabase.execSQL(CREATE_SECRETBOOK); Toast.makeText(mContext,"secretbook數據表創建成功~",Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { switch (oldVersion){ case 1: sqLiteDatabase.execSQL("alter table secretbook add column deleteFlag integer"); default: } } }
package com.thsware.secretbook; import android.app.Activity; import java.util.ArrayList; import java.util.List; /** * Created by 世祥 on 2015/9/4. */ public class ActivityCollector { private static List<Activity> activities=new ArrayList<Activity>(); public static void addActivity(Activity activity){ activities.add(activity); } public static void removeActivity(Activity activity){ activities.remove(activity); } public static void finishAll(){ for (Activity ac : activities){ if (!ac.isFinishing()){ ac.finish(); } } } }
private MyDataBaseHelper dbHelper=new MyDataBaseHelper(AddActivity.this, DATABASE_NAME, null, 2); private SQLiteDatabase db= dbHelper.getWritableDatabase();我還是不知道爲什麼,我想可能是startActivity(intent)出的問題吧,也可能是類加載的機制問題,看來我又忘了Java類加載的機制問題了吧~要找時間將沒看完的《Thinking in Java》再好好學學了,,當時還明明白白的,現在好久沒弄就忘了,,,,衰( ⊙ o ⊙ )啊!
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add); ActivityCollector.addActivity(this); siteEdit= (EditText) findViewById(R.id.site); accountEdit= (EditText) findViewById(R.id.account); passwordEdit= (EditText) findViewById(R.id.password); noteEdit= (EditText) findViewById(R.id.note); saveButton= (Button) findViewById(R.id.save_button); dbHelper=new MyDataBaseHelper(AddActivity.this, DATABASE_NAME, null, 2); db = dbHelper.getWritableDatabase(); Intent intent=getIntent(); //未檢測intent是否爲空,此處id無數據時爲null id=intent.getStringExtra("id"); if (id!=null && !id.equals("")){ Cursor cursor=db.query(SECRETBOOK_TABLE, null, "id=?", new String[]{id}, null, null, null); if (cursor.moveToFirst()){ String site=cursor.getString(cursor.getColumnIndex("site")); String account=cursor.getString(cursor.getColumnIndex("account")); String password=cursor.getString(cursor.getColumnIndex("password")); String note=cursor.getString(cursor.getColumnIndex("note")); siteEdit.setText(site); accountEdit.setText(account); passwordEdit.setText(password); noteEdit.setText(note); } } //保存數據 saveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String site = siteEdit.getText().toString().trim(); if (site.equals("")) { Toast.makeText(AddActivity.this, R.string.sitename + "必須填寫", Toast.LENGTH_SHORT).show(); return; } ContentValues values = new ContentValues(); values.put("site", site); values.put("account", accountEdit.getText().toString()); values.put("password", passwordEdit.getText().toString()); values.put("note", noteEdit.getText().toString()); //如果id爲空,則是新增數據 if (id==null || id.equals("")){ values.put("deleteFlag", 0); db.insert(SECRETBOOK_TABLE, null, values); }else{ db.update(SECRETBOOK_TABLE,values,"id=?",new String[]{id}); } //未做判斷,就提示成功了 Toast.makeText(AddActivity.this, "保存成功!", Toast.LENGTH_SHORT).show(); } }); }肯定是不好的,但是目前我也只能寫成這樣了,以後再慢慢優化吧!