DoctorNote医生处方笔记开发记录
1.开发背景
一个开诊所的中医朋友,希望我能给他开发一个记录病人姓名和处方的Android手机app,以便查询病人每次就诊信息,比如上一次的处方,以前他要找个病人上一次的就诊处方,几乎要翻遍一叠厚厚的处方纸张才能找到(他的门诊量还是很大的),非常麻烦。于是利用周末的两天时间开发了这款DoctorNote软件,软件截图如下:
DoctorNote开发过程用了很Android各个方面的知识点,比如ActionBar的使用、自定义ActionBar样式、SQLite的使用、AsyncTask的使用,SearchView的使用和SearchActivity的编写,以及AlertDialog的创建等。现总结如下:
2.项目的创建
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:
ifRoom:如果ActionBar有空间就显示该菜单项;
withText:如果没有设定android:icon图标,那么菜单项以文字形式展示,可以与其他关键字联合使用比如ifRoom|withText;
never:不出现在ActionBar中,按设置键可弹出;
always:不管有没有空间,总是出现在ActionBar,通常不建议使用该项,会导致多个item重叠;
collapseActionView:与之相关的动作条目(如在android:actionViewClass中声明的视图类)是可折叠的,比如搜索控件SearchView;
②.在CeateOptionsMenu(Menu menu)方法加载菜单,实现actionbar效果
③.对ActionBar上的按钮添加响应事件
④.自定义ActionBar样式
Android3.0+为我们提供了Holo风格的样式,分为dark和light两种,有时我们希望根据自己的app特点自定义样式,在Android3.0+版本只需要继承parent="@style/Theme.Holo.Light.DarkActionBar",修改res/values/styles.xml如下:
(4)SearchView的创建,一般分为5步
①编写菜单文件,res/menu/main.xml
③在onCreateOptionsMenu(Menu menu)方法中对SearchView通过调用setSearchableInfo(getComponentName())方法加载搜索配置信息
当SearchView和搜索配置文件正确关联后,当用户提交查询后SearchView就会通过ACTION_SEARCH intent 开启一个 activity来执行搜索任务
④修改AndroidManifest.xml配置文件
添加如下xml代码
⑤创建可搜索的Activity-SearchableActivity
SearchableActivity代码如下:
4.创建EditNoteActivity,该类主要用来新建处方
5.创建ModiNoteActivity,该类主要用来修改处方
5.数据库操作类NoteDB
该类继承SQLiteOpenHelper,由于多个Activity都要操作数据库,所以写了一个public static NoteDB getInstance(Context context)单例模式创建数据库操作类NoteDB对象,调用方法为NoteDB.getInstance(getApplicationContext()),代码如下
本项目源码已经共享,github源码:https://github.com/puma007/DoctorNote
一个开诊所的中医朋友,希望我能给他开发一个记录病人姓名和处方的Android手机app,以便查询病人每次就诊信息,比如上一次的处方,以前他要找个病人上一次的就诊处方,几乎要翻遍一叠厚厚的处方纸张才能找到(他的门诊量还是很大的),非常麻烦。于是利用周末的两天时间开发了这款DoctorNote软件,软件截图如下:
DoctorNote开发过程用了很Android各个方面的知识点,比如ActionBar的使用、自定义ActionBar样式、SQLite的使用、AsyncTask的使用,SearchView的使用和SearchActivity的编写,以及AlertDialog的创建等。现总结如下:
2.项目的创建
项目的开发IDE是Eclipse,File->new->Android Application Project,项目的目录结构如下 图:
3.创建MainActivity
该类继承ListActivity实现OnItemLongClickListener接口,是程序的主界面,主要按姓名展示处方记录,单击可查看修改信息,长按可删除该记录,代码如下:
package com.foxhu.app.doctornote.ui; import com.foxhu.app.doctornote.R; import com.foxhu.app.doctornote.db.NoteDB; import android.os.AsyncTask; import android.os.Bundle; import android.app.AlertDialog; import android.app.ListActivity; import android.app.SearchManager; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.database.Cursor; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import android.widget.SearchView; import android.widget.SimpleCursorAdapter; import android.widget.Toast; /** * DoctorNote * @author Foxhu * @version 1.0 * */ public class MainActivity extends ListActivity implements OnItemLongClickListener{ public final static String EXTRA_NOTEID = "com.foxhu.app.doctornote.NOTEID"; private final static int ACTIVITY_CREATE = 0;//设置activity返回码 private final static int ACTIVITY_MODI = 1;//设置activity返回码 private Context mContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; setContentView(R.layout.activity_main); new LoadAsyncTask().execute(); getListView().setOnItemLongClickListener(this); } //android.os.AsyncTask<Params, Progress, Result> private class LoadAsyncTask extends AsyncTask<Void,Void,Cursor>{ @Override protected Cursor doInBackground(Void... arg0) { Cursor cursor = NoteDB.getInstance(getApplicationContext()).getAllNote(); return cursor; } @Override protected void onPostExecute(Cursor result) { super.onPostExecute(result); //构造方法 //public SimpleCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to, int flags) String[] from = new String[]{NoteDB.COLUMN_NAME}; int[] to = new int[]{android.R.id.text1}; SimpleCursorAdapter records = new SimpleCursorAdapter(mContext,android.R.layout.simple_list_item_1,result,from,to,0); setListAdapter(records); } } /** * 处理单击事件,单击条目打开编辑窗口 */ @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Intent intent = new Intent(this,ModiNoteActivity.class); intent.putExtra(EXTRA_NOTEID, id);//传递记录的id this.startActivityForResult(intent, ACTIVITY_MODI); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); //设置查询 SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); //searchView.setSubmitButtonEnabled(true); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.action_edit: Intent intent = new Intent(mContext, EditNoteActivity.class); //startActivity(intent); this.startActivityForResult(intent, ACTIVITY_CREATE); break; default: break; } return false; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); //重新加载数据 new LoadAsyncTask().execute(); } @Override protected void onRestart() { super.onRestart(); new LoadAsyncTask().execute(); } @Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, final long id) { AlertDialog.Builder builder = new AlertDialog.Builder(mContext) .setTitle(R.string.delete_title) .setMessage(R.string.delete_body) .setNegativeButton(R.string.delete_cancel, null) .setPositiveButton(R.string.delete_ok, new OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { if (NoteDB.getInstance(getApplicationContext()).deleteNote(id)> 0) { new LoadAsyncTask().execute(); Toast.makeText(mContext, R.string.delete_success, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(mContext, R.string.delete_fail, Toast.LENGTH_SHORT).show(); } } }); builder.create().show(); // TODO Auto-generated method stub return false; } }对应的页面布局文件activity_main.xml如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" > </ListView> </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:
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/search" android:title="@string/search_title" android:icon="@drawable/ic_search" android:showAsAction="collapseActionView|ifRoom" android:actionViewClass="android.widget.SearchView" /> <item android:id="@+id/action_edit" android:icon="@drawable/ic_edit" android:showAsAction="ifRoom" android:title="@string/action_edit"/> </menu>其中第一个item用来定义搜索按钮,第二菜单用于定义编辑按钮,关键我们要注意android:showAsAction属性的应用,
ifRoom:如果ActionBar有空间就显示该菜单项;
withText:如果没有设定android:icon图标,那么菜单项以文字形式展示,可以与其他关键字联合使用比如ifRoom|withText;
never:不出现在ActionBar中,按设置键可弹出;
always:不管有没有空间,总是出现在ActionBar,通常不建议使用该项,会导致多个item重叠;
collapseActionView:与之相关的动作条目(如在android:actionViewClass中声明的视图类)是可折叠的,比如搜索控件SearchView;
②.在CeateOptionsMenu(Menu menu)方法加载菜单,实现actionbar效果
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); //设置查询 SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); //searchView.setSubmitButtonEnabled(true); return true; }
③.对ActionBar上的按钮添加响应事件
@Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.action_edit: Intent intent = new Intent(mContext, EditNoteActivity.class); //startActivity(intent); this.startActivityForResult(intent, ACTIVITY_CREATE); break; default: break; } return false; }如果选中编辑(新建)菜单则通过intent打开EditNoteActivity.class
④.自定义ActionBar样式
Android3.0+为我们提供了Holo风格的样式,分为dark和light两种,有时我们希望根据自己的app特点自定义样式,在Android3.0+版本只需要继承parent="@style/Theme.Holo.Light.DarkActionBar",修改res/values/styles.xml如下:
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="my_theme" parent="android:Theme.Holo.Light"> <item name="android:actionMenuTextColor">#FFFFFF</item> <item name="android:homeAsUpIndicator">@drawable/ic_up</item> <item name="android:actionBarStyle">@style/my_actionbar_style</item> </style> <style name="my_actionbar_style" parent="@android:style/Widget.Holo.Light.ActionBar"> <item name="android:background">#159CEB</item> <item name="android:textColor">#FFFFFF</item> <item name="android:titleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item> </style> <style name="MyTheme.ActionBar.TitleTextStyle" parent="@android:style/TextAppearance"> <item name="android:textColor">#FFFFFF</item> </style> </resources>
(4)SearchView的创建,一般分为5步
①编写菜单文件,res/menu/main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/search" android:title="@string/search_title" android:icon="@drawable/ic_search" android:showAsAction="collapseActionView|ifRoom" android:actionViewClass="android.widget.SearchView" /> <item android:id="@+id/action_edit" android:icon="@drawable/ic_edit" android:showAsAction="ifRoom" android:title="@string/action_edit"/> </menu>②编写搜索配置文件res/xml/searchable.xml
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/search_hint" android:imeOptions="actionSearch"/>其中android:imeOptions="actionSearch"属性用来设置软键盘是搜索按钮而不是回车
③在onCreateOptionsMenu(Menu menu)方法中对SearchView通过调用setSearchableInfo(getComponentName())方法加载搜索配置信息
当SearchView和搜索配置文件正确关联后,当用户提交查询后SearchView就会通过ACTION_SEARCH intent 开启一个 activity来执行搜索任务
④修改AndroidManifest.xml配置文件
添加如下xml代码
<!-- Searchable --> <activity android:name="com.foxhu.app.doctornote.ui.SearchableActivity" android:launchMode="singleTop" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> <!-- Points to searchable activity so the whole app can invoke search. --> <meta-data android:name="android.app.default_searchable" android:value="com.foxhu.app.doctornote.ui.SearchableActivity"/>注意属性android:launchMode="singleTop",singleTop模式将SearchableActivity设为单例模式,用户可以执行多次搜索而无需创建新的Activity实例
⑤创建可搜索的Activity-SearchableActivity
SearchableActivity代码如下:
package com.foxhu.app.doctornote.ui; import com.foxhu.app.doctornote.db.NoteDB; import android.app.ListActivity; import android.app.SearchManager; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.view.MenuItem; import android.view.View; import android.widget.ListView; import android.widget.SimpleCursorAdapter; /** * DoctorNote * @author Foxhu * @version 1.0 * */ public class SearchableActivity extends ListActivity { private Context mContext; //private NoteDB mNoteDB; @Override protected void onListItemClick(ListView l, View v, int position, long id) { // TODO Auto-generated method stub super.onListItemClick(l, v, position, id); Intent intent = new Intent(this,ModiNoteActivity.class); intent.putExtra(MainActivity.EXTRA_NOTEID, id);//传递记录的id this.startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); mContext = this; //mNoteDB = new NoteDB(mContext, NoteDB.DATABASE_NAME, null, NoteDB.VERSION); getActionBar().setDisplayHomeAsUpEnabled(true);//设置返回按钮 handleIntent(getIntent()); } private void handleIntent(Intent intent) { // TODO Auto-generated method stub if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); //use the query to search your data somehow fillList(query); } } private void fillList(String query) { // TODO Auto-generated method stub Cursor result = NoteDB.getInstance(getApplicationContext()).queryNoteByName(query); String[] from = new String[]{NoteDB.COLUMN_NAME}; int[] to = new int[]{android.R.id.text1}; SimpleCursorAdapter records = new SimpleCursorAdapter(mContext,android.R.layout.simple_list_item_1,result,from,to,0); setListAdapter(records); } @Override protected void onNewIntent(Intent intent) { // TODO Auto-generated method stub super.onNewIntent(intent); handleIntent(intent); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case android.R.id.home: finish(); break; default: break; } return super.onOptionsItemSelected(item); } }在onCreate()事件中,通过handleIntent(getIntent())检查ACTION_SEARCH intent来处理查询, 通过String query = intent.getStringExtra(SearchManager.QUERY)来获取查询关键词,然后通过fillList(query)来装载查询结果;
4.创建EditNoteActivity,该类主要用来新建处方
package com.foxhu.app.doctornote.ui; import com.foxhu.app.doctornote.R; import com.foxhu.app.doctornote.db.NoteDB; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.view.Menu; import android.view.MenuItem; import android.widget.EditText; import android.widget.Toast; /** * DoctorNote * @author Foxhu * @version 1.0 * */ public class EditNoteActivity extends Activity { private Context mContext; private EditText mNameText; private EditText mPrescriptionText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; setContentView(R.layout.activity_edit_note); mNameText = (EditText) this.findViewById(R.id.notename); mPrescriptionText = (EditText) this.findViewById(R.id.noteprescription); getActionBar().setDisplayHomeAsUpEnabled(true);//设置返回按钮 } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.edit_note, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.action_save: String name = mNameText.getText().toString(); String prescription = mPrescriptionText.getText().toString(); if (name.isEmpty()){ Toast.makeText(mContext, R.string.name_empty,Toast.LENGTH_SHORT).show(); }else{ NoteDB.getInstance(getApplicationContext()).insertNote(name, prescription); this.finish(); } break; case android.R.id.home: finish(); break; default: break; } return false; } }
5.创建ModiNoteActivity,该类主要用来修改处方
package com.foxhu.app.doctornote.ui; import com.foxhu.app.doctornote.R; import com.foxhu.app.doctornote.db.NoteDB; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.view.Menu; import android.view.MenuItem; import android.widget.EditText; import android.widget.Toast; /** * DoctorNote * @author Foxhu * @version 1.0 * */ public class ModiNoteActivity extends Activity { private Context mContext; //private NoteDB mNoteDB; private EditText mNameText; private EditText mPrescriptionText; private long noteId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; setContentView(R.layout.activity_modi_note); //mNoteDB = new NoteDB(mContext, NoteDB.DATABASE_NAME, null, NoteDB.VERSION); Intent intent = getIntent(); noteId = intent.getLongExtra(MainActivity.EXTRA_NOTEID, 0); Cursor cursor = NoteDB.getInstance(getApplicationContext()).queryNoteById(noteId);//根据接收的id查询记录详细信息 mNameText = (EditText) this.findViewById(R.id.modi_notename); mPrescriptionText = (EditText) this.findViewById(R.id.modi_noteprescription); mNameText.setText(cursor.getString(cursor.getColumnIndexOrThrow(NoteDB.COLUMN_NAME))); mPrescriptionText.setText(cursor.getString(cursor.getColumnIndexOrThrow(NoteDB.COLUMN_PRESCRIPTION))); getActionBar().setDisplayHomeAsUpEnabled(true);//设置返回按钮 } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.modi_note, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.action_modi: String name = mNameText.getText().toString(); String prescription = mPrescriptionText.getText().toString(); if (name.isEmpty()){ Toast.makeText(mContext, R.string.name_empty,Toast.LENGTH_SHORT).show(); }else{ NoteDB.getInstance(getApplicationContext()).updateNote(noteId, name, prescription); this.finish(); } break; case android.R.id.home: finish(); break; default: break; } return false; } }
5.数据库操作类NoteDB
该类继承SQLiteOpenHelper,由于多个Activity都要操作数据库,所以写了一个public static NoteDB getInstance(Context context)单例模式创建数据库操作类NoteDB对象,调用方法为NoteDB.getInstance(getApplicationContext()),代码如下
package com.foxhu.app.doctornote.db; import java.util.Calendar; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteStatement; /** * DoctorNote * @author Foxhu * @version 1.0 * */ public class NoteDB extends SQLiteOpenHelper { public static NoteDB mInstance = null; public static final int VERSION = 1; public static final String DATABASE_NAME = "DoctorNote"; private static final String TABLE_NOTE_NAME = "Note"; private static final String COLUMN_ID = "_id"; public static final String COLUMN_NAME = "name"; public static final String COLUMN_PRESCRIPTION = "prescription"; private static final String COLUMN_CREATETIME = "createtime"; private static final String DATABASE_NOTE_CREATE = "create table Note(_id integer primary key autoincrement, " + "name text not null," + "prescription text not null," + "createtime text not null" + ");"; public NoteDB(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } //自定义构造函数,只需要传递Activity对象给它即可 public NoteDB(Context context) { this(context, DATABASE_NAME, null, VERSION); } /** * 单例模式 */ public static NoteDB getInstance(Context context) { if (mInstance == null) { mInstance = new NoteDB(context); } return mInstance; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_NOTE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } /** * 获取全部数据 * @param db * @return */ public Cursor getAllNote(){ return this.getReadableDatabase().query(TABLE_NOTE_NAME, new String[] {COLUMN_ID,COLUMN_NAME,COLUMN_PRESCRIPTION,COLUMN_CREATETIME}, null, null, null, null, "_id desc"); } /** * 插入数据 * @param name * @param prescription * @return */ public long insertNote(String name,String prescription){ ContentValues values = new ContentValues(); Calendar calendar = Calendar.getInstance(); String created = calendar.get(Calendar.YEAR) + "年" + calendar.get(Calendar.MONTH) + "月" + calendar.get(Calendar.DAY_OF_MONTH) + "日"; values.put(COLUMN_NAME, name); values.put(COLUMN_PRESCRIPTION, prescription); values.put(COLUMN_CREATETIME, created); return this.getWritableDatabase().insert(TABLE_NOTE_NAME, null, values); } /** * 根据id删除数据 * @param id * @return */ public int deleteNote(long id){ return this.getWritableDatabase().delete(TABLE_NOTE_NAME, "_id=?", new String[] { String.valueOf(id) }); } /** * 根据id更新数据 * @param id * @param name * @param prescription * @return */ public int updateNote(long id,String name,String prescription){ ContentValues values = new ContentValues(); values.put(COLUMN_NAME, name); values.put(COLUMN_PRESCRIPTION, prescription); return this.getWritableDatabase().update(TABLE_NOTE_NAME, values, "_id=?", new String[] { String.valueOf(id) }); } /** * 根据姓名查询数据 * @param name * @return */ public Cursor queryNoteByName(String name){ return this.getReadableDatabase().query(TABLE_NOTE_NAME, null, "name like ?", new String[] {"%"+name+"%"}, null, null, "_id desc"); } /** * 根据id查询详细信息 * @param id * @return */ public Cursor queryNoteById(long id){ Cursor mcursor = this.getReadableDatabase().query(TABLE_NOTE_NAME, null, "_id=?", new String[] { String.valueOf(id) }, null, null, null,"1"); if (mcursor != null && mcursor.getCount() !=0){ mcursor.moveToFirst(); return mcursor; }else{ return null; } } /** * 获取note表全部记录数 * @return */ public long getNoteCount(){ SQLiteStatement statement = this.getReadableDatabase().compileStatement("select count(*) from " + TABLE_NOTE_NAME); return statement.simpleQueryForLong(); } /** * 根据姓名查询记录数 * @param name * @return */ public long getNoteCountByName(String name) { SQLiteStatement statement = getReadableDatabase().compileStatement( "select count(*) from " + TABLE_NOTE_NAME + " where name=" + name); return statement.simpleQueryForLong(); } }
本项目源码已经共享,github源码:https://github.com/puma007/DoctorNote
相关推荐
可以自动生成处方,C#版,有需要的朋友可以研究一下
基于java的医院医生处方管理系统答辩ppt.ppt
基于医学知识库的全科医生智能处方辅助系统设计.pdf
5、《处方管理办法》培训记录.pdf
系统是为一个课程设计所写的处方跟踪系统,通过JSP写页面,Tomcat作服务器,Access作数据库以JDBC-ODBC桥连接。由于时间紧,所以功能有限,紧支持查询操作且页面简单。该系统仅为大家交流学习之用!
5、《处方管理办法》培训记录(20211204095525).pdf
用电脑开处方是各大医院的趋势,本软件是为个体诊所、卫生室、老干部门诊及基层医疗单位量体裁衣定做的门诊电子处方管理软件,简单化设计,界面操作一目了然,即使您是电脑新手,甚至不会打字,也可以很方便的使用它...
门诊电子处方软件V5.0Reg终极注册版门诊电子处方软件V5.0Reg终极注册版门诊电子处方软件V5.0Reg终极注册版门诊电子处方软件V5.0Reg终极注册版门诊电子处方软件V5.0Reg终极注册版门诊电子处方软件V5.0Reg终极注册版...
XX市皮肤病医院处方集(完整版本)含西医、中医处方.doc
针对医生偏好开"外购"处方而导致患者看病药费过高的现象,运用博弈论的相关理论和方法,建立了医院监管与医生开"外购"处方的博弈模型,分析了"外购"处方存在的原因及其运行规律。结果表明:医院对医生开"外购"处方的行为...
卫生所门诊电子处方软件是一款可以用电脑开处方是各大医院的趋势,是为个体诊所、卫生室、老干部门诊及基层医疗单位量体裁衣定做的门诊电子处方管理软件,全傻瓜化设计,界面操作一目了然,即使您是电脑新手,甚至...
三江电子处方管理系统是应用于局域网内的联网版本,并且含有多个独立客户端,目前有:药房、医生、门诊收费、住院收费、院长查询等五个功能模块,使用流程为由医生端口录入电子处方并生成一个处方号,病人无需携带...
淘宝很多卖家销售的带注册码的,其实都是试用版,只是做了一个伪装,用30--60天后一样不会打印处方、注射卡、门诊日志! 本软件是为个体诊所、卫生所及基层医疗单位量体裁衣定做的门诊电子处方管理软件,全傻瓜化...
用电脑开处方是各大医院的趋势,卫生所门诊电子处方软件是为个体诊所、卫生室、老干部门诊及基层医疗单位量体裁衣定做的门诊电子处方管理软件,全傻瓜化设计,界面操作一目了然,即使您是电脑新手,甚至不会打字,也...
处方审核处方点评,处方审核处方点评课件,处方审核处方点评PPT
医院门诊管理系统,包括了挂号管理、医生管理、处方管理、划价管理和收费管理,而且界面也很漂亮。
处方书写规范及点评培训资料.ppt
用电脑开处方是各大医院的趋势,本软件是为个体诊所、卫生室、老干部门诊及基层医疗单位量体裁衣定做的门诊电子处方管理软件,全傻瓜化设计,界面操作一目了然,即使您是电脑新手,甚至不会打字,也可以很方便的使用...
卫生所门诊电子处方软件是一款可以用电脑开处方是各大医院的趋势,是为个体诊所、卫生室、老干部门诊及基层医疗单位量体裁衣定做的门诊电子处方管理软件,全傻瓜化设计,界面操作一目了然,即使您是电脑新手,甚至...
胜维电子处方管理系统是一款非常好用且功能强大的专为医师开发的门诊接诊软件;实现了患者档案保存、电子病历书写、电子处方书写和资料查阅统计等功能;U盘运行可实现移动办公,可引模板资料和患者历史记录进行修改...