个人日记本的实现

来源:互联网 发布:java 两种数据类型 编辑:程序博客网 时间:2024/04/28 21:01

实现个人日记本的效果如下,如果点击进入可以对原日记进行修改,点击菜单可以添加或者删除一篇日记:


首先,先创建日记实体类,代码如下:

package com.example.mydiary.entity;import java.text.SimpleDateFormat;import java.util.Date;/** * 日记实体类 *  * @author 刘玲琳 *  */public class Diary {private Integer id;// 日记编号private String title;// 日记标题private String content;// 日记内容private String datetime;// 写日记的时间public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String getDatetime() {SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 hh时:mm分:ss秒");String datetime = format.format(new Date());return datetime;}public void setDatatime(String datetime) {this.datetime = datetime;}public Diary(String title, String content, String datetime) {super();this.title = title;this.content = content;this.datetime = datetime;}public Diary(String title, String content, String datetime,Integer id) {super();this.id = id;this.title = title;this.content = content;this.datetime = datetime;}public Diary() {}}
其次,创建数据库辅助类,代码如下:

package com.example.mydiary.service;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;/** * 数据库辅助类 *  * @author 刘玲琳 *  */public class DBOpenHelper extends SQLiteOpenHelper {public static final String DATABASE_NAME = "mydiary.db";// 数据库的名称public static final int DATABASE_VERSION = 1;// 父类没有提供默认构造器public DBOpenHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);// 第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类// 如果设置为null,代表使用系统默认的工厂类。从数据库中查询出来的结果是需要通过这个游标进行访问的}/* * 数据库第一次被创建出来的时候才会被调用,只会调用一次 完成数据库中表的创建SQLiteDatabase类主要是为了操作数据库的 */@Overridepublic void onCreate(SQLiteDatabase db) {String sql = "create table mydiary(_id integer primary key autoincrement,title varchar(20),content varchar(1000),datetime)";db.execSQL(sql);}/* * 数据库的版本发生改变的时候,一般是在软件升级的时候会调用 */@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}
第三,创建日记操作类,代码如下:

package com.example.mydiary.service;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import com.example.mydiary.entity.Diary;public class DiaryService {private DBOpenHelper dbOpenHelper;private SQLiteDatabase sqLiteDatabase;public DiaryService(Context context) {dbOpenHelper = new DBOpenHelper(context);}/* * 保存日记 */public void save(Diary diary) {System.out.println("title:"+diary.getTitle());System.out.println("content:"+diary.getContent());// 如果要对数据进行更改,就调用此方法,以读写的方式打开数据库sqLiteDatabase = dbOpenHelper.getWritableDatabase();String sql = "insert into mydiary(title,content,datetime)values(?,?,?)";sqLiteDatabase.execSQL(sql,new String[] { diary.getTitle(), diary.getContent(),diary.getDatetime() });System.out.println("datetime:"+new Diary().getDatetime());}/* * 根据id删除日记 */public void delete(Integer id) {// 得到同一个数据库实例sqLiteDatabase = dbOpenHelper.getWritableDatabase();String sql = "delete from mydiary where _id=?";sqLiteDatabase.execSQL(sql, new Object[] { id });}/* * 更新日记 */public void update(Diary diary) {System.out.println("title:"+diary.getTitle());System.out.println("content:"+diary.getContent());// 得到同一个数据库实例sqLiteDatabase = dbOpenHelper.getWritableDatabase();String sql = "update mydiary set title=?,content=?,datetime=? where _id=?";sqLiteDatabase.execSQL(sql,new Object[] { diary.getTitle(), diary.getContent(),new Diary().getDatetime(), diary.getId() });System.out.println("datetime:"+new Diary().getDatetime());}/* * 根据id查找日记 */public Diary find(Integer id) {Diary diary = null;sqLiteDatabase = dbOpenHelper.getReadableDatabase();String sql = "select * from mydiary where _id=?";// 得到游标,最多只有一条数据Cursor cursor = sqLiteDatabase.rawQuery(sql,new String[] { id.toString() });// 如果移动成功就代表存在if (cursor.moveToNext()) {// 只能根据列的索引来获得字段值String title = cursor.getString(cursor.getColumnIndex("title"));String content = cursor.getString(cursor.getColumnIndex("content"));String datetime = cursor.getString(cursor.getColumnIndex("datetime"));diary = new Diary(title, content, datetime);}cursor.close();return diary;}/* * 分页查询 */public List<Diary> getDiariesByPage(Integer offset, Integer maxResult) {Diary diary=null;List<Diary> diaries = new ArrayList<Diary>();sqLiteDatabase=dbOpenHelper.getReadableDatabase();String sql="select * from mydiary limit ?,?";// 得到游标,最多只有一条数据Cursor cursor=sqLiteDatabase.rawQuery(sql, new String[]{offset.toString(),maxResult.toString()});// 如果移动成功就代表存在if(cursor.moveToNext()){String title=cursor.getString(cursor.getColumnIndex("title"));String content=cursor.getString(cursor.getColumnIndex("content"));String datetime=cursor.getString(cursor.getColumnIndex("datetime"));diary=new Diary(title, content, datetime);diaries.add(diary);}return diaries;}/* * 得到所有的日记 */public List<Diary> getAllDairies() {Diary diary=null;List<Diary> diaries = new ArrayList<Diary>();sqLiteDatabase=dbOpenHelper.getReadableDatabase();String sql="select * from mydiary";// 得到游标,最多只有一条数据Cursor cursor=sqLiteDatabase.rawQuery(sql, null);// 如果移动成功就代表存在while(cursor.moveToNext()){String title=cursor.getString(cursor.getColumnIndex("title"));String content=cursor.getString(cursor.getColumnIndex("content"));String datetime=cursor.getString(cursor.getColumnIndex("datetime"));diary=new Diary(title, content, datetime);diary.setId(Integer.parseInt(cursor.getString(0)));diaries.add(diary);}cursor.close();return diaries;}/* * 获取记录总数 */public long count() {long count=0;sqLiteDatabase=dbOpenHelper.getReadableDatabase();String sql="select count(*) from mydiary";Cursor cursor=sqLiteDatabase.rawQuery(sql, null);cursor.moveToFirst();count=cursor.getLong(0);cursor.close();return count;}}
第四,创建单元测试类,测试日记操作类是否正确,代码如下:

package com.example.mydiary.test;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;import com.example.mydiary.entity.Diary;import com.example.mydiary.service.DBOpenHelper;import com.example.mydiary.service.DiaryService;import android.test.AndroidTestCase;/** * 单元测试类 *  * @author 刘玲琳 *  */public class DiaryServiceTest extends AndroidTestCase {/* *  创建数据库 */public void testCreateDB() {DBOpenHelper dbOpenHelper = new DBOpenHelper(getContext());dbOpenHelper.getWritableDatabase();// 第一次调用该方法,会帮我们自动创建出数据库}/* *  保存日记 */public void testSave() {DiaryService diaryService = new DiaryService(getContext());Diary diary1 = new Diary("jason", "He sings so great!", getCurrentTime());Diary diary2 = new Diary("nana", "She says so great!", getCurrentTime());Diary diary3 = new Diary("hito", "he ays so bad!", getCurrentTime());Diary diary4 = new Diary("hejiong", "he says so good!", getCurrentTime());Diary diary5 = new Diary("weijia", "he sings so bad!", getCurrentTime());diaryService.save(diary1);diaryService.save(diary2);diaryService.save(diary3);diaryService.save(diary4);diaryService.save(diary5);}public String getCurrentTime() {SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 hh时:mm分:ss秒");String data = format.format(new Date());return data;}/* *  删除日记 */public void testDelete(){DiaryService diaryService=new DiaryService(getContext());diaryService.delete(1);}/* *  更新日记 */public void testUpdate(){DiaryService diaryService=new DiaryService(getContext());Diary diary=new Diary("nana", "she is beautiful", getCurrentTime(),2);diaryService.update(diary);}/* *  根据id查找日记 */public void testFind(){DiaryService diaryService=new DiaryService(getContext());Diary diary=diaryService.find(2);System.out.println(diary.getTitle());}/* *  分页查询 */public void testGetDiariesByPage(){DiaryService diaryService=new DiaryService(getContext());List<Diary> diaries=diaryService.getDiariesByPage(0, 2);System.out.println(diaries);}/* *  得到所有日记 */public void testGetAllDairies(){DiaryService diaryService=new DiaryService(getContext());List<Diary> diaries=diaryService.getAllDairies();System.out.println(diaries);}/* *  获取记录总数 */public void testCount(){DiaryService diaryService=new DiaryService(getContext());long count=diaryService.count();System.out.println(count);}}
第五,对程序进行布局,写了三个xml文件,代码分别如下:

1.activity_my_diary.xml:

<?xml version="1.0" encoding="utf-8"?><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:orientation="horizontal" >   <ListView        android:id="@+id/listView"       android:layout_width="fill_parent"       android:layout_height="fill_parent"></ListView></RelativeLayout>
2.title_list.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal" >    <!-- 左边部分显示日记题目  -->    <TextView         android:id="@+id/title"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textSize="20dp"/>    <!-- 右边部分显示时间 -->    <TextView         android:id="@+id/datetime"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:gravity="right"        android:textSize="15dp"/></LinearLayout>
3.activity_diary.xml:

<LinearLayout 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:orientation="vertical">    <!-- 题目  -->    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/title"        tools:context=".DiaryActivity"         android:textSize="20dp"/>    <!-- 输入题目的对话框  -->    <EditText         android:id="@+id/putTitle"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:inputType="text"/>    <!-- 内容  -->    <TextView         android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/content"        android:textSize="20dp"/>    <!-- 输入内容的对话框  -->    <EditText         android:id="@+id/putContent"        android:layout_width="fill_parent"        android:layout_height="150dp"        android:inputType="text"        android:gravity="top"/>    <!-- 保存按钮  -->    <Button         android:id="@+id/save"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/save"        android:textSize="20dp"/></LinearLayout>
第六,Activity的实现方法,代码分别如下:

1.MyDiaryActivity.java:

package com.example.mydiary;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.example.mydiary.R;import com.example.mydiary.entity.Diary;import com.example.mydiary.service.DiaryService;import android.os.Bundle;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;import android.support.v4.app.NavUtils;public class MyDiaryActivity extends Activity {private ListView listView;private List<Map<String, Object>> data;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_my_diary);listView = (ListView) this.findViewById(R.id.listView);data = getData();SimpleAdapter adapter = new SimpleAdapter(this, data,R.layout.title_list, new String[] { "title", "datetime" },new int[] { R.id.title, R.id.datetime });listView.setAdapter(adapter);listView.setOnItemClickListener(new ListViewHandle());}    /*     *  处理ListView点击事件的方法     */private class ListViewHandle implements OnItemClickListener{@Overridepublic void onItemClick(AdapterView<?> adapter, View view, int position,long arg3) {Intent intent=new Intent(MyDiaryActivity.this, DiaryActivity.class);Bundle bundle=new Bundle();String position1=Integer.toString(position+1);bundle.putString("message", "修改");bundle.putString("position", position1);System.out.println("checked "+position1);intent.putExtras(bundle);startActivity(intent);}}private List<Map<String, Object>> getData() {data = new ArrayList<Map<String, Object>>();    DiaryService diaryService = new DiaryService(this);    List<Diary> listDiary = diaryService.getAllDairies();    Map<String,Object> item = new HashMap<String,Object>();        for(Diary diary:listDiary){    item = new HashMap<String, Object>();    item.put("title", diary.getTitle());    item.put("content", diary.getContent());    item.put("datetime",diary.getDatetime());    item.put("id", diary.getId());    System.out.println("item="+item.get("title"));    data.add(item);    }        return data;}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// 获得当前菜单,并填充菜单getMenuInflater().inflate(R.menu.activity_my_diary, menu);return true;}    /*     *  对菜单点击事件进行处理     */@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch(item.getItemId()){case R.id.add:Intent intent=new Intent(MyDiaryActivity.this, DiaryActivity.class);Bundle bundle=new Bundle();bundle.putString("message", "新建");bundle.putString("position", "0");intent.putExtras(bundle);startActivity(intent);break;case R.id.delete:showDialog(1);break;}return super.onOptionsItemSelected(item);}/* *  建立对话框 */@Overridepublic Dialog onCreateDialog(int id) {switch(id){case 1:return buildDialog(MyDiaryActivity.this);}return null;}    /*     *  buildDialog方法     */private Dialog buildDialog(Context context) {AlertDialog.Builder builder=new AlertDialog.Builder(context);builder.setTitle(R.string.title1);builder.setMessage(R.string.message);// 确定按钮builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {DiaryService diaryService=new DiaryService(getApplicationContext());System.out.println((int) (listView.getSelectedItemId()+1));// 调用 listview.getSelectedItemId()来获得id diaryService.delete((int) (listView.getSelectedItemId()+1));Toast.makeText(MyDiaryActivity.this, "删除成功!", Toast.LENGTH_LONG).show();onRestart();}});// 取消按钮builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}});return builder.create();}@Overridepublic void onRestart() {super.onRestart();listView = (ListView) this.findViewById(R.id.listView);data = getData();SimpleAdapter adapter = new SimpleAdapter(this, data,R.layout.title_list, new String[] { "title", "datetime" },new int[] { R.id.title, R.id.datetime });listView.setAdapter(adapter);listView.setOnItemClickListener(new ListViewHandle());}}

2.DiaryActivity.java:

package com.example.mydiary;import com.example.mydiary.entity.Diary;import com.example.mydiary.service.DiaryService;import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class DiaryActivity extends Activity {private EditText title;private EditText content;private Button save;String message;int position;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_diary);title = (EditText) this.findViewById(R.id.putTitle);content = (EditText) this.findViewById(R.id.putContent);save=(Button) this.findViewById(R.id.save);DiaryService diaryService = new DiaryService(this);Intent intent = this.getIntent();Bundle bundle = intent.getExtras();message = bundle.getString("message");position = Integer.parseInt(bundle.getString("position"));System.out.println("position:"+position);if (position != 0) {Diary diary = diaryService.find(position);System.out.println(diary.getTitle());title.setText(diary.getTitle());content.setText(diary.getContent());}save.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (message.equals("新建")) {DiaryService diaryService = new DiaryService(getApplicationContext());Diary diary = new Diary();String title1 = title.getText().toString();String content1 = content.getText().toString();System.out.println("title1:"+title1);System.out.println("content1"+content1);diary.setTitle(title1);diary.setContent(content1);diaryService.save(diary);Toast.makeText(DiaryActivity.this, R.string.savesuccess,Toast.LENGTH_LONG).show();}if (message.equals("修改")) {DiaryService diaryService = new DiaryService(getApplicationContext());Diary diary = new Diary();String title1 = title.getText().toString();String content1 = content.getText().toString();System.out.println("title1:"+title1);System.out.println("content1"+content1);diary.setTitle(title1);diary.setContent(content1);diary.setId(position);diaryService.update(diary);Toast.makeText(DiaryActivity.this, R.string.savesuccess,Toast.LENGTH_LONG).show();}}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_diary, menu);return true;}}
到此,基本功能已实现。


原创粉丝点击