实现个人日记本的效果如下,如果点击进入可以对原日记进行修改,点击菜单可以添加或者删除一篇日记:
首先,先创建日记实体类,代码如下:
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类主要是为了操作数据库的
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table mydiary(_id integer primary key autoincrement,title varchar(20),content varchar(1000),datetime)";
db.execSQL(sql);
}
/*
* 数据库的版本发生改变的时候,一般是在软件升级的时候会调用
*/
@Override
public 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;
@Override
public 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{
@Override
public 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;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 获得当前菜单,并填充菜单
getMenuInflater().inflate(R.menu.activity_my_diary, menu);
return true;
}
/*
* 对菜单点击事件进行处理
*/
@Override
public 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);
}
/*
* 建立对话框
*/
@Override
public 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() {
@Override
public 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() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
return builder.create();
}
@Override
public 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;
@Override
public 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() {
@Override
public 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();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_diary, menu);
return true;
}
}
到此,基本功能已实现。