實現個人日記本的效果如下,如果點擊進入可以對原日記進行修改,點擊菜單可以添加或者刪除一篇日記:
首先,先創建日記實體類,代碼如下:
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;
}
}
到此,基本功能已實現。