《移动应用程序设计基础》实验5 数据库实践——简单日记本

实验名称:

实验5 数据库实践——简单日记本

所使用的工具软件及环境:

JDK1.8,Android Studio

一、实验目的:

实验目的:

掌握安卓数据库的应用

二、实验内容:

模拟一个日记本程序

实现简单日记的新建、修 改、删除、查询功能。运行效果如下图。

当点击右下方的添加按钮时如下图所示。

当点击ListView的Item时,将显示日记的详细信息。

当点击ListView的右边的编辑图片按钮时,将进入编辑日记模式。

当点击Toolbar中的值为“编辑”的TextView控件时,显示如下。

使用SQLiteExpert软件查看生成的数据库

当使用Sqlite数据库时,Android系统对其存放的数据库文件位于/data/data/[包名]/databases/*.db,如下图所示,在安装sdk目录下运行monitor.bat文件:

默认情况下,data目录是禁止非root用户访问的,这时,我们就需要root权限来查看。首先打开Android SDK下的platform-tools目录,然后按住Shift键并按下鼠标右键,点击“在此处打开命令窗口(W)”,如下图所示。

然后在命令窗口输入以下命令:

adb root

这时,我们就可以访问/data目录了,之后使用pull命令来复制文件。

adb pull /data/data/com.example.sqlitedemo/databases

/DiaryDB.db  DiaryDB.db

默认情况下,文件将存放在D:\WorkSpace\ASSDK\platform-tools目录中。

之后,打开SQLiteExpert软件(需网上下载),依次点击FileàOpen Database,选中刚刚导出的数据库文件:

在左边的列表中,选中diary表,之后选择右上方的Data选项,就可以查看数据,选择旁边的Design选项可以查看表的结构。其下方的“加号”、“减号”、“对号”、“叉号”分别为插入一条数据、删除选中的数据、提交更改、撤销更改。

实验要求:

  1. 完成实验内容所有代码;
  2. 图文并重的方式叙述实现过程;
  3. 展示运行结果。

实验过程:

Android中封装了一个SQLiteOpenHelper抽象类,我们需要创建SQLiteOpenHelper的子类并覆写onCreate方法,在此方法中编写我们需要的SQL语句。使用契约类SQLiteContract来定义URI、表格和列名称的常数的容器,契约类允许我们跨同一软件包中的所有其他类使用相同的常数。

public final class SQLiteContract {

//为了防止使用者不小心实例化类的构造方法,

//使构造函数私有化。

private SQLiteContract () {}

//此内部类定义日记表的内容

public static class DiaryEntry implements BaseColumns {

public static final String TABLE_NAME = "diary";

public static final String COLUMN_NAME_TITLE = "title";

public static final String COLUMN_NAME_CONTENT = "content";

public static final String COLUMN_NAME_TIME = "time";

}

//其他表内容

}

继承SQLiteOpenHelper并覆写onCreate方法和onUpgrade方法,其中onUpgrade方法是一个设置数据库版本号的方法。需要我们注意的是,当我们实例化DBHelper 时(比如new DBHelper),onCreate方法只会执行一次,即数据库表只会创建一次。当数据库版本号增加时,系统将调用onUpgrade方法。我们可以将升级的SQL语句放在此方法内完成数据库的升级。

1 public class DiaryDbHelper extends SQLiteOpenHelper {

2     public static final int DATABASE_VERSION = 1;

3     public static final String DATABASE_NAME = "DiaryDB.db";

4     public DiaryDbHelper(Context context) {

5         super(context, DATABASE_NAME, null, DATABASE_VERSION);

6     }

7     @Override

8     public void onCreate(SQLiteDatabase db) {

9         db.execSQL(SQL_CREATE_ENTRIES);

10     }

11     @Override

12     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

13         db.execSQL(SQL_DELETE_ENTRIES);

14         onCreate(db);

15     }

16 }

向数据库中插入一条数据时,可以使用ContentValues 对象传递至SQLiteDatabase对象的insert() 方法将数据插入数据库。

SQLiteDatabase db = dbHelper.getWritableDatabase();

//设置插入值

ContentValues values = new ContentValues();

values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE, title);

values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT, content);

values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_TIME, date);

//执行插入方法

long newRowId = db.insert(SQLiteContract.DiaryEntry.TABLE_NAME, null, values);

db.close();

可以使用query方法查询数据

SQLiteDatabase db = dbHelper.getReadableDatabase();

String[] projection = {

SQLiteContract.DiaryEntry._ID,

SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE,

SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT,

SQLiteContract.DiaryEntry.COLUMN_NAME_TIME

};

String selection = SQLiteContract.DiaryEntry._ID + " = ?";

String[] selectionArgs = { id };

String sortOrder =SQLiteContract.DiaryEntry.COLUMN_NAME_TIME + " DESC";

Cursor c = db.query(

SQLiteContract.DiaryEntry.TABLE_NAME,

projection, selection, selectionArgs, null, null, sortOrder

);

c.moveToFirst();

String title= c.getString(c.getColumnIndex(SQLiteContract.DiaryEntry.

COLUMN_NAME_TITLE))

c.close();

db.close();

更新数据可以使用update方法

SQLiteDatabase db = dbHelper.getWritableDatabase();

ContentValues values = new ContentValues();

values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE, title);

String selection = SQLiteContract.DiaryEntry._ID + " = ?";

String[] selectionArgs = { id };

int count = db.update(

SQLiteContract.DiaryEntry.TABLE_NAME,

values,

selection,

selectionArgs);

db.close();

删除数据可以使用delete方法

SQLiteDatabase db = dbHelper.getWritableDatabase();

String selection = SQLiteContract.DiaryEntry._ID + " = ?";

String[] selectionArgs = { id };

db.delete(SQLiteContract.DiaryEntry.TABLE_NAME, selection, selectionArgs);

db.close();

三、实验结果测试(完整所有代码在资源下载压缩包中,文章结尾有资源下载链接)

4个java文件以及5个布局文件

部分主要代码:

//MainActivity.java
package com.example.mgh.diary;import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;import java.util.ArrayList;public class MainActivity extends Activity implements View.OnClickListener {public static ArrayList<info> info = new ArrayList<>();private ListView mlistview;public static SQLiteDatabase db;public Button buttonHide;public Button btn_search;public ImageView iv;private EditText editText;public Button look_button;public int a=0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}private void init() {info = new ArrayList<>();//editText = (EditText) findViewById(R.id.editText);btn_search = (Button) findViewById(R.id.btn_search);//buttonHide = (Button) findViewById(R.id.buttonHide);iv = (ImageView) findViewById(R.id.imageView);//buttonHide.setOnClickListener(this);btn_search.setOnClickListener(this);iv.setOnClickListener(this);//list监听mlistview = (ListView) findViewById(R.id.mlistview);db = new MyHelper(this).getWritableDatabase();Cursor cursor = db.query("diary", null, null,null, null, null, null);if (cursor.moveToFirst()) {do {
// 遍历Cursor对象,取出数据info.add(new info(cursor.getString(cursor.getColumnIndex("name")),cursor.getString(cursor.getColumnIndex("content")),cursor.getInt(cursor.getColumnIndex("_id"))));} while (cursor.moveToNext());}db.close();updateAdapter();}public void updateAdapter() {/*View vi=View.inflate(MainActivity.this,R.layout.for_list,null);look_button=(Button)vi.findViewById(R.id.look_Button);look_button.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, Show_diary.class);db = new MyHelper(MainActivity.this).getWritableDatabase();startActivity(intent);}});*/MyAdapter myAdapter = new MyAdapter();mlistview.setAdapter(myAdapter);mlistview.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {Intent intent = new Intent(MainActivity.this, Show_diary.class);intent.putExtra("id", i);db = new MyHelper(MainActivity.this).getWritableDatabase();startActivity(intent);}});}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.imageView:Intent intent = new Intent(this, Add_diary.class);intent.putExtra("id", info.size());startActivity(intent);a=1;case R.id.btn_search:if(a==0) {btn_search.setText("取消");look_button.setVisibility(View.VISIBLE);a=1;}else {btn_search.setText("编辑");look_button.setVisibility(View.INVISIBLE);a=0;}/*Intent intent2 = new Intent(this, Delete_diary.class);intent2.putExtra("id", info.size());startActivity(intent2);*//*info = new ArrayList<>();buttonHide.setVisibility(View.VISIBLE);db = new MyHelper(this).getWritableDatabase();Cursor cursor = db.query("diary", new String[]{"_id,name,content"},"name like ?", new String[]{"%"+editText.getText().toString()+"%"}, null, null,null, null);if (cursor.moveToFirst()) {do {
// 遍历Cursor对象,取出数据info.add(new info(cursor.getString(cursor.getColumnIndex("name")),cursor.getString(cursor.getColumnIndex("content")),cursor.getInt(cursor.getColumnIndex("_id"))));} while (cursor.moveToNext());}db.close();updateAdapter();*/break;}}class MyAdapter extends BaseAdapter {public MyAdapter() {super();}public int getCount() {return info.size();}@Overridepublic Object getItem(int i) {return info.get(i).name;}@Overridepublic long getItemId(int i) {return i;}@SuppressLint("WrongConstant")@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder viewholder;if (view == null) {view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.for_list, viewGroup, false);viewholder = new ViewHolder();viewholder.tv = (TextView) view.findViewById(R.id.name);} else {viewholder = (ViewHolder) view.getTag();}//View vi=View.inflate(MainActivity.this, R.layout.for_list,null);look_button=(Button)view.findViewById(R.id.button3);//删除按钮不可见look_button.setVisibility(View.INVISIBLE);look_button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {/*int id;Intent intent = getIntent();id = intent.getIntExtra("id", -1);MainActivity.db.delete("diary", "_id=?", new String[]{String.valueOf(MainActivity.info.get(id).id)});MainActivity.db.close();*//*SQLiteDatabase db = dbHelper.getWritableDatabase();String selection = SQLiteContract.DiaryEntry._ID + " = ?";String[] selectionArgs = { id };db.delete(SQLiteContract.DiaryEntry.TABLE_NAME, selection, selectionArgs);db.close();*/}});viewholder.tv.setText(String.valueOf(i + 1) + ": " + info.get(i).name);viewholder.tv.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);return view;}class ViewHolder {TextView tv;}}class info {String name;String content;int id;public info(String name, String content, int id) {this.name = name;this.content = content;this.id = id;}}}
//Add_diary.java
package com.example.mgh.diary;import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import org.jetbrains.annotations.Nullable;public class Add_diary extends Activity {public int id;private EditText name;private EditText diary;private Button btn;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.add_diary);name = (EditText) findViewById(R.id.diary_name);diary = (EditText) findViewById(R.id.diary);btn = (Button) findViewById(R.id.submit);Intent intent = getIntent();id = intent.getIntExtra("id", -1);}public void sub(View v) {ContentValues values = new ContentValues();values.put("name", name.getText().toString());values.put("content", diary.getText().toString());MainActivity.db = new MyHelper(this).getWritableDatabase();MainActivity.db.insert("diary", null, values);MainActivity.db.close();Toast.makeText(this, "日志保存成功", Toast.LENGTH_SHORT).show();Intent intent = new Intent(this, MainActivity.class);startActivity(intent);}}
//MyHelper.java
package com.example.mgh.diary;import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;public class MyHelper extends SQLiteOpenHelper{public MyHelper(Context context){super(context,"dia.db",null,5);}@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {sqLiteDatabase.execSQL("create table diary(_id integer primary key autoincrement," +"name varchar(11),content varchar(1000))");}@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}
}
//Show_diary.java
package com.example.mgh.diary;import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;import org.jetbrains.annotations.Nullable;//import android.support.annotation.Nullable;public class Show_diary extends Activity {private EditText name;private EditText ed;int id;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.show_diary);name = (EditText) findViewById(R.id.name);ed = (EditText) findViewById(R.id.content);Intent intent = getIntent();id = intent.getIntExtra("id", -1);name.setText(MainActivity.info.get(id).name);ed.setText(MainActivity.info.get(id).content);}public void backandchange(View v) {ContentValues values=new ContentValues();values.put("name",name.getText().toString());values.put("content",ed.getText().toString());MainActivity.db.update("diary", values,"_id=?", new String[]{String.valueOf(MainActivity.info.get(id).id)});MainActivity.db.close();Intent intent = new Intent(this, MainActivity.class);startActivity(intent);}public void del(View v) {MainActivity.db.delete("diary", "_id=?", new String[]{String.valueOf(MainActivity.info.get(id).id)});MainActivity.db.close();Intent intent = new Intent(this, MainActivity.class);startActivity(intent);}
}

实验结果截图:

 

 

心得与体会:

本次实验功能基本完成,学习到数据库的使用,通过查找资料以及学习,完成最后日记本的制作。通过本次实验,收获颇多,不仅复习了以前的知识,同时也学习到了新的知识,对今后的学习有了较大的帮助。

注:本次实验结果与原实验要求有部分不相似,若要一样的实验结果请到如下链接博客中的代码进行修改!(该实验部分代码为网上资源修改)

https://blog.csdn.net/weixin_48388330/article/details/122546221

下载资源包链接:

https://download.csdn.net/download/weixin_48388330/76307026

资源中的图片以及内容只适用与学习

移动应用程序设计基础——数据库实践——简单日记本相关推荐

  1. 《程序设计基础综合实践》各备选题目[2023-02-13]

    <程序设计基础综合实践>各备选题目[2023-02-13] <程序设计基础综合实践>各备选题目设计参考提示 一.总体要求 1.注释要求 注释是程序员与日后的程序读者之间通信的重 ...

  2. javaweb简单的登录增删改查系统_利用python操作小程序云数据库实现简单的增删改查!

    不止python,你可以利用任何语言那实现通过http请求来操作你自己的小程序云数据库了 背景 也是在最近吧,小程序更新了云开发 HTTP API 文档,提供了小程序外访问云开发资源的能力,使用 HT ...

  3. python删除数据库的数据完整代码_利用python操作小程序云数据库实现简单的增删改查...

    不止python,你可以利用任何语言那实现通过http请求来操作你自己的小程序云数据库了 背景 也是在最近吧,小程序更新了云开发 HTTP API 文档,提供了小程序外访问云开发资源的能力,使用 HT ...

  4. Java基础与实践题库_Java程序设计基础与实践(题库版)

    第1章Java概述 1.1Java的发展过程 1.1.1Java技术的形成 1.1.2Java的成熟和发展 1.2Java技术 1.2.1Java的技术特点 1.2.2Java的相关技术 1.3Jav ...

  5. 移动应用程序设计基础——期末考核——登录界面与简单日记本的综合实践

    <移动应用程序设计基础>期末报告 课题名称: <移动应用开发基础>上机考核 所使用的工具软件及环境: JDK,Android Studio 一.课题背景 期末上机考核,将实验四 ...

  6. python打折简单程序每满_丰满Python程序设计基础【实境编程】_高校邦_答案

    丰满Python程序设计基础[实境编程]_高校邦_答案h779 丰满Python程序设计基础[实境编程]_高校邦_答案 关注公众号{帅搜}即可查询答案 支持:大学网课,智慧树,知到,超星,尔雅,学习通 ...

  7. 程序设计导引及在线实践_学院经纬计算学院程序设计基础与实验入选首批国家级一流本科课程...

    近日,教育部公布首批国家级一流本科课程认定清单,计算机与计算科学学院颜晖教授负责,张高燕.张泳.王云武.柳俊老师参与的<程序设计基础与实验>入选"线上线下混合式一流课程" ...

  8. jsp创建mysql数据库_使用 MySQL 数据库创建简单的 JSP 应用程序(1)

    使用 MySQL 数据库创建简单的 Web 应用程序 编写人:Troy Giunipero 本文档描述了如何创建用于连接 MySQL 数据库服务器的简单 Web 应用程序.还讲述了 Web 开发中的一 ...

  9. c语言添加变量到数据库+a+ +b+ 的方法,《C程序设计基础》模拟考试题(含答案)...

    <C程序设计基础>模拟考试题 一.选择题(每题2分.共23道选择题) 1.关于C程序的叙述,错误的说法是(B) A.C程序总是从主函数开始执行 B.C程序中定义的第一个函数是主函数 C.在 ...

最新文章

  1. 如何提高服务器响应的数据速度_如何提高攻牙速度
  2. python socket sendto sendall_网络通信 Python Socket UDP Select
  3. 江苏涟水中学2021高考成绩查询,2021年涟水县高考状元名单资料,今年涟水县高考状元多少分...
  4. Cookie中不能有空格_前端小贴士 -- 全面了解Cookie
  5. super和this关键字详解
  6. Windows的特色
  7. Trie字典树数组实现
  8. JS中图片缓冲loading技术的实例代码
  9. 讨论8QAM及16QAM的星座模型
  10. 淘宝/天猫获得淘口令真实url API
  11. 软件测试工程师必备的27个基础技能
  12. 由四位央行官员为你制作的“数字货币”说明书
  13. 2.自动加载(phalapi框架总结)
  14. 人活着,到底为了啥?
  15. 论绝对式编码器是否需要执行回原点
  16. java毕业设计KTV点歌系统mybatis+源码+调试部署+系统+数据库+lw
  17. 大数据变现的九种商业模式
  18. Apache 安装详解
  19. [附源码]java毕业设计中青年健康管理监测系统
  20. iOS网络NSURLSession使用详解

热门文章

  1. 使用Incapsula免费CDN加速godaddy空间
  2. Android 9.0以上HTTP网络请求被限制解决方案
  3. 流畅安装、简单使用annie下载B站视频
  4. 互联网家谱受到追捧,传统修谱方式面临淘汰,数字家谱:好用
  5. Python开发 CDN查询子域名查询
  6. python 把数字日期转换成中文日期
  7. linux玩 LOL
  8. 尿布和啤酒—关联规则详解
  9. Codeforces1575 D. Divisible by Twenty-Five(dp)
  10. python玩汉诺塔游戏攻略