android项目 之 记事本(11) ----- 添加数据库

这节就来为我们的记事本添加数据库支持,这样,就可以在添加记事后将其保存在数据库中,方便下次浏览,修改,删除等。

先看效果图:

三张图片分别演示了保存记事,查看记事,删除记事。

对于数据库而言,无非就是涉及到数据库的创建,增删改查。

为了将数据库的操作封装起来,单独写了一个类,如下:

数据库操作

DatabaseOperation.java

[java] view plaincopy

  1. import android.content.Context;
  2. import android.database.Cursor;
  3. import android.database.sqlite.SQLiteDatabase;
  4. import android.widget.Toast;
  5. public class DatabaseOperation {
  6. private SQLiteDatabase db;
  7. private Context context;
  8. public DatabaseOperation(Context context,SQLiteDatabase db) {
  9. this.db = db;
  10. this.context = context;
  11. }
  12. //数据库的打开或创建
  13. public void create_db(){
  14. //创建或打开数据库
  15. db = SQLiteDatabase.openOrCreateDatabase(context.getFilesDir().toString()+"/mynotes.db3", null);
  16. db.execSQL("DROP TABLE IF EXISTS studentScore");
  17. if(db == null){
  18. Toast.makeText(context,"数据库创建不成功",Toast.LENGTH_LONG).show();
  19. }
  20. //Toast.makeText(context,"数据库创建成功",Toast.LENGTH_LONG).show();
  21. //创建表
  22. db.execSQL("create table if not exists notes(_id integer primary key autoincrement," +
  23. "title text," +
  24. "context text," +
  25. "time varchar(20))");
  26. }
  27. public void insert_db(String title,String text,String time){
  28. if(text.isEmpty()){
  29. Toast.makeText(context, "各字段不能为空", Toast.LENGTH_LONG).show();
  30. }
  31. else{
  32. db.execSQL("insert into notes(title,context,time) values(‘"+ title+"‘,‘"+ text+ "‘,‘"+time+"‘);");
  33. //Toast.makeText(context, "插入成功", Toast.LENGTH_LONG).show();
  34. }
  35. }
  36. public void update_db(String title,String text,String time,int item_ID){
  37. if( text.isEmpty()){
  38. Toast.makeText(context, "各字段不能为空", Toast.LENGTH_LONG).show();
  39. }
  40. else{
  41. //String sql = "update main set class1=‘" + class1 + "‘,class2=‘" + class2 + "‘,class3=‘" + class4 + "‘,class4=‘" + class4 + "‘where days=‘" + days + "‘;";
  42. db.execSQL("update notes set context=‘"+text+ "‘,title=‘"+title+"‘,time=‘"+time+"‘where _id=‘" + item_ID+"‘");
  43. //Toast.makeText(context, "修改成功", Toast.LENGTH_LONG).show();
  44. }
  45. }
  46. public Cursor query_db(){
  47. Cursor cursor = db.rawQuery("select * from notes",null);
  48. return cursor;
  49. }
  50. public Cursor query_db(int item_ID){
  51. Cursor cursor = db.rawQuery("select * from notes where _id=‘"+item_ID+"‘;",null);
  52. return cursor;
  53. }
  54. public void delete_db(int item_ID){
  55. db.execSQL("delete from notes where _id=‘" + item_ID+"‘");
  56. //Toast.makeText(context, "删除成功", Toast.LENGTH_LONG).show();
  57. }
  58. //关闭数据库
  59. public void close_db(){
  60. db.close();
  61. }
  62. }

有了这些数据库的相关操作,下面就开始实现保存记事,修改记事,删除记事,查询记事的功能。

保存记事

当编辑好一个记事时,这时点击顶部的保存按钮,就将所写的记事插入到数据库中,当然了,如果记事里面有图片,录音等,并没有图片,录音本身存储到数据库,
而是将其所在路径存储在数据库中,等到再次查看时,再从数据库中读取,并根据所保存的路径取出源文件。

保存记事的思想就是取出EditText中的内容,并从中截取前一部分作为该记事的标题,以及同时也保存了添加记事的时间。

主要代码为:

[java] view plaincopy

  1. //取得EditText中的内容
  2. String context = et_Notes.getText().toString();
  3. if(context.isEmpty()){
  4. Toast.makeText(AddActivity.this, "记事为空!", Toast.LENGTH_LONG).show();
  5. }
  6. else{
  7. //取得当前时间
  8. SimpleDateFormat   formatter   =   new   SimpleDateFormat   ("yyyy-MM-dd HH:mm");
  9. Date   curDate   =   new   Date(System.currentTimeMillis());//获取当前时间
  10. String   time   =   formatter.format(curDate);
  11. //截取EditText中的前一部分作为标题,用于显示在主页列表中
  12. String title = getTitle(context);
  13. //打开数据库
  14. dop.create_db();
  15. //判断是更新还是新增记事
  16. if(editModel.equals("newAdd")){
  17. //将记事插入到数据库中
  18. dop.insert_db(title,context,time);
  19. }
  20. //如果是编辑则更新记事即可
  21. else if(editModel.equals("update")){
  22. dop.update_db(title,context,time,item_Id);
  23. }
  24. dop.close_db();
  25. //结束当前activity
  26. AddActivity.this.finish();
  27. }

其中, getTitle()函数就是为了截取记事正文的前15字作为该记事的标题;editModel表示当前是新增记事还是修改记事。getTitle()如下:

[java] view plaincopy

  1. //截取EditText中的前一部分作为标题,用于显示在主页列表中
  2. private String getTitle(String context){
  3. //定义正则表达式,用于匹配路径
  4. Pattern p=Pattern.compile("/([^\\.]*)\\.\\w{3}");
  5. Matcher m=p.matcher(context);
  6. StringBuffer strBuff = new StringBuffer();
  7. String title = "";
  8. int startIndex = 0;
  9. while(m.find()){
  10. //取出路径前的文字
  11. if(m.start() > 0){
  12. strBuff.append(context.substring(startIndex, m.start()));
  13. }
  14. //取出路径
  15. String path = m.group().toString();
  16. //取出路径的后缀
  17. String type = path.substring(path.length() - 3, path.length());
  18. //判断附件的类型
  19. if(type.equals("amr")){
  20. strBuff.append("[录音]");
  21. }
  22. else{
  23. strBuff.append("[图片]");
  24. }
  25. startIndex = m.end();
  26. //只取出前15个字作为标题
  27. if(strBuff.length() > 15){
  28. //统一将回车,等特殊字符换成空格
  29. title = strBuff.toString().replaceAll("\r|\n|\t", " ");
  30. return title;
  31. }
  32. }
  33. strBuff.append(context.substring(startIndex, context.length()));
  34. //统一将回车,等特殊字符换成空格
  35. title = strBuff.toString().replaceAll("\r|\n|\t", " ");
  36. return title;
  37. }

这里主要是用到了正则表达式,用于匹配是普通文字还是图片录音等,如果是图片录音,则在标题中显然图片录音文字即可,这里还用到了一个技巧,就是return 的上一句,目的就是为了将标题中的回车等特殊字符统一换成空格。

浏览(修改)记事

在保存了记事后,当然就要从数据库取出,并以原来的格式显示给用户。设想一下,在新增了记事后,返回主页或者重新进入主页,就应该看到当前已保存的记事列
表,所以在主页的Activity中应该放置一个列表(ListView)用于显示从数据库中取出的数据。当点击列表的项目时,就应该打开查看该记事的详
细内容了。

因为在保存记事时已经截取了一部分作为标题,所以在主页记事列表上只显示标题,时间,而不显然详细内容。主要代码下:

[java] view plaincopy

  1. private SQLiteDatabase db;
  2. private DatabaseOperation dop;
  3. private ListView lv_notes;
  4. ......
  5. //数据库操作
  6. dop = new DatabaseOperation(this, db);
  7. lv_notes = (ListView)findViewById(R.id.lv_notes);
  8. //显示记事列表
  9. showNotesList();
  10. //为记事列表添加监听器
  11. lv_notes.setOnItemClickListener(new ItemClickEvent());

其中,showNotesList()就是用来显然记事列表的,如下:

[java] view plaincopy

  1. //显示记事列表
  2. private void showNotesList(){
  3. //创建或打开数据库
  4. dop.create_db();
  5. Cursor cursor = dop.query_db();
  6. SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
  7. R.layout.note_item,
  8. cursor,
  9. new String[]{"_id","title","time"}, new int[]{R.id.tv_note_id,R.id.tv_note_title,R.id.tv_note_time});
  10. lv_notes.setAdapter(adapter);
  11. dop.close_db();
  12. }

上面只实现了浏览记事列表的功能,那么点击列表项目,自然就是查看或修改记事的详细内容了,所以为列表添加单击事件,并在其监听器中实现从数据库读取相应的记事内容,并显示,如下:

[java] view plaincopy

  1. //记事列表单击监听器
  2. class ItemClickEvent implements OnItemClickListener{
  3. @Override
  4. public void onItemClick(AdapterView<?> parent, View view, int position,
  5. long id) {
  6. tv_note_id = (TextView)view.findViewById(R.id.tv_note_id);
  7. int item_id = Integer.parseInt(tv_note_id.getText().toString());
  8. Intent intent = new Intent(MainActivity.this,AddActivity.class);
  9. intent.putExtra("editModel", "update");
  10. intent.putExtra("noteId", item_id);
  11. startActivity(intent);
  12. }
  13. }

这样,当单击一个列表项时,就会新打开一个activity,用于显示记事的详细内容,这里依然用的是新增记事Activity,这样做的好处就是在查看
记事的同时,也可以修改,这也是大多数记事软件所采用的方法,而且,也能过intent将一些信息传递给AddActivity,其中editModel
是编辑模式,因为这里是查看或者修改,所以当再次点击保存时,就更新原有的记事即可,并不是又新增加一条记事;noteId是为了让
AddActivity知道该读取数据库的中那一条数据。相应的,要在AddActivity里添加代码取出数据并显示,主要代码如下:

[java] view plaincopy

  1. //加载数据
  2. private void loadData(){
  3. //如果是新增记事模式,则将editText清空
  4. if(editModel.equals("newAdd")){
  5. et_Notes.setText("");
  6. }
  7. //如果编辑的是已存在的记事,则将数据库的保存的数据取出,并显示在EditText中
  8. else if(editModel.equals("update")){
  9. tv_title.setText("编辑记事");
  10. dop.create_db();
  11. Cursor cursor = dop.query_db(item_Id);
  12. cursor.moveToFirst();
  13. //取出数据库中相应的字段内容
  14. String context = cursor.getString(cursor.getColumnIndex("context"));
  15. //定义正则表达式,用于匹配路径
  16. Pattern p=Pattern.compile("/([^\\.]*)\\.\\w{3}");
  17. Matcher m=p.matcher(context);
  18. int startIndex = 0;
  19. while(m.find()){
  20. //取出路径前的文字
  21. if(m.start() > 0){
  22. et_Notes.append(context.substring(startIndex, m.start()));
  23. }
  24. SpannableString ss = new SpannableString(m.group().toString());
  25. //取出路径
  26. String path = m.group().toString();
  27. //取出路径的后缀
  28. String type = path.substring(path.length() - 3, path.length());
  29. Bitmap bm = null;
  30. Bitmap rbm = null;
  31. //判断附件的类型,如果是录音文件,则从资源文件中加载图片
  32. if(type.equals("amr")){
  33. bm = BitmapFactory.decodeResource(getResources(), R.drawable.record_icon);
  34. //缩放图片
  35. rbm = resize(bm,200);
  36. }
  37. else{
  38. //取出图片
  39. bm = BitmapFactory.decodeFile(m.group());
  40. //缩放图片
  41. rbm = resize(bm,480);
  42. }
  43. //为图片添加边框效果
  44. rbm = getBitmapHuaSeBianKuang(rbm);
  45. System.out.println(rbm.getWidth()+"-------"+rbm.getHeight());
  46. ImageSpan span = new ImageSpan(this, rbm);
  47. ss.setSpan(span,0, m.end() - m.start(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  48. et_Notes.append(ss);
  49. startIndex = m.end();
  50. }
  51. //将最后一个图片之后的文字添加在TextView中
  52. et_Notes.append(context.substring(startIndex,context.length()));
  53. dop.close_db();
  54. }
  55. }

这里同样是用到了正则表达式,因为要识别路径。通过这个方法,在每次打开AddActivity时调用该方法,即能适用于新增记事,也可以用于修改记事。

删除记事

删除记事的实现还是在主页Activity中实现,当长按列表项目时,弹出操作选择,共有两个,一个是编辑,一个是删除,这里的编辑是和单击列表项的查看记事的功能一样,主要是删除,当选中了删除时,就将相应的记事条目从数据库中删除,并刷新列表。主要代码如下:

[java] view plaincopy

    1. ......
    2. //为记事列表添加长按事件
    3. lv_notes.setOnItemLongClickListener(new ItemLongClickEvent());
    4. ......
    5. //记事列表长按监听器
    6. class ItemLongClickEvent implements OnItemLongClickListener{
    7. @Override
    8. public boolean onItemLongClick(AdapterView<?> parent, View view,
    9. int position, long id) {
    10. tv_note_id = (TextView)view.findViewById(R.id.tv_note_id);
    11. int item_id = Integer.parseInt(tv_note_id.getText().toString());
    12. simpleList(item_id);
    13. return true;
    14. }
    15. }
    16. //简单列表对话框,用于选择操作
    17. public void simpleList(final int item_id){
    18. AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this,R.style.custom_dialog);
    19. alertDialogBuilder.setTitle("选择操作");
    20. alertDialogBuilder.setIcon(R.drawable.ic_launcher);
    21. alertDialogBuilder.setItems(R.array.itemOperation, new android.content.DialogInterface.OnClickListener() {
    22. @Override
    23. public void onClick(DialogInterface dialog, int which) {
    24. switch(which){
    25. //编辑
    26. case 0 :
    27. Intent intent = new Intent(MainActivity.this,AddActivity.class);
    28. intent.putExtra("editModel", "update");
    29. intent.putExtra("noteId", item_id);
    30. startActivity(intent);
    31. break;
    32. //删除
    33. case 1 :
    34. dop.create_db();
    35. dop.delete_db(item_id);
    36. dop.close_db();
    37. //刷新列表显示
    38. lv_notes.invalidate();
    39. showNotesList();
    40. break;
    41. }
    42. }
    43. });
    44. alertDialogBuilder.create();
    45. alertDialogBuilder.show();
时间: 2024-12-09 14:50:55

android项目 之 记事本(11) ----- 添加数据库的相关文章

android项目 之 记事本(5)----- 添加录音

有时,需要将重要的事以语音的形式记录下来,这个在生活中很常见,今天就为记事本添加录音的功能,先看图: 其实在第一节界面设计中,可以看出记事本的功能选项,其中底部选项栏的第三个就是添加录音.   主要步骤如下:               1.   录音Activity的界面设计.               2.   在语音按钮的监听器中添加Intent,跳转到录音Activity,这里同样是用startActivityforResult(Intent intent,int requestCod

android项目 之 记事本(15) ----- 保存手写及绘图

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 之前,忘了写如何将手写和绘图保存,现在补上. 首先看如何保存绘图,先看效果图: 因为记事本的绘图功能主要用到了画布,而在构建画布时,指定了Bitmap,也就是说在画布上的所画的东西都被保存在了Bitmap中,因此,我们只要保存该Bitmap,就可以将我们的所绘制的图形以图片的形式保存,主要代码如下: /* * 保存所绘图形 * 返回绘图文件的存储路径 * */ public S

android项目 之 记事本(12) ----- 图片的等比例缩放及给图片添加边框

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 在Android的UI开发中经常会遇到图片的缩放,就比如记事本,现在的图片都比较大,如果将原图不经缩放直接放在屏幕上,则会占满整个屏幕,而且有时图片会比屏幕还大,这时就不能完全的显示整个图片,所以,必须要进行缩放,但在缩放时,该如何缩放呢,长和宽的缩放比例设置为多少合适呢,为了保持原图的纵横比,所以要最好的方法就是约束缩放比例,也就是等比例缩放,相信大家都用过PS中的缩放图片的

android项目 之 记事本(6)----- 添加手写

想必大家都用过QQ的白板功能,里面主要有两项,一个是涂鸦功能,其实类似于上节的画板功能,而另一个就是手写,那记事本怎么能没有这个功能呢,今天就来为我们的记事本添加手写功能. 先上图,看看效果: 看了效果图,是不是心动了呢?那就赶紧着手做吧,其实,手写功能并不难实现,大体就是全屏书写,定时发送handle消息,更新activity. 实现手写功能的主要步骤: 1. 自定义两个View,一个是TouchView,用于在上面画图,另一个是EditText,用于将手写的字显示在其中,并且,要将两个自定义

Android菜鸟成长记11 -- sqlite数据库的设计和升降级

Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小. 2.独立性 SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的"安装". 3.隔离性 SQLite 数据库中所有的信息(比如表.视图.触发器等)都包含在一个文件夹内,方便管理和维护. 4.跨平台 SQLite 目前

android项目 之 记事本(13) ----- 查看图片及播放录音

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 今天就来实现下查看图片及录音的功能,在编辑或者浏览记事时,点击图片,打开一个自定义Activity(当然了,也可以调用系统的图库来查看)来查看所添加的图片的原始图片,而不是缩放后的图片,同理,用自定义Activity来查看录音文件,实现播放录音的功能.上图: 从图中也可以看出,我们首先要创建两个Activity,当然了,布局文件也是少不了的,如下: activity_show_

android项目 之 记事本(7)----- 手写功能之删除、恢复和清空

上一节,为记事本添加了手写的功能,但是没有实现底部按钮的各种功能,这节就先实现撤销,恢复和清空的功用. 因为不会录制屏幕成gif图片,所以就以图片形式给出吧,不是很形象,凑合着看: 显然,需要为底部GridView的添加item单击事件: private GridView paint_bottomMenu; paint_bottomMenu = (GridView)findViewById(R.id.paintBottomMenu); paint_bottomMenu.setOnItemClic

android项目 之 记事本(14) ----- 手势缩放与拖拽图片

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 上节实现了查看图片及录音的功能,其中查看图片,可以调用系统的图库来查看图片,也可以自定义Activity来查看图片,今天就在上节的基础上,实现手势缩放与拖拽图片. 想必大家都用过系统的图库,浏览图片时,可以通过手势放大或缩小图片,旋转图片,拖拽图片等功能,我们也为自已定义的查看图片的Activity增加手势缩放与拖拽图片的功能,效果如下图: 上面四幅图中,演示了通过手势(多点触

android项目 之 记事本(10) ----- 手写功能之设置画笔大小和画笔颜色

上一节,实现了画板的所有功能,包括设置画笔大小,设置画笔颜色,橡皮擦等功能,而手写,也可以添加设置笔迹大小和颜色的功能,这节就顺势实现手写的调整笔迹大小和调整笔迹的颜色. 先看图: 其实,手写和画板的这些功能都类似,直接复用之前的代码就行,原理如下:      1. 设置画笔大小的功能:                    1)初始化画笔. 2)设置画笔的大小为所选择的大小. 3)用一个变量记住当前画笔的大小,用于在进行其他操作后还保持之前设置的画笔大小. 2. 设置画笔颜色的功能: