1,创建数据库,创建表相应类:DBHelper.java继承自SQLiteOpenHelper数据库创建辅助类
DBHelper.java源码:
package cn.bzu.mydiary.DB;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME="mydiary.db";//数据库名称
private static final int DB_VERSION=1;//数据库版本
public DBHelper(Context context) {//上下文
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//建表_id为主键并为自动增长
String sql="create table diary(_id integer primary key autoincrement,title varchar(20),content varchar(1000),createtime)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2.编写日记实体类Diary.java字段与数据库对应
Diary.java源码:
package cn.bzu.mydiary.entity;
public class Diary {
private Integer id;
private String title;
private String content;
private String createtime;
public Diary() {
super();
}
public Diary(String title, String content, String createtime) {
super();
this.title = title;
this.content = content;
this.createtime = createtime;
}
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 getCreatetime() {
return createtime;
}
public void setCreatetime(String createtime) {
this.createtime = createtime;
}
public Diary(Integer id, String title, String content, String createtime) {
this.id = id;
this.title = title;
this.content = content;
this.createtime = createtime;
}
}
3.编写数据库操作类DBDao.java,实现对日记的插入,删除,更新,获取所有的日记,通过主键id来获取日记,实现数据库的计数
package cn.bzu.mydiary.Dao;
import java.util.ArrayList;
import java.util.List;
import java.lang.*;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.UrlQuerySanitizer.ValueSanitizer;
import cn.bzu.mydiary.DB.DBHelper;
import cn.bzu.mydiary.entity.Diary;
public class DBDao {
//DBHelper类的变量
private DBHelper dbHelper;
//传上下文,由Activity传值
public DBDao(Context context) {
dbHelper = new DBHelper(context);
}
//save保存日记
public void save(Diary diary) {
SQLiteDatabase db=dbHelper.getWritableDatabase();
/*ContentValues values=new ContentValues();
values.put("title", diary.getTitle());
values.put("content", diary.getContent());
values.put("createtime", diary.getCreatetime());*/
//?为占位符
String sql="insert into diary(title,content,createtime)values(?,?,?)";
//两个参数,第二个参数Object[]类型的数组,设置数据值
db.execSQL(sql, new String[]{diary.getTitle(),diary.getContent(),diary.getCreatetime()});
//db.insert("diary", null, values);
}
//删除日记
public void deleteDiary(Integer id) {
SQLiteDatabase db=dbHelper.getWritableDatabase();
//db.delete("diary", "_id=?", new String[]{id.toString()});
String sql="delete from diary where _id=?";
db.execSQL(sql,new Object[]{id});
}
//通过id获取日记
public Diary getDiaryById(Integer id) {
Diary diary=null;
SQLiteDatabase db=dbHelper.getReadableDatabase();
//Cursor cursor=db.query("diary", null, null, null, null, "_id=?", null);
String sql="select * from diary where _id=?";
Cursor cursor=db.rawQuery(sql,new String[]{id.toString()});
if(cursor.moveToFirst()){
Integer _id=cursor.getInt(cursor.getColumnIndex("_id"));
String title=cursor.getString(cursor.getColumnIndex("title"));
String content=cursor.getString(cursor.getColumnIndex("content"));
String createtime=cursor.getString(cursor.getColumnIndex("createtime"));
diary = new Diary(title, content, createtime);
diary.setId(_id);
}
return diary;
}
//更新日记
public void updateDiary(Diary diary) {
SQLiteDatabase db=dbHelper.getWritableDatabase();
String sql="update diary set title=?,content=?,createtime=? where _id=?";
db.execSQL(sql, new Object[]{diary.getTitle(),diary.getContent(),diary.getCreatetime(),diary.getId()});
/*ContentValues values=new ContentValues();
values.put("title", diary.getTitle());
values.put("content", diary.getContent());
values.put("createtime", diary.getCreatetime());
db.update("diary", values, "_id=?", new String[]{diary.getId().toString()});
*/
}
//计数日记
public int count(Diary diary) {
int count=0;
SQLiteDatabase db=dbHelper.getReadableDatabase();
//Cursor cursor=db.query("diary", new String[]{"count(*)"}, null, null, null, null, null);
String sql="select count(*) from diary";
Cursor cursor=db.rawQuery(sql,null);
cursor.moveToFirst();
count=cursor.getInt(0);
cursor.close();
return count;
}
//获取所有的日记,返回类型List集合
public List<Diary> getAllDiarys() {
List<Diary> diarys=new ArrayList<Diary>();
//数据库
SQLiteDatabase db=dbHelper.getReadableDatabase();
String sql="select * from diary";
//返回游标,游标指向第一个的前一个位置
//Cursor cursor=db.query("diary", null,null, null, null, null, null);
Cursor cursor=db.rawQuery(sql, null);
//游标要下移,展示每一条记录
while(cursor.moveToNext()){
Integer id=cursor.getInt(cursor.getColumnIndex("_id"));
String title=cursor.getString(cursor.getColumnIndex("title"));
String content=cursor.getString(cursor.getColumnIndex("content"));
String createtime=cursor.getString(cursor.getColumnIndex("createtime"));
//创建Diary的实例
Diary diary=new Diary(id, title, content, createtime);
diarys.add(diary);
}
return diarys;
}
}
4.获取当前时间单独抽出类DateTool.java来实现
package cn.bzu.mydiary.tools;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTool {
public static String getCurrentTime(){
SimpleDateFormat formatter=new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
return formatter.format(new Date());
}
}
5.界面设计,首先进入欢迎界面WelcomeActivity.java,延迟一段时间进入主Activity
package cn.bzu.mydiary;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.widget.ImageView;
import android.widget.ProgressBar;
public class WelcomeActivity extends Activity {
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
imageView=(ImageView) this.findViewById(R.id.im_welcome);
// 创建了一个淡入效果的Animation对象
AlphaAnimation animation = new AlphaAnimation(0.0f, 1.0f);
animation.setDuration(1000);
animation.setStartOffset(500);
imageView.startAnimation(animation);
new Handler().postDelayed(new Runnable()
{// 新建一个handler实现演示跳转
public void run()
{
Intent intent = new Intent();
intent.setClass(WelcomeActivity.this, MainActivity.class);
startActivity(intent);
}
}, 3000);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.welcome, menu);
return true;
}
}
6.进行MainActivity的布局activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@drawable/back"
tools:context=".MainActivity" >
<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
></ListView>
<TextView
android:id="@+id/emptyshow"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="你好懒啊,还没开始写日记呢"/>
</LinearLayout>
7.对列表的每一项的内容进行布局item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/title"
android:layout_height="wrap_content"
android:layout_width="200dip"
android:textColor="#0000ff"
android:textSize="20sp"/>
<TextView
android:id="@+id/createtime"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textColor="#0000ff"
android:textSize="20sp"/>
</LinearLayout>
8.点击MainActitvity的menu实现添加日记的功能布局文件main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/diary_add"
android:icon="@android:drawable/ic_menu_add"
android:title="@string/diary_add" />
</menu>
9.添加日记的布局文件activity_new_diary.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/newdiary"
tools:context=".New_Diary" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#87cefa"
android:text="日记标题" />
<EditText
android:id="@+id/t"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ems="10" >
</EditText>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#87cefa"
android:text="日记内容" />
<EditText
android:gravity="top"
android:id="@+id/c"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<Button
android:id="@+id/confirm"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="确定"/>
</LinearLayout>
10.添加日记实现New_Diary.java源码:
package cn.bzu.mydiary;
import cn.bzu.mydiary.Dao.DBDao;
import cn.bzu.mydiary.entity.Diary;
import cn.bzu.mydiary.tools.DateTool;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class New_Diary extends Activity {
private EditText titleText;
private EditText contentText;
private Button confirm;
private DBDao dbDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new__diary);
dbDao=new DBDao(this);
//获取组件
titleText=(EditText) this.findViewById(R.id.t);
contentText=(EditText) this.findViewById(R.id.c);
confirm=(Button) this.findViewById(R.id.confirm);
confirm.setOnClickListener(new Button.OnClickListener() {
@Override
/**
* 点击确定按钮时,把用户输入的标题,内容,和获取的当前时间添加到数据库中
*/
public void onClick(View v) {
String title=titleText.getText().toString();
String content=contentText.getText().toString();
Diary diary=new Diary(title, content, DateTool.getCurrentTime());
dbDao.save(diary);
//添加完毕,跳转到MainActivity中,查看数据是否添加成功
Intent intent=new Intent();
intent.setClass(New_Diary.this, MainActivity.class);
startActivity(intent);
finish();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.new__diary, menu);
return true;
}
}
11.MainActivity.java源码:
package cn.bzu.mydiary;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import cn.bzu.mydiary.Dao.DBDao;
import cn.bzu.mydiary.entity.Diary;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
public class MainActivity extends Activity {
private DBDao dbDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbDao=new DBDao(this);//new DBDao的实例
List<Diary> diaries=dbDao.getAllDiarys();//获取所有 的日记
ListView listView=(ListView) this.findViewById(R.id.listview);//获取组件
//列表为空时
TextView emptyshow=(TextView) this.findViewById(R.id.emptyshow);
listView.setEmptyView(emptyshow);//为空时显示TextView的内容,参数为(View,emptyView)
//提供适配器对象
List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();
for(Diary diary:diaries){
Map<String,Object> map=new HashMap<String,Object>();
map.put("title", diary.getTitle());
map.put("createtime", diary.getCreatetime());
map.put("content", diary.getContent());
map.put("id", diary.getId());
//加入map集合
data.add(map);
}
SimpleAdapter simpleAdapter=new SimpleAdapter(this, data, R.layout.item, new String[]{"title","createtime"}, new int[]{R.id.title,R.id.createtime});
listView.setAdapter(simpleAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
ListView listView=(ListView) parent;
Map<String,Object> item=(Map<String, Object>) listView.getItemAtPosition(position);
String title=(String) item.get("title");
String createtime=(String) item.get("createtime");
Integer _id=(Integer) item.get("id");
String content=(String) item.get("content");
//点击每一行跳转到ContentActivity显示所对应日记的标题和内容
Intent intent=new Intent();
intent.setClass(MainActivity.this, ContentActivity.class);
Bundle bundle=new Bundle();//bundle传值。放数据
bundle.putString("title", title);
bundle.putString("content", content);
bundle.putInt("id", _id);
intent.putExtras(bundle);
startActivity(intent);
finish();
//Toast.makeText(MainActivity.this, title+createtime, Toast.LENGTH_LONG).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==R.id.diary_add){
Intent intent=new Intent();
intent.setClass(MainActivity.this, New_Diary.class);
startActivity(intent);
finish();
}
return super.onOptionsItemSelected(item);
}
}
12.显示标题和内容的布局文件activity_content.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/bg"
android:orientation="vertical"
tools:context=".ContentActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#87cefa"
android:text="日记标题" />
<EditText
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ems="10" >
</EditText>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#87cefa"
android:text="日记内容" />
<EditText
android:gravity="top"
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>
13.点击显示标题和内容的menu进行编辑和删除操作,布局文件content.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/diary_edit"
android:icon="@android:drawable/ic_menu_edit"
android:title="@string/diary_edit" />
<item
android:id="@+id/diary_delete"
android:icon="@android:drawable/ic_menu_delete"
android:title="@string/diary_delete" />
</menu>
14.
显示标题和内容的ContentActivity.java源码:
package cn.bzu.mydiary;
import cn.bzu.mydiary.Dao.DBDao;
import cn.bzu.mydiary.entity.Diary;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
public class ContentActivity extends Activity {
private EditText title;
private EditText content;
private DBDao dbDao;
private int id;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content);
dbDao=new DBDao(this);
//获取组件
title = (EditText) this.findViewById(R.id.title);
content=(EditText) this.findViewById(R.id.content);
Bundle b = getIntent().getExtras();//b接收intent传来的值
if (b != null) {
String text = b.getString("title");
String text1=b.getString("content");
id=b.getInt("id");
title.setText(text);//获取的内容显示到相应的编辑框中
content.setText(text1);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.content, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==R.id.diary_edit){//点击编辑时跳转到Edit_Diary
Intent intent=new Intent();
Diary diary=dbDao.getDiaryById(id);//通过id获取日记
intent.putExtra("id", diary.getId());//把id再传值到Edit_Diary中
intent.setClass(ContentActivity.this, Edit_Diary.class);
startActivity(intent);
finish();
}
if(item.getItemId()==R.id.diary_delete){//点击删除时,弹出对话框
dialog();
}
return super.onOptionsItemSelected(item);
}
/**。
* 对话框进行友好提示
*/
public void dialog(){
AlertDialog.Builder builder = new Builder(ContentActivity.this);
builder.setMessage("确认删除吗?");
builder.setTitle("提示");
builder.setPositiveButton("确认", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DBDao dbDao=new DBDao(ContentActivity.this);
dbDao.deleteDiary(id);//确认删除时,删除显示的日记
title.setText("");//把标题和内容显示的设为空
content.setText("");
Intent intent=new Intent();
intent.setClass(ContentActivity.this, MainActivity.class);//跳转MainActivity查看是否删除了日记
startActivity(intent);
finish();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.create().show();
}
}
15.编辑日记日记的布局文件activitity_edit_diary.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
tools:context=".Edit_Diary" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#87cefa"
android:text="日记标题" />
<EditText
android:id="@+id/ti"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ems="10" >
</EditText>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#87cefa"
android:text="日记内容" />
<EditText
android:gravity="top"
android:id="@+id/co"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<Button
android:id="@+id/conf"
android:onClick="update"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="提交日记"/>
</LinearLayout>
16.编辑日记Edit_Diary.java源码:
package cn.bzu.mydiary;
import cn.bzu.mydiary.Dao.DBDao;
import cn.bzu.mydiary.entity.Diary;
import cn.bzu.mydiary.tools.DateTool;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
public class Edit_Diary extends Activity {
private EditText ti;
private EditText co;
private DBDao dbDao;
int id;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit__diary);
id=getIntent().getIntExtra("id", 0);//获取传来的id的值
if(id!=0){
dbDao=new DBDao(this);
Diary diary=dbDao.getDiaryById((int)id);
//查找组件
ti=(EditText) this.findViewById(R.id.ti);
co=(EditText) this.findViewById(R.id.co);
ti.setText(diary.getTitle());
co.setText(diary.getContent());
}
}
public void update(View v) {
String title=ti.getText().toString();
String content=co.getText().toString();
Diary diary=new Diary(title,content,DateTool.getCurrentTime());
diary.setId(id);
dbDao.updateDiary(diary);//更新日记
//更新完后,再次跳转到主Activity查看是否更新
Intent intent=new Intent();
intent.setClass(Edit_Diary.this, MainActivity.class);
startActivity(intent);
finish();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.edit__diary, menu);
return true;
}
}
17.运行效果图:
欢迎页面:
2.添加效果图:
3.删除效果图:
4.编辑效果图: