Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android項目 之 記事本(11) ----- 添加數據庫

android項目 之 記事本(11) ----- 添加數據庫

編輯:關於Android編程

 

通過之前的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+ ',set title='+title+',set 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(time,context,time,item_Id);
		}
		dop.close_db();
		//結束當前activity
		AddActivity.this.finish();
	}
其中, getTitle()函數就是為了截取記事正文的前15字作為該記事的標題;editModel表示當前是新增記事還是修改記事。getTitle()如下:

 

 

       //截取EditText中的前一部分作為標題,用於顯示在主頁列表中
	private String getTitle(String context){
	    //定義正則表達式,用於匹配路徑
	    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(
|
|	,  );
	        	return title;
	        }
	    }
	    strBuff.append(context.substring(startIndex, context.length()));
    	//統一將回車,等特殊字符換成空格
	    title = strBuff.toString().replaceAll(
|
|	,  );
        return title;
	}
這裡主要是用到了正則表達式,用於匹配是普通文字還是圖片錄音等,如果是圖片錄音,則在標題中顯然圖片錄音文字即可,這裡還用到了一個技巧,就是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{

		@Override
		public 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));
			
			//定義正則表達式,用於匹配路徑
		    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();
		}	
	}
    
這裡同樣是用到了正則表達式,因為要識別路徑。通過這個方法,在每次打開AddActivity時調用該方法,即能適用於新增記事,也可以用於修改記事。

 

刪除記事

刪除記事的實現還是在主頁Activity中實現,當長按列表項目時,彈出操作選擇,共有兩個,一個是編輯,一個是刪除,這裡的編輯是和單擊列表項的查看記事的功能一樣,主要是刪除,當選中了刪除時,就將相應的記事條目從數據庫中刪除,並刷新列表。主要代碼如下:

 

......

//為記事列表添加長按事件
lv_notes.setOnItemLongClickListener(new ItemLongClickEvent());
......

    //記事列表長按監聽器
    class ItemLongClickEvent implements OnItemLongClickListener{

		@Override
		public 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() {
			
			@Override
			public 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();
	}
    

以上,就實現了記事的保存,修改,刪除的功能,到此,記事本的功能已基本完成,剩下的就是後續的完善與優化,以及新增功能了。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved