本文是自己学习所做笔记。欢迎转载。但请注明出处: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();

}

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

保存记事

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

保存记事的思想就是取出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();

//结束当前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("\r|\n|\t", " ");

return title;

}

}

strBuff.append(context.substring(startIndex, context.length()));

//统一将回车,等特殊字符换成空格

title = strBuff.toString().replaceAll("\r|\n|\t", " ");

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();

}

以上。就实现了记事的保存,改动,删除的功能,到此。记事本的功能已基本完毕,剩下的就是兴许的完好与优化。以及新增功能了。

android mysql 记事本_android项目 之 记事本(11) ----- 加入数据库相关推荐

  1. android mysql项目实例_android项目中单实例数据库类

    一.数据库操作 package com.ping.db; import android.content.Context; import android.database.sqlite.SQLiteDa ...

  2. android mysql 图片_android sqlite添加图片到数据库

    sqlite图片是怎么储存的呢?其实是二进制的方式存储的 blob代表使用二进制储存 (更多类型参考:数据库简介) 在创建表的地方,VALUE_PIC代表存储图片字段,blob代表这个字段是以二进制储 ...

  3. android mysql 乱码_android POST数据遇到的UTF-8编码(乱码)问题解决办法

    今天遇到这样一个bug:客户端POST到服务器的一段数据导致服务器端发生未知异常.服务器端确认是编码转换错误.于是截取网络数据包进行分析,发现客户端POST的json数据中包含下面一段(hex形式): ...

  4. Android小项目:记事本

    前几天写了一个Android记事本小程序,现在记录一下. 项目源码地址在文章最后. 考虑到是记事本小程序,记录的内容只有文字,而且内容不会太长,所以选择使用SQLite数据库,数据存放在用户的手机上. ...

  5. Android:实现安卓小程序-记事本(备忘录)的开发

    目录 1. 前言 2. 记事本功能需求 3. 部分关键代码解析及程序截图 3.1 记事本类的基本设计 3.2 记事本的数据存储设计 3.3 主界面的设计 3.4 记事本的编辑 3.5 记事本的背景色设 ...

  6. Android studio诗词app古诗词中国风记事本ui设计中国古诗词

    Android studio诗词app古诗词中国风记事本ui设计中国古诗词 界面设计: 视频介绍: Android 中国风诗词记录诗词记事本Android studio编译Android笔记本记事本 ...

  7. QT小项目------>记事本

    mainwindow.h文件: #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <Q ...

  8. android小作业,Android studio写的备忘录(记事本)| CSDN打卡

    ** Android studio写的备忘录(记事本) 一个简单的备忘录,初学者可以参考 样子如图所示(关注升级版在后面) 上视频演示 升级后 源码下载

  9. android mysql 数据库文件_android mysql数据库文件

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

最新文章

  1. Debian 9 安装ASP .NET CORE
  2. 本地化在ASP.NET 2.0中的实现
  3. python解一元二次方程步骤-Python实现求解一元二次方程的方法示例
  4. python课程与c+课程有什么不同-Python学习之二:Python 与 C 区别
  5. oracle层次化查询
  6. 冤冤相报何时了?奥克斯、格力再互怼,“周一见”
  7. 学习React中遇到的问题
  8. 测试游戏帧率电脑温度的软件,游戏中显示帧数和温度方法_游戏画面中实时显示FPS帧数温度技巧...
  9. matlab圆孔孔壁应力集中,matlab 有限元分析平面问题的小孔应力集中问题的程序 - 下载 - 搜珍网...
  10. 窗体 dialog 弹出时动画效果
  11. python写邮箱系统登录_Python selenium登录163邮箱示例
  12. 中国可以用计算机吗,能用计算器吗?中国小学四年级数学题让外国大学生崩溃!...
  13. 一文了解新一代信息技术
  14. ctfshow-菜狗杯-抽老婆
  15. oracle的日期时间转换日期,oracle 的时间日期转换函数
  16. 【逻辑思维训练 二】系统思维训练
  17. 【map】高德地图点聚合—按索引聚合
  18. android 2.3.6Gallary源码导入到Eclipse中编译
  19. 深入理解Java内存模型(JMM和volatile关键词)
  20. 【大数据】为什么要学习大数据

热门文章

  1. 从Java到Go面向对象--类的定义和实例化对象
  2. maven进行junit测试时报错(二)
  3. Kruskal HDOJ 1233 还是畅通工程
  4. arm-linux-gcc的安装
  5. linux DNS辅域
  6. 用Command实现校验器
  7. linux centos7 /tmp目录 自动清理规则
  8. cve-2018-7600 drupal核心远程代码执行漏洞分析
  9. centos7 network-manager 与 interfaces 冲突
  10. linux stdin STDIN_FILENO 区别