编写一个掌上日记本应用程序,用SQLite数据库保存信息。
n数据表包括标题和正文字段,如图1。
图1
n不要标题,自动加入日期,数据表里只有正文和日期,如图2。
图2
图2的操作示范如下 (时长54:30)
视频中方法onClick()漏讲了一句, 需在该方法中执行代码showlist(1); //1是搜索

(1)文件strings.xml源代码如下:
<resources>
<string name="app_name">MyDiary</string>
<string name="menu_insert">添加一篇新日记</string>
<string name="search">查找内容</string>
<string name="time">时间</string>
<string name="body">内容</string>
<string name="confirm">保存</string>
<string name="back">返回</string>
<string name="delete">删除</string>
<string name="edit_diary">编辑日记</string>
</resources>
(2)布局文件activity_main.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="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/search" />
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:inputType="textPersonName" />
</LinearLayout>
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
(3)布局文件diary_row.xml源代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/row"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/text1"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dip"
android:maxWidth="200dip"
android:text="@string/body"
android:textSize="20sp" />
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginLeft="10dip"
android:layout_marginTop="10dip"
android:text="@string/time"
android:textSize="20sp" />
</LinearLayout>
(4)布局文件diary_detail.xml源代码如下:
<?xml version="1.0" encoding="utf-8"?>
<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:padding="20dp">
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/time"
android:textSize="24sp" />
<EditText
android:id="@+id/d_body"
android:layout_width="match_parent"
android:layout_height="350dp"
android:gravity="top"
android:scrollbars="vertical"
android:textSize="24sp"
tools:text="@string/body" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/confirm"
android:textSize="24sp" />
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:text="@string/back"
android:textSize="24sp" />
<Button
android:id="@+id/btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/delete"
android:textSize="24sp" />
</LinearLayout>
</LinearLayout>
(5)操作数据库的文件MyDiaryDatabase.java源代码如下:
package com.example.mydiary;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class MyDiaryDatabase {
private DatabaseHelper mOpenHelper;
static final String Database_name = "MyDiary.db";//数据库名称
static final int Database_Version = 1;
static final String TABLE_NAME = "diary";//数据表名称,日记
static final String ID = "id"; //ID编号,数据表的主键
static final String BODY = "body"; //正文
static final String TIME= "time"; //时间
private SQLiteDatabase db;
private Context context;
//数据库的版本管理类
private static class DatabaseHelper extends SQLiteOpenHelper {
private DatabaseHelper(Context context) {
super(context, Database_name, null, Database_Version);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
/*
* 构造器,传递 Context
*/
public MyDiaryDatabase(Context c) {
context =c;
mOpenHelper = new DatabaseHelper(context);
}
/*
* 打开或创建数据库
*/
public boolean openMydb() {
int mode = Context.MODE_PRIVATE;
try {
db = context.openOrCreateDatabase(Database_name, mode, null);//创建数据库
Log.i("SQLite","打开或创建数据库");
return true;
} catch (SQLException e) {
return false;
}
}
/*
* 创建数据表
*/
public boolean CreateMyTable() {
//数据表如不存在就创建
String DATABASE_CREATE =
"CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " ("
+ ID + " INTEGER primary key autoincrement,"//ID自动编号
+ BODY + " text not null,"
+ TIME + " text not null);";
try {
db.execSQL(DATABASE_CREATE);//创建数据表
Log.i("SQLite","创建数据表");
return true;
} catch (SQLException e) {
return false;
}
}
/*
* 删除数据库
*/
public void deleteMydb() {
context.deleteDatabase(Database_name);
Log.i("SQLite","删除数据库");
}
/*
* 插入数据
*/
public boolean insertdata(ContentValues values) {
try {
db.insert(TABLE_NAME,ID,values);
Log.i("SQLite","插入数据记录");
return true;
} catch (SQLException e) {
return false;
}
}
/*
* 删除符合条件的数据
*/
public boolean deletedata(Integer id) {
try {
String args[] = {id.toString()};
db.delete(TABLE_NAME, ID +"= ?", args);// ? 代表一个参数,先占位
Log.i("SQLite","删除符合条件的数据");
return true;
} catch (SQLException e) {
return false;
}
}
/*
* 修改数据
*/
public boolean update(ContentValues values,Integer id) {
try {
String args[] = {id.toString()};
db.update(TABLE_NAME,values,ID + "= ?", args);
Log.i("SQLite","修改数据");
return true;
} catch (SQLException e) {
return false;
}
}
/*
* 获取符合ID 条件的记录,精确查询
*/
public Cursor getdata(Integer id) {
String args[] = {id.toString()};
String col[] = { BODY,TIME };
//String col[] = { BODY,TIME,TIME2 };
Cursor cur = db.query(TABLE_NAME, col, ID + "= ?", args, null, null, null);
Log.i("SQLite","获取符合条件的数据");
return cur;
}
/*
* 获取body 符合条件的记录,模糊查询
*/
public Cursor sousuo(String s) {
String sql="select * from "+TABLE_NAME+" where body like '%"+s+"%'";
Cursor cur = db.rawQuery(sql,null);
Log.i("SQLite","获取符合条件的数据");
return cur;
}
/*
* 获取数据表的全部记录
*/
public Cursor getAllNotes() {
String col[] = { ID, BODY,TIME };
Log.i("SQLite","获取全部记录");
return db.query(TABLE_NAME, col, null, null, null, null, null);
}
}
(6)控制文件DiaryDetail.java 源代码如下:
package com.example.mydiary;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Calendar;
import java.util.TimeZone;
public class DiaryDetail extends AppCompatActivity {
private MyDiaryDatabase mydb; //定制好的数据库操作类
private EditText body; //日记内容
private Button btn1,btn2,btn3;
private int nid; //日记的主键
private int flag; //修改是1,添加是0
private TextView time;
private String t; //时间
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.diary_detail);
setTitle(R.string.edit_diary);
time=(TextView) findViewById(R.id.time);
body=(EditText)findViewById(R.id.d_body);
btn1 = (Button)findViewById(R.id.btn1);
btn2 = (Button)findViewById(R.id.btn2);
btn3 = (Button)findViewById(R.id.btn3);
btn1.setOnClickListener(new mClick());
btn2.setOnClickListener(new mClick());
btn3.setOnClickListener(new mClick());
mydb = new MyDiaryDatabase(this);
mydb.openMydb();
try {
flag = (int) this.getIntent().getExtras().getInt("flag");
}catch (Exception e){ flag = 0; }
if(flag==1){
nid=(int)this.getIntent().getExtras().getInt("ID");
init(nid);
}else{
body.setText("");
gettime();
}
}
private void gettime(){//获取系统当前时间,取到分钟
Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("GTM+8:00"));
String year=String.valueOf(cal.get(Calendar.YEAR));
String month=String.valueOf(cal.get(Calendar.MONTH)+1);
String day=String.valueOf(cal.get(Calendar.DATE));
String hour=String.valueOf(cal.get(Calendar.HOUR_OF_DAY));
String min=String.valueOf(cal.get(Calendar.MINUTE));
String sec=String.valueOf(cal.get(Calendar.SECOND));
if(month.length()<2)month="0"+month;
if(day.length()<2)day="0"+day;
if(hour.length()<2)hour="0"+hour;
if(min.length()<2)min="0"+min;//规范格式,长度为1时往前补0
t=year+"年"+month+"月"+day+"日"+hour+":"+min;
time.setText(t);
cal.clear();
cal.set(Integer.valueOf(year),Integer.valueOf(month),Integer.valueOf(day),Integer.valueOf(hour),Integer.valueOf(min),Integer.valueOf(sec));
//String t2=String.valueOf(cal.getTimeInMillis());//秒
}
private void init(int nid) {
Cursor cursor = mydb.getdata(nid);
if (cursor != null) {
if(cursor.moveToFirst()){
body.setText(cursor.getString(0));
time.setText(cursor.getString(1));
}
}
cursor.close();
}
//设置“保存”、“删除”、“返回”按钮点击事件
class mClick implements View.OnClickListener{
@Override
public void onClick(View v) {
if(v==btn1){ //保存日记
ContentValues cv=new ContentValues();
gettime();
cv.put(mydb.BODY,body.getText().toString());
cv.put(mydb.TIME,time.getText().toString());
if(flag==1) //修改日记
{
mydb.update(cv,nid);
}
else{ //添加日记
mydb.insertdata(cv);
flag=1; //日记一旦添加,再按“保存”就变为修改
}
Toast.makeText(DiaryDetail.this,"保存成功",Toast.LENGTH_SHORT).show();
}
else if(v==btn2){ //返回主页
Intent i=new Intent(DiaryDetail.this,MainActivity.class);
startActivity(i);
}
else if(v==btn3){ //删除日记
mydb.deletedata(nid);
Intent i=new Intent(DiaryDetail.this,MainActivity.class);
startActivity(i);
}
}
}
}
(7)MainActivity.java局部源代码如下:(视频里有讲解,因为是学生作业,不便全部提供,请包涵)
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
MyDiaryDatabase mydb;
ListView listdb;
Button button;
EditText editText;
private List data = new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
......
}
public void showlist(int a){
......
}
@Override
public void onClick(View v) {
showlist(1); // 1是搜索
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//菜单, 添加一篇新日记
......
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
//通过菜单添加一篇新日记
......
}
}

