android項目 之 記事本(11),android項目
本文是自己學習所做筆記,歡迎轉載,但請註明出處:http://blog.csdn.net/jesson20121020
通過之前的10節,已實現了記事本的大部分功能,有添加拍照,添加照片,添加錄音,添加繪圖,添加手寫,另外細心的可以發現,底部菜單還有一個更多的選項,這個以後再實現,用於擴充記事本的功能。
這節就來為我們的記事本添加資料庫支援,這樣,就可以在添加記事後將其儲存在資料庫中,方便下次瀏覽,修改,刪除等。
先看:
三張圖片分別示範了儲存記事,查看記事,刪除記事。
對於資料庫而言,無非就是涉及到資料庫的建立,增刪改查。
為了將資料庫的操作封裝起來,單獨寫了一個類,如下:
資料庫操作
DatabaseOperation.java
import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.widget.Toast;public class DatabaseOperation {private SQLiteDatabase db;private Context context;public DatabaseOperation(Context context,SQLiteDatabase db) {this.db = db;this.context = context;} //資料庫的開啟或建立 public void create_db(){ //建立或開啟資料庫 db = SQLiteDatabase.openOrCreateDatabase(context.getFilesDir().toString()+"/mynotes.db3", null); db.execSQL("DROP TABLE IF EXISTS studentScore"); if(db == null){ Toast.makeText(context,"資料庫建立不成功",Toast.LENGTH_LONG).show(); } //Toast.makeText(context,"資料庫建立成功",Toast.LENGTH_LONG).show(); //建立表 db.execSQL("create table if not exists notes(_id integer primary key autoincrement," + "title text," + "context text," + "time varchar(20))"); } public void insert_db(String title,String text,String time){ if(text.isEmpty()){ Toast.makeText(context, "各欄位不可為空", Toast.LENGTH_LONG).show(); } else{ db.execSQL("insert into notes(title,context,time) values('"+ title+"','"+ text+ "','"+time+"');"); //Toast.makeText(context, "插入成功", Toast.LENGTH_LONG).show(); } } public void update_db(String title,String text,String time,int item_ID){ if( text.isEmpty()){ Toast.makeText(context, "各欄位不可為空", Toast.LENGTH_LONG).show(); } else{ //String sql = "update main set class1='" + class1 + "',class2='" + class2 + "',class3='" + class4 + "',class4='" + class4 + "'where days='" + days + "';"; db.execSQL("update notes set context='"+text+ "',title='"+title+"',time='"+time+"'where _id='" + item_ID+"'"); //Toast.makeText(context, "修改成功", Toast.LENGTH_LONG).show(); } } public Cursor query_db(){ Cursor cursor = db.rawQuery("select * from notes",null); return cursor; } public Cursor query_db(int item_ID){ Cursor cursor = db.rawQuery("select * from notes where _id='"+item_ID+"';",null); return cursor; } public void delete_db(int item_ID){ db.execSQL("delete from notes where _id='" + item_ID+"'"); //Toast.makeText(context, "刪除成功", Toast.LENGTH_LONG).show(); } //關閉資料庫 public void close_db(){ db.close(); }} 有了這些資料庫的相關操作,下面就開始實現儲存記事,修改記事,刪除記事,查詢記事的功能。
儲存記事
當編輯好一個記事時,這時點擊頂部的儲存按鈕,就將所寫的記事插入到資料庫中,當然了,如果記事裡面有圖片,錄音等,並沒有圖片,錄音本身儲存到資料庫,而是將其所在路徑儲存在資料庫中,等到再次查看時,再從資料庫中讀取,並根據所儲存的路徑取出源檔案。
儲存記事的思想就是取出EditText中的內容,並從中截取前一部分作為該記事的標題,以及同時也儲存了添加記事的時間。
主要代碼為:
//取得EditText中的內容String context = et_Notes.getText().toString();if(context.isEmpty()){Toast.makeText(AddActivity.this, "記事為空白!", Toast.LENGTH_LONG).show();}else{//取得目前時間SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd HH:mm"); Date curDate = new Date(System.currentTimeMillis());//擷取目前時間 String time = formatter.format(curDate);//截取EditText中的前一部分作為標題,用於顯示在首頁列表中String title = getTitle(context);//開啟資料庫dop.create_db();//判斷是更新還是新增記事if(editModel.equals("newAdd")){//將記事插入到資料庫中dop.insert_db(title,context,time);}//如果是編輯則更新記事即可else if(editModel.equals("update")){dop.update_db(title,context,time,item_Id);}dop.close_db();//結束當前activityAddActivity.this.finish();} 其中, getTitle()函數就是為了截取記事本文的前15字作為該記事的標題;editModel表示當前是新增記事還是修改記事。getTitle()如下:
//截取EditText中的前一部分作為標題,用於顯示在首頁列表中private String getTitle(String context){ //定義Regex,用於匹配路徑 Pattern p=Pattern.compile("/([^\\.]*)\\.\\w{3}"); Matcher m=p.matcher(context); StringBuffer strBuff = new StringBuffer(); String title = ""; int startIndex = 0; while(m.find()){ //取出路徑前的文字 if(m.start() > 0){ strBuff.append(context.substring(startIndex, m.start())); } //取出路徑 String path = m.group().toString(); //取出路徑的尾碼 String type = path.substring(path.length() - 3, path.length()); //判斷附件的類型 if(type.equals("amr")){ strBuff.append("[錄音]"); } else{ strBuff.append("[圖片]"); } startIndex = m.end(); //只取出前15個字作為標題 if(strBuff.length() > 15){ //統一將斷行符號,等特殊字元換成空格 title = strBuff.toString().replaceAll("\r|\n|\t", " "); return title; } } strBuff.append(context.substring(startIndex, context.length())); //統一將斷行符號,等特殊字元換成空格 title = strBuff.toString().replaceAll("\r|\n|\t", " "); return title;} 這裡主要是用到了Regex,用於匹配是普通文字還是圖片錄音等,如果是圖片錄音,則在標題中顯然圖片錄音文字即可,這裡還用到了一個技巧,就是return 的上一句,目的就是為了將標題中的斷行符號等特殊字元統一換成空格。
瀏覽(修改)記事
在儲存了記事後,當然就要從資料庫取出,並以原來的格式顯示給使用者。設想一下,在新增了記事後,返回首頁或者重新進入首頁,就應該看到當前已儲存的記事列表,所以在首頁的Activity中應該放置一個列表(ListView)用於顯示從資料庫中取出的資料。當點擊列表的項目時,就應該開啟查看該記事的詳細內容了。
因為在儲存記事時已經截取了一部分作為標題,所以在首頁記事列表上只顯示標題,時間,而不顯然詳細內容。主要代碼下:
private SQLiteDatabase db;private DatabaseOperation dop;private ListView lv_notes;......//資料庫操作dop = new DatabaseOperation(this, db);lv_notes = (ListView)findViewById(R.id.lv_notes);//顯示記事列表 showNotesList();//為記事列表添加監聽器lv_notes.setOnItemClickListener(new ItemClickEvent());
其中,showNotesList()就是用來顯然記事列表的,如下:
//顯示記事列表 private void showNotesList(){ //建立或開啟資料庫 dop.create_db(); Cursor cursor = dop.query_db(); SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.note_item, cursor, new String[]{"_id","title","time"}, new int[]{R.id.tv_note_id,R.id.tv_note_title,R.id.tv_note_time}); lv_notes.setAdapter(adapter); dop.close_db(); }
上面只實現了瀏覽記事列表的功能,那麼點擊清單項目,自然就是查看或修改記事的詳細內容了,所以為列表添加單擊事件,並在其監聽器中實現從資料庫讀取相應的記事內容,並顯示,如下:
//記事列表單擊監聽器 class ItemClickEvent implements OnItemClickListener{@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {tv_note_id = (TextView)view.findViewById(R.id.tv_note_id);int item_id = Integer.parseInt(tv_note_id.getText().toString());Intent intent = new Intent(MainActivity.this,AddActivity.class);intent.putExtra("editModel", "update");intent.putExtra("noteId", item_id);startActivity(intent);} } 這樣,當單擊一個清單項目時,就會新開啟一個activity,用於顯示記事的詳細內容,這裡依然用的是新增記事Activity,這樣做的好處就是在查看記事的同時,也可以修改,這也是大多數記事軟體所採用的方法,而且,也能過intent將一些資訊傳遞給AddActivity,其中editModel是編輯模式,因為這裡是查看或者修改,所以當再次點擊儲存時,就更新原有的記事即可,並不是又新增加一條記事;noteId是為了讓AddActivity知道該讀取資料庫的中那一條資料。相應的,要在AddActivity裡添加代碼取出資料並顯示,主要代碼如下:
//載入資料private void loadData(){//如果是新增記事模式,則將editText清空if(editModel.equals("newAdd")){et_Notes.setText("");}//如果編輯的是已存在的記事,則將資料庫的儲存的資料取出,並顯示在EditText中else if(editModel.equals("update")){tv_title.setText("編輯記事");dop.create_db();Cursor cursor = dop.query_db(item_Id);cursor.moveToFirst();//取出資料庫中相應的欄位內容String context = cursor.getString(cursor.getColumnIndex("context"));//定義Regex,用於匹配路徑 Pattern p=Pattern.compile("/([^\\.]*)\\.\\w{3}"); Matcher m=p.matcher(context); int startIndex = 0; while(m.find()){ //取出路徑前的文字 if(m.start() > 0){ et_Notes.append(context.substring(startIndex, m.start())); } SpannableString ss = new SpannableString(m.group().toString()); //取出路徑 String path = m.group().toString(); //取出路徑的尾碼 String type = path.substring(path.length() - 3, path.length()); Bitmap bm = null; Bitmap rbm = null; //判斷附件的類型,如果是錄音檔案,則從資源檔中載入圖片 if(type.equals("amr")){ bm = BitmapFactory.decodeResource(getResources(), R.drawable.record_icon); //縮放圖片 rbm = resize(bm,200); } else{ //取出圖片 bm = BitmapFactory.decodeFile(m.group()); //縮放圖片 rbm = resize(bm,480); } //為圖片添加邊框效果 rbm = getBitmapHuaSeBianKuang(rbm); System.out.println(rbm.getWidth()+"-------"+rbm.getHeight()); ImageSpan span = new ImageSpan(this, rbm); ss.setSpan(span,0, m.end() - m.start(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); et_Notes.append(ss); startIndex = m.end(); } //將最後一個圖片之後的文字添加在TextView中 et_Notes.append(context.substring(startIndex,context.length()));dop.close_db();}} 這裡同樣是用到了Regex,因為要識別路徑。通過這個方法,在每次開啟AddActivity時調用該方法,即能適用於新增記事,也可以用於修改記事。
刪除記事
刪除記事的實現還是在首頁Activity中實現,當長按清單項目時,彈出操作選擇,共有兩個,一個是編輯,一個是刪除,這裡的編輯是和單擊清單項目的查看記事的功能一樣,主要是刪除,當選中了刪除時,就將相應的記事條目從資料庫中刪除,並重新整理列表。主要代碼如下:
......//為記事列表添加長按事件lv_notes.setOnItemLongClickListener(new ItemLongClickEvent());...... //記事列表長按監聽器 class ItemLongClickEvent implements OnItemLongClickListener{@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) {tv_note_id = (TextView)view.findViewById(R.id.tv_note_id);int item_id = Integer.parseInt(tv_note_id.getText().toString());simpleList(item_id);return true;} } //簡單列表對話方塊,用於選擇操作 public void simpleList(final int item_id){AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this,R.style.custom_dialog);alertDialogBuilder.setTitle("選擇操作");alertDialogBuilder.setIcon(R.drawable.ic_launcher);alertDialogBuilder.setItems(R.array.itemOperation, new android.content.DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {switch(which){//編輯case 0 :Intent intent = new Intent(MainActivity.this,AddActivity.class);intent.putExtra("editModel", "update");intent.putExtra("noteId", item_id);startActivity(intent);break;//刪除case 1 :dop.create_db();dop.delete_db(item_id);dop.close_db();//重新整理列表顯示lv_notes.invalidate();showNotesList();break;}}});alertDialogBuilder.create();alertDialogBuilder.show();}
以上,就實現了記事的儲存,修改,刪除的功能,到此,記事本的功能已基本完成,剩下的就是後續的完善與最佳化,以及新增功能了。
誰會做安卓的記事本程式項目 跪 我們上Android課程 要期末做個安卓的記事本程式項目 幫幫忙
Android記事本程式源碼
blog.csdn.net/...096216
安卓記事本,安卓記事本軟體
安卓手機記事本軟體有很多,究竟哪款樓主比較喜歡就要自己使用一下了。我瞭解的比較好用的記事本軟體有幾款,推薦給樓主。
一些軟體可以再【安卓園】下載,只要輸入記事本,就可以找到。
【手寫記事本】
手寫記事本 HandCalendar是一款支援手寫功能的記事本、備忘錄、日記本,同時支援將記下來的內容儲存到日曆中。軟體的手寫功能還算比較強大的,支援10種顏色和3種不同鋼筆筆型,而且還支援最多三次的橡皮擦撤銷功能。
【AK Notepad記事本】
AK notepad是一款功能強大的文字文件編輯軟體。軟體除了支援文檔編輯、讀寫,TXT文檔查看功能之外,還可以通過簡訊、電子郵件和手機鬧鈴來與別人分享需要注意的事件提醒。
【隨手寫】
隨手寫絕對是最方便的便簽軟體、獨創智能縮放。支援手寫(原筆跡)和鍵盤混合輸入。功能特色:1、小螢幕也可以記大事情,獨創手寫鍵盤混輸模式
2、任務管理,便簽,日曆,鬧鐘,多媒體訊息,排程3、在照片上自由塗鴉,插圖,拍照記事和語音記事4、widget直讀當前記事。