DoctorNote医生处方笔记开发记录


DoctorNote医生处方笔记开发记录


1.开发背景
一个开诊所的中医朋友,希望我能给他开发一个记录病人姓名和处方的Android手机app,以便查询病人每次就诊信息,比如上一次的处方,以前他要找个病人上一次的就诊处方,几乎要翻遍一叠厚厚的处方纸张才能找到(他的门诊量还是很大的),非常麻烦。于是利用周末的两天时间开发了这款DoctorNote软件,软件截图如下:
         
DoctorNote开发过程用了很Android各个方面的知识点,比如ActionBar的使用、自定义ActionBar样式、SQLite的使用、AsyncTask的使用,SearchView的使用和SearchActivity的编写,以及AlertDialog的创建等。现总结如下:

2.项目的创建

项目的开发IDE是Eclipse,File->new->Android Application Project,项目的目录结构如下 图:

3.创建MainActivity
该类继承ListActivity实现OnItemLongClickListener接口,是程序的主界面,主要按姓名展示处方记录,单击可查看修改信息,长按可删除该记录,代码如下:

[java]  view plain copy
  1. package com.foxhu.app.doctornote.ui;  
  2.   
  3. import com.foxhu.app.doctornote.R;  
  4. import com.foxhu.app.doctornote.db.NoteDB;  
  5.   
  6. import android.os.AsyncTask;  
  7. import android.os.Bundle;  
  8. import android.app.AlertDialog;  
  9. import android.app.ListActivity;  
  10. import android.app.SearchManager;  
  11. import android.content.Context;  
  12. import android.content.DialogInterface;  
  13. import android.content.DialogInterface.OnClickListener;  
  14. import android.content.Intent;  
  15. import android.database.Cursor;  
  16. import android.view.Menu;  
  17. import android.view.MenuItem;  
  18. import android.view.View;  
  19. import android.widget.AdapterView;  
  20. import android.widget.AdapterView.OnItemLongClickListener;  
  21. import android.widget.ListView;  
  22. import android.widget.SearchView;  
  23. import android.widget.SimpleCursorAdapter;  
  24. import android.widget.Toast;  
  25. /** 
  26.  * DoctorNote 
  27.  * @author Foxhu 
  28.  * @version 1.0 
  29.  * 
  30.  */  
  31. public class MainActivity extends ListActivity implements OnItemLongClickListener{  
  32.     public final static String EXTRA_NOTEID = "com.foxhu.app.doctornote.NOTEID";   
  33.     private final static int ACTIVITY_CREATE = 0;//设置activity返回码  
  34.     private final static int ACTIVITY_MODI = 1;//设置activity返回码  
  35.     private Context mContext;  
  36.       
  37.     @Override  
  38.     protected void onCreate(Bundle savedInstanceState) {  
  39.         super.onCreate(savedInstanceState);  
  40.         mContext = this;  
  41.         setContentView(R.layout.activity_main);  
  42.         new LoadAsyncTask().execute();  
  43.         getListView().setOnItemLongClickListener(this);  
  44.     }  
  45.       
  46.     //android.os.AsyncTask<Params, Progress, Result>  
  47.     private class LoadAsyncTask extends AsyncTask<Void,Void,Cursor>{  
  48.   
  49.         @Override  
  50.         protected Cursor doInBackground(Void... arg0) {  
  51.             Cursor cursor = NoteDB.getInstance(getApplicationContext()).getAllNote();  
  52.             return cursor;  
  53.         }  
  54.   
  55.         @Override  
  56.         protected void onPostExecute(Cursor result) {  
  57.             super.onPostExecute(result);  
  58.             //构造方法  
  59.             //public SimpleCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to, int flags)  
  60.             String[] from = new String[]{NoteDB.COLUMN_NAME};  
  61.             int[] to = new int[]{android.R.id.text1};  
  62.             SimpleCursorAdapter records = new SimpleCursorAdapter(mContext,android.R.layout.simple_list_item_1,result,from,to,0);  
  63.             setListAdapter(records);  
  64.         }  
  65.           
  66.           
  67.     }  
  68.       
  69.       
  70.     /** 
  71.      * 处理单击事件,单击条目打开编辑窗口 
  72.      */  
  73.     @Override  
  74.     protected void onListItemClick(ListView l, View v, int position, long id) {  
  75.         super.onListItemClick(l, v, position, id);  
  76.         Intent intent = new Intent(this,ModiNoteActivity.class);  
  77.         intent.putExtra(EXTRA_NOTEID, id);//传递记录的id  
  78.         this.startActivityForResult(intent, ACTIVITY_MODI);  
  79.           
  80.     }  
  81.   
  82.   
  83.     @Override  
  84.     public boolean onCreateOptionsMenu(Menu menu) {  
  85.         // Inflate the menu; this adds items to the action bar if it is present.  
  86.         getMenuInflater().inflate(R.menu.main, menu);  
  87.         //设置查询  
  88.         SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);  
  89.         SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();  
  90.         searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));  
  91.         //searchView.setSubmitButtonEnabled(true);  
  92.         return true;  
  93.     }  
  94.   
  95.   
  96.     @Override  
  97.     public boolean onOptionsItemSelected(MenuItem item) {  
  98.         switch(item.getItemId()){  
  99.         case R.id.action_edit:  
  100.             Intent intent = new Intent(mContext, EditNoteActivity.class);  
  101.             //startActivity(intent);  
  102.             this.startActivityForResult(intent, ACTIVITY_CREATE);  
  103.             break;  
  104.         default:  
  105.             break;  
  106.         }  
  107.         return false;  
  108.     }  
  109.   
  110.   
  111.     @Override  
  112.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  113.         // TODO Auto-generated method stub  
  114.         super.onActivityResult(requestCode, resultCode, data);  
  115.         //重新加载数据  
  116.         new LoadAsyncTask().execute();  
  117.     }  
  118.       
  119.     @Override  
  120.     protected void onRestart() {  
  121.         super.onRestart();  
  122.         new LoadAsyncTask().execute();  
  123.     }  
  124.   
  125.   
  126.     @Override  
  127.     public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2,  
  128.             final long id) {  
  129.         AlertDialog.Builder builder = new AlertDialog.Builder(mContext)  
  130.                                         .setTitle(R.string.delete_title)  
  131.                                         .setMessage(R.string.delete_body)  
  132.                                         .setNegativeButton(R.string.delete_cancel, null)  
  133.                                         .setPositiveButton(R.string.delete_ok, new OnClickListener(){  
  134.                                             @Override  
  135.                                             public void onClick(DialogInterface dialog, int which) {  
  136.                                                     if (NoteDB.getInstance(getApplicationContext()).deleteNote(id)> 0) {  
  137.                                                             new LoadAsyncTask().execute();  
  138.                                                             Toast.makeText(mContext, R.string.delete_success,  
  139.                                                                             Toast.LENGTH_SHORT).show();  
  140.                                                     } else {  
  141.                                                             Toast.makeText(mContext, R.string.delete_fail,  
  142.                                                                             Toast.LENGTH_SHORT).show();  
  143.                                                     }  
  144.                                             }  
  145.                                               
  146.                                         });  
  147.           
  148.         builder.create().show();  
  149.           
  150.         // TODO Auto-generated method stub  
  151.         return false;  
  152.     }  
  153.   
  154. }  
对应的页面布局文件activity_main.xml如下:

[html]  view plain copy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity" >  
  10.   
  11.     <ListView  
  12.         android:id="@android:id/list"  
  13.         android:layout_width="match_parent"  
  14.         android:layout_height="match_parent"  
  15.         android:layout_centerHorizontal="true"  
  16.         android:layout_centerVertical="true" >  
  17.     </ListView>  
  18.   
  19. </RelativeLayout>  
(1)onCreate()事件解析
setContentView(R.layout.activity_main);设置布局文件;
new LoadAsyncTask().execute();执行异步任务从SQLite数据库加载全部医生处方数据;
getListView().setOnItemLongClickListener(this);给listview控件条目设置长按监听单击事件;
(2)private class LoadAsyncTask extends AsyncTask<Void,Void,Cursor>
内部类LoadAsyncTask继承AsyncTask类,我们来看一下AsyncTask这个类,这个类的定义一般带有三个泛型参数AsyncTask<Params, Progress, Result>,并且带有4步方法,分别为onPreExecute, doInBackground, onProgressUpdate 和 onPostExecute.一般我们需要后台执行获取数据的任务放在doInBackground()方法,执行结果数据展示部分放在onPostExecute(),该方法的参数即是doInBackground()返回的数据,下面详细介绍下AsyncTask的4步方法:
①.onPreExecute(),在任务执行之前,在UI线程上调用,这步通常用来设置任务,比如在用户界面上显示进度条;
②.doInBackground(Params...),在 onPreExecute()方法执行后立即在后台线程执行,这一步通常用来执行需要花费较长时间的后台计算,异步任务的参数传递给该方法,计算的结果必须在这一步返回,并传递给onPostExecute(Result),这一步也可使用 publishProgress(Progress...)方法来产生一个或多个单位的进度,这些值是发布在在UI线程上 onProgressUpdate(Progress...) 方法中的.
③.onProgressUpdate(Progress...),在 publishProgress(Progress...)方法后在UI线程上调用,它的执行时序是不确定的,这个方法通常用来在用户界面上展示进度,而后台计算仍在执行,例如,它可以用来动态的显示进步条或者在文本框中显示记录.
④.onPostExecute(Result),在后台计算完成后在UI线程上调用,后台计算的执行结果传递该方法作为参数.
(3)ActionBar的创建
ActionBar是3.0以后出来的设计规范,支持Android 3.0+,android:minSdkVersion="11",如果想在Android 2.1上实现ActionBar需要V7兼容包,我们定义Activity的时候一般这样public class MainActivity extends ActionBarActivity ,Activity要继承ActionBarActivity,为简单起见,本软件采用android:minSdkVersion="11"。
①.实现ActionBar关键是菜单文件的创建,下面是DoctorNote的主界面菜单文件main.xml:
[html]  view plain copy
  1. <menu xmlns:android="http://schemas.android.com/apk/res/android" >  
  2.     <item   
  3.         android:id="@+id/search"  
  4.         android:title="@string/search_title"  
  5.         android:icon="@drawable/ic_search"  
  6.         android:showAsAction="collapseActionView|ifRoom"  
  7.         android:actionViewClass="android.widget.SearchView" />     
  8.       
  9.     <item  
  10.         android:id="@+id/action_edit"  
  11.         android:icon="@drawable/ic_edit"  
  12.         android:showAsAction="ifRoom"  
  13.         android:title="@string/action_edit"/>  
  14.   
  15. </menu>  
其中第一个item用来定义搜索按钮,第二菜单用于定义编辑按钮,关键我们要注意android:showAsAction属性的应用,
ifRoom:如果ActionBar有空间就显示该菜单项;
withText:如果没有设定android:icon图标,那么菜单项以文字形式展示,可以与其他关键字联合使用比如ifRoom|withText;
never:不出现在ActionBar中,按设置键可弹出;
always:不管有没有空间,总是出现在ActionBar,通常不建议使用该项,会导致多个item重叠;
collapseActionView:与之相关的动作条目(如在android:actionViewClass中声明的视图类)是可折叠的,比如搜索控件SearchView;

②.在CeateOptionsMenu(Menu menu)方法加载菜单,实现actionbar效果

[java]  view plain copy
  1. @Override  
  2.     public boolean onCreateOptionsMenu(Menu menu) {  
  3.         // Inflate the menu; this adds items to the action bar if it is present.  
  4.         getMenuInflater().inflate(R.menu.main, menu);  
  5.         //设置查询  
  6.         SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);  
  7.         SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();  
  8.         searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));  
  9.         //searchView.setSubmitButtonEnabled(true);  
  10.         return true;  
  11.     }  

③.对ActionBar上的按钮添加响应事件

[java]  view plain copy
  1. @Override  
  2.     public boolean onOptionsItemSelected(MenuItem item) {  
  3.         switch(item.getItemId()){  
  4.         case R.id.action_edit:  
  5.             Intent intent = new Intent(mContext, EditNoteActivity.class);  
  6.             //startActivity(intent);  
  7.             this.startActivityForResult(intent, ACTIVITY_CREATE);  
  8.             break;  
  9.         default:  
  10.             break;  
  11.         }  
  12.         return false;  
  13.     }  
如果选中编辑(新建)菜单则通过intent打开EditNoteActivity.class

④.自定义ActionBar样式
Android3.0+为我们提供了Holo风格的样式,分为dark和light两种,有时我们希望根据自己的app特点自定义样式,在Android3.0+版本只需要继承parent="@style/Theme.Holo.Light.DarkActionBar",修改res/values/styles.xml如下:
[html]  view plain copy
  1. <resources xmlns:android="http://schemas.android.com/apk/res/android">  
  2.     <style name="my_theme" parent="android:Theme.Holo.Light">  
  3.         <item name="android:actionMenuTextColor">#FFFFFF</item>  
  4.         <item name="android:homeAsUpIndicator">@drawable/ic_up</item>  
  5.         <item name="android:actionBarStyle">@style/my_actionbar_style</item>  
  6.     </style>  
  7.    
  8.     <style name="my_actionbar_style" parent="@android:style/Widget.Holo.Light.ActionBar">  
  9.         <item name="android:background">#159CEB</item>  
  10.         <item name="android:textColor">#FFFFFF</item>  
  11.         <item name="android:titleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item>   
  12.     </style>  
  13.       
  14.     
  15.     <style name="MyTheme.ActionBar.TitleTextStyle" parent="@android:style/TextAppearance">  
  16.         <item name="android:textColor">#FFFFFF</item>  
  17.     </style>  
  18. </resources>  

(4)SearchView的创建,一般分为5步
①编写菜单文件,res/menu/main.xml

[html]  view plain copy
  1. <menu xmlns:android="http://schemas.android.com/apk/res/android" >  
  2.     <item   
  3.         android:id="@+id/search"  
  4.         android:title="@string/search_title"  
  5.         android:icon="@drawable/ic_search"  
  6.         android:showAsAction="collapseActionView|ifRoom"  
  7.         android:actionViewClass="android.widget.SearchView" />     
  8.       
  9.     <item  
  10.         android:id="@+id/action_edit"  
  11.         android:icon="@drawable/ic_edit"  
  12.         android:showAsAction="ifRoom"  
  13.         android:title="@string/action_edit"/>  
  14.   
  15. </menu>  
②编写搜索配置文件res/xml/searchable.xml
[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <searchable xmlns:android="http://schemas.android.com/apk/res/android"  
  3.         android:label="@string/app_name"  
  4.         android:hint="@string/search_hint"   
  5.         android:imeOptions="actionSearch"/>  
其中android:imeOptions="actionSearch"属性用来设置软键盘是搜索按钮而不是回车
③在onCreateOptionsMenu(Menu menu)方法中对SearchView通过调用setSearchableInfo(getComponentName())方法加载搜索配置信息
当SearchView和搜索配置文件正确关联后,当用户提交查询后SearchView就会通过ACTION_SEARCH intent 开启一个 activity来执行搜索任务
④修改AndroidManifest.xml配置文件
添加如下xml代码
[html]  view plain copy
  1. <!-- Searchable -->  
  2.         <activity  
  3.             android:name="com.foxhu.app.doctornote.ui.SearchableActivity"  
  4.             android:launchMode="singleTop" >  
  5.             <intent-filter>  
  6.                 <action android:name="android.intent.action.SEARCH" />  
  7.             </intent-filter>  
  8.             <meta-data  
  9.                 android:name="android.app.searchable"  
  10.                 android:resource="@xml/searchable" />  
  11.         </activity>  
  12.          <!-- Points to searchable activity so the whole app can invoke search. -->  
  13.         <meta-data  
  14.             android:name="android.app.default_searchable"  
  15.             android:value="com.foxhu.app.doctornote.ui.SearchableActivity"/>  
注意属性android:launchMode="singleTop",singleTop模式将SearchableActivity设为单例模式,用户可以执行多次搜索而无需创建新的Activity实例
⑤创建可搜索的Activity-SearchableActivity
SearchableActivity代码如下:
[java]  view plain copy
  1. package com.foxhu.app.doctornote.ui;  
  2.   
  3. import com.foxhu.app.doctornote.db.NoteDB;  
  4. import android.app.ListActivity;  
  5. import android.app.SearchManager;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.database.Cursor;  
  9. import android.os.Bundle;  
  10. import android.view.MenuItem;  
  11. import android.view.View;  
  12. import android.widget.ListView;  
  13. import android.widget.SimpleCursorAdapter;  
  14. /** 
  15.  * DoctorNote 
  16.  * @author Foxhu 
  17.  * @version 1.0 
  18.  * 
  19.  */  
  20. public class SearchableActivity extends ListActivity {  
  21.     private Context mContext;  
  22.     //private NoteDB mNoteDB;  
  23.       
  24.     @Override  
  25.     protected void onListItemClick(ListView l, View v, int position, long id) {  
  26.         // TODO Auto-generated method stub  
  27.         super.onListItemClick(l, v, position, id);  
  28.         Intent intent = new Intent(this,ModiNoteActivity.class);  
  29.         intent.putExtra(MainActivity.EXTRA_NOTEID, id);//传递记录的id  
  30.         this.startActivity(intent);  
  31.     }  
  32.   
  33.     @Override  
  34.     protected void onCreate(Bundle savedInstanceState) {  
  35.         // TODO Auto-generated method stub  
  36.         super.onCreate(savedInstanceState);  
  37.         mContext = this;  
  38.         //mNoteDB = new NoteDB(mContext, NoteDB.DATABASE_NAME, null, NoteDB.VERSION);  
  39.         getActionBar().setDisplayHomeAsUpEnabled(true);//设置返回按钮  
  40.         handleIntent(getIntent());  
  41.     }  
  42.   
  43.     private void handleIntent(Intent intent) {  
  44.         // TODO Auto-generated method stub  
  45.         if (Intent.ACTION_SEARCH.equals(intent.getAction())) {  
  46.             String query = intent.getStringExtra(SearchManager.QUERY);  
  47.             //use the query to search your data somehow  
  48.             fillList(query);  
  49.         }  
  50.     }  
  51.   
  52.     private void fillList(String query) {  
  53.         // TODO Auto-generated method stub  
  54.         Cursor result = NoteDB.getInstance(getApplicationContext()).queryNoteByName(query);  
  55.         String[] from = new String[]{NoteDB.COLUMN_NAME};  
  56.         int[] to = new int[]{android.R.id.text1};  
  57.         SimpleCursorAdapter records = new SimpleCursorAdapter(mContext,android.R.layout.simple_list_item_1,result,from,to,0);  
  58.         setListAdapter(records);  
  59.     }  
  60.   
  61.     @Override  
  62.     protected void onNewIntent(Intent intent) {  
  63.         // TODO Auto-generated method stub  
  64.         super.onNewIntent(intent);  
  65.         handleIntent(intent);  
  66.     }  
  67.   
  68.     @Override  
  69.     public boolean onOptionsItemSelected(MenuItem item) {  
  70.         switch(item.getItemId()){  
  71.         case android.R.id.home:  
  72.             finish();  
  73.             break;  
  74.         default:  
  75.             break;  
  76.         }  
  77.         return super.onOptionsItemSelected(item);  
  78.     }  
  79.   
  80.       
  81.   
  82. }  
在onCreate()事件中,通过handleIntent(getIntent())检查ACTION_SEARCH intent来处理查询, 通过String query = intent.getStringExtra(SearchManager.QUERY)来获取查询关键词,然后通过fillList(query)来装载查询结果;

4.创建EditNoteActivity,该类主要用来新建处方
[java]  view plain copy
  1. package com.foxhu.app.doctornote.ui;  
  2.   
  3. import com.foxhu.app.doctornote.R;  
  4. import com.foxhu.app.doctornote.db.NoteDB;  
  5.   
  6. import android.os.Bundle;  
  7. import android.app.Activity;  
  8. import android.content.Context;  
  9. import android.view.Menu;  
  10. import android.view.MenuItem;  
  11. import android.widget.EditText;  
  12. import android.widget.Toast;  
  13. /** 
  14.  * DoctorNote 
  15.  * @author Foxhu 
  16.  * @version 1.0 
  17.  * 
  18.  */  
  19. public class EditNoteActivity extends Activity {  
  20.     private Context mContext;  
  21.     private EditText mNameText;  
  22.     private EditText mPrescriptionText;  
  23.       
  24.     @Override  
  25.     protected void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         mContext = this;   
  28.         setContentView(R.layout.activity_edit_note);  
  29.         mNameText = (EditText) this.findViewById(R.id.notename);  
  30.         mPrescriptionText = (EditText) this.findViewById(R.id.noteprescription);  
  31.         getActionBar().setDisplayHomeAsUpEnabled(true);//设置返回按钮  
  32.     }  
  33.   
  34.     @Override  
  35.     public boolean onCreateOptionsMenu(Menu menu) {  
  36.         // Inflate the menu; this adds items to the action bar if it is present.  
  37.         getMenuInflater().inflate(R.menu.edit_note, menu);  
  38.         return true;  
  39.     }  
  40.   
  41.     @Override  
  42.     public boolean onOptionsItemSelected(MenuItem item) {  
  43.         switch(item.getItemId()){  
  44.         case R.id.action_save:  
  45.             String name = mNameText.getText().toString();  
  46.             String prescription = mPrescriptionText.getText().toString();  
  47.             if (name.isEmpty()){  
  48.                 Toast.makeText(mContext, R.string.name_empty,Toast.LENGTH_SHORT).show();  
  49.             }else{  
  50.                 NoteDB.getInstance(getApplicationContext()).insertNote(name, prescription);  
  51.                 this.finish();  
  52.             }  
  53.             break;  
  54.         case android.R.id.home:  
  55.             finish();  
  56.             break;  
  57.         default:  
  58.             break;  
  59.         }  
  60.         return false;  
  61.     }  
  62.       
  63.       
  64.   
  65. }  

5.创建ModiNoteActivity,该类主要用来修改处方
[java]  view plain copy
  1. package com.foxhu.app.doctornote.ui;  
  2.   
  3. import com.foxhu.app.doctornote.R;  
  4. import com.foxhu.app.doctornote.db.NoteDB;  
  5. import android.os.Bundle;  
  6. import android.app.Activity;  
  7. import android.content.Context;  
  8. import android.content.Intent;  
  9. import android.database.Cursor;  
  10. import android.view.Menu;  
  11. import android.view.MenuItem;  
  12. import android.widget.EditText;  
  13. import android.widget.Toast;  
  14. /** 
  15.  * DoctorNote 
  16.  * @author Foxhu 
  17.  * @version 1.0 
  18.  * 
  19.  */  
  20. public class ModiNoteActivity extends Activity {  
  21.     private Context mContext;  
  22.     //private NoteDB mNoteDB;  
  23.     private EditText mNameText;  
  24.     private EditText mPrescriptionText;  
  25.     private long noteId;  
  26.       
  27.     @Override  
  28.     protected void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         mContext = this;   
  31.         setContentView(R.layout.activity_modi_note);  
  32.         //mNoteDB = new NoteDB(mContext, NoteDB.DATABASE_NAME, null, NoteDB.VERSION);  
  33.         Intent intent = getIntent();  
  34.         noteId = intent.getLongExtra(MainActivity.EXTRA_NOTEID, 0);  
  35.         Cursor cursor = NoteDB.getInstance(getApplicationContext()).queryNoteById(noteId);//根据接收的id查询记录详细信息  
  36.         mNameText = (EditText) this.findViewById(R.id.modi_notename);  
  37.         mPrescriptionText = (EditText) this.findViewById(R.id.modi_noteprescription);  
  38.           
  39.         mNameText.setText(cursor.getString(cursor.getColumnIndexOrThrow(NoteDB.COLUMN_NAME)));  
  40.         mPrescriptionText.setText(cursor.getString(cursor.getColumnIndexOrThrow(NoteDB.COLUMN_PRESCRIPTION)));  
  41.         getActionBar().setDisplayHomeAsUpEnabled(true);//设置返回按钮  
  42.           
  43.     }  
  44.   
  45.     @Override  
  46.     public boolean onCreateOptionsMenu(Menu menu) {  
  47.         // Inflate the menu; this adds items to the action bar if it is present.  
  48.         getMenuInflater().inflate(R.menu.modi_note, menu);  
  49.         return true;  
  50.     }  
  51.   
  52.     @Override  
  53.     public boolean onOptionsItemSelected(MenuItem item) {  
  54.         switch(item.getItemId()){  
  55.         case R.id.action_modi:  
  56.             String name = mNameText.getText().toString();  
  57.             String prescription = mPrescriptionText.getText().toString();  
  58.             if (name.isEmpty()){  
  59.                 Toast.makeText(mContext, R.string.name_empty,Toast.LENGTH_SHORT).show();  
  60.             }else{  
  61.                 NoteDB.getInstance(getApplicationContext()).updateNote(noteId, name, prescription);  
  62.                 this.finish();  
  63.             }  
  64.             break;  
  65.         case android.R.id.home:  
  66.             finish();  
  67.             break;  
  68.         default:  
  69.             break;  
  70.         }  
  71.         return false;  
  72.     }  
  73.   
  74. }  

5.数据库操作类NoteDB
该类继承SQLiteOpenHelper,由于多个Activity都要操作数据库,所以写了一个public static NoteDB getInstance(Context context)单例模式创建数据库操作类NoteDB对象,调用方法为NoteDB.getInstance(getApplicationContext()),代码如下
[java]  view plain copy
  1. package com.foxhu.app.doctornote.db;  
  2.   
  3. import java.util.Calendar;  
  4.   
  5. import android.content.ContentValues;  
  6. import android.content.Context;  
  7. import android.database.Cursor;  
  8. import android.database.sqlite.SQLiteDatabase;  
  9. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
  10. import android.database.sqlite.SQLiteOpenHelper;  
  11. import android.database.sqlite.SQLiteStatement;  
  12. /** 
  13.  * DoctorNote 
  14.  * @author Foxhu 
  15.  * @version 1.0 
  16.  * 
  17.  */  
  18. public class NoteDB extends SQLiteOpenHelper {  
  19.     public static NoteDB mInstance = null;  
  20.     public static final int VERSION = 1;  
  21.     public static final String DATABASE_NAME = "DoctorNote";  
  22.       
  23.     private static final String TABLE_NOTE_NAME = "Note";  
  24.     private static final String COLUMN_ID = "_id";  
  25.     public static final String COLUMN_NAME = "name";  
  26.     public static final String COLUMN_PRESCRIPTION = "prescription";  
  27.     private static final String COLUMN_CREATETIME = "createtime";  
  28.   
  29.     
  30.     private static final String DATABASE_NOTE_CREATE = "create table Note(_id integer primary key autoincrement, "  
  31.                                                         + "name text not null,"  
  32.                                                         + "prescription text not null,"  
  33.                                                         + "createtime text not null" + ");";  
  34.       
  35.     public NoteDB(Context context, String name, CursorFactory factory, int version) {  
  36.         super(context, name, factory, version);  
  37.     }  
  38.       
  39.     //自定义构造函数,只需要传递Activity对象给它即可  
  40.     public NoteDB(Context context) {  
  41.         this(context, DATABASE_NAME, null, VERSION);   
  42.     }  
  43.      /** 
  44.      * 单例模式 
  45.      */  
  46.     public static NoteDB getInstance(Context context) {  
  47.             if (mInstance == null) {  
  48.                     mInstance = new NoteDB(context);  
  49.             }  
  50.             return mInstance;  
  51.     }  
  52.       
  53.     @Override  
  54.     public void onCreate(SQLiteDatabase db) {  
  55.         db.execSQL(DATABASE_NOTE_CREATE);  
  56.     }  
  57.   
  58.     @Override  
  59.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  60.         // TODO Auto-generated method stub  
  61.   
  62.     }  
  63.     /** 
  64.      * 获取全部数据 
  65.      * @param db 
  66.      * @return 
  67.      */  
  68.     public Cursor getAllNote(){  
  69.         return this.getReadableDatabase().query(TABLE_NOTE_NAME, new String[] {COLUMN_ID,COLUMN_NAME,COLUMN_PRESCRIPTION,COLUMN_CREATETIME}, nullnullnullnull"_id desc");  
  70.           
  71.     }  
  72.       
  73.     /** 
  74.      * 插入数据 
  75.      * @param name 
  76.      * @param prescription 
  77.      * @return 
  78.      */  
  79.     public long insertNote(String name,String prescription){  
  80.         ContentValues values = new ContentValues();  
  81.         Calendar calendar = Calendar.getInstance();    
  82.         String created = calendar.get(Calendar.YEAR) + "年" + calendar.get(Calendar.MONTH) + "月"  + calendar.get(Calendar.DAY_OF_MONTH) + "日";  
  83.         values.put(COLUMN_NAME, name);  
  84.         values.put(COLUMN_PRESCRIPTION, prescription);  
  85.         values.put(COLUMN_CREATETIME, created);  
  86.         return this.getWritableDatabase().insert(TABLE_NOTE_NAME, null, values);  
  87.     }  
  88.       
  89.     /** 
  90.      * 根据id删除数据 
  91.      * @param id 
  92.      * @return 
  93.      */  
  94.     public int deleteNote(long id){  
  95.         return this.getWritableDatabase().delete(TABLE_NOTE_NAME, "_id=?"new String[] { String.valueOf(id) });  
  96.     }  
  97.       
  98.     /** 
  99.      * 根据id更新数据 
  100.      * @param id 
  101.      * @param name 
  102.      * @param prescription 
  103.      * @return 
  104.      */  
  105.     public int updateNote(long id,String name,String prescription){  
  106.         ContentValues values = new ContentValues();  
  107.         values.put(COLUMN_NAME, name);  
  108.         values.put(COLUMN_PRESCRIPTION, prescription);  
  109.         return this.getWritableDatabase().update(TABLE_NOTE_NAME, values, "_id=?"new String[] { String.valueOf(id) });  
  110.     }  
  111.       
  112.     /** 
  113.      * 根据姓名查询数据 
  114.      * @param name 
  115.      * @return 
  116.      */  
  117.     public Cursor queryNoteByName(String name){  
  118.         return this.getReadableDatabase().query(TABLE_NOTE_NAME, null"name like ?"new String[] {"%"+name+"%"}, nullnull"_id desc");  
  119.     }  
  120.       
  121.     /** 
  122.      * 根据id查询详细信息 
  123.      * @param id 
  124.      * @return 
  125.      */  
  126.     public Cursor queryNoteById(long id){  
  127.         Cursor mcursor = this.getReadableDatabase().query(TABLE_NOTE_NAME, null"_id=?"new String[] { String.valueOf(id) }, nullnullnull,"1");  
  128.         if (mcursor != null && mcursor.getCount() !=0){  
  129.             mcursor.moveToFirst();  
  130.             return mcursor;  
  131.         }else{  
  132.             return null;  
  133.         }  
  134.     }  
  135.     /** 
  136.      * 获取note表全部记录数 
  137.      * @return 
  138.      */  
  139.     public long getNoteCount(){  
  140.         SQLiteStatement statement = this.getReadableDatabase().compileStatement("select count(*) from " + TABLE_NOTE_NAME);  
  141.         return statement.simpleQueryForLong();  
  142.     }  
  143.       
  144.     /** 
  145.      * 根据姓名查询记录数 
  146.      * @param name 
  147.      * @return 
  148.      */  
  149.     public long getNoteCountByName(String name) {  
  150.         SQLiteStatement statement = getReadableDatabase().compileStatement(  
  151.                 "select count(*) from " + TABLE_NOTE_NAME + " where name=" + name);  
  152.         return statement.simpleQueryForLong();  
  153.     }  
  154. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值