本次作业包含2部分内容:
1、SQLite数据库的DAO标准CRUD操作:
请大家实现课程实验网站:http://www.wustwzx.com/as/sy/sy07.html#mk2 中的 模块example7_2 实例,通过实例掌握DAO操作。
2、完善WECHAT项目中的“通讯录”模块,如下图所示;其中 ①必做,②/③选一实现。
3、作业截至日期:5月6日 24:00
项目要求
- 通过实例掌握SqlLite的DAO操作
基本功能
- 添加:输入信息,点击“添加”按钮添加进数据表中
- 修改:选定要修改的信息,输入要修改的数据,点击“修改”按钮保存修改
- 删除:选定要删除的信息,点击“删除”按钮删除该信息
- 查询:呈现在主页View中
任务一:SQLite数据库的DAO的CRUD操作
package com.example.wx;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
/*
首次安装时,调用SQLiteOpenHelper的onCreate()方法创建库test.db及表person
以后运行时,若数据库没有版本提升,则以可读写方式直接打开数据库;
SQLite数据库属于内部存储,在应用卸载时将被删除,而再次安装时不会被删除;
若有版本提升,则先执行onUpgrade()方法后,再以可读写方式打开数据库
*/
public class MainActivity extends AppCompatActivity {
SQLiteDatabase db;
Cursor cursor;
StringBuilder result=new StringBuilder("程序所做的工作:\n");
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyDbOpenHelper helper = new MyDbOpenHelper(this);
db=helper.getWritableDatabase(); //数据库文件句柄
cursor=db.rawQuery("select * from person",null);
Toast.makeText(this, "查询到"+cursor.getCount()+"记录。", Toast.LENGTH_SHORT).show();
result.append("—查询了数据表并统计了记录数。\n");
textView=findViewById(R.id.textView);
textView.setText(result);
}
class MyDbOpenHelper extends SQLiteOpenHelper { //内部工具类
public MyDbOpenHelper(Context context) { //构造方法
//必须调用抽象父类的构造方法,第4参数为数据库版本
super(context, "test.db", null,1); //建立或打开库
result.append("—创建或打开数据库;\n");
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "创建数据库表...", Toast.LENGTH_SHORT).show();
db.execSQL("CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20))");
db.execSQL("insert into person values(null,'Wu')");
db.execSQL("insert into person values(null,'Guan')");
result.append("—创建数据表并添加记录;\n");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Toast.makeText(MainActivity.this, "数据库表更新中...", Toast.LENGTH_SHORT).show();
db.execSQL("ALTER TABLE person ADD tel CHAR(20)");
db.execSQL("update person set tel='15527643858' where name='Wu'");
db.execSQL("update person set tel='1340862750' where name='Guan'");
result.append("—修改了数据表结构和记录;\n");
}
}
}
任务二,项目部分
package com.example.wx;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/*
首次安装时,调用SQLiteOpenHelper的onCreate()方法创建库test.db及表person
以后运行时,若数据库没有版本提升,则以可读写方式直接打开数据库;
SQLite数据库属于内部存储,在应用卸载时将被删除,而再次安装时不会被删除;
若有版本提升,则先执行onUpgrade()方法后,再以可读写方式打开数据库
*/
public class MainActivity extends AppCompatActivity {
SQLiteDatabase db;
Cursor cursor;
StringBuilder result=new StringBuilder("程序所做的工作:\n");
TextView textView;
private MyDAO myDAO; //数据库访问对象
private List<Map<String,Object>> listData;
private Map<String,Object> listItem;
private SimpleAdapter listAdapter;
private EditText et_name; //数据表包含3个字段,第1字段为自增长类型
private EditText et_age;
private String selId=null; //选择项id
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyDbOpenHelper helper = new MyDbOpenHelper(this);
db=helper.getWritableDatabase(); //数据库文件句柄
cursor=db.rawQuery("select * from person",null);
Toast.makeText(this, "查询到"+cursor.getCount()+"记录。", Toast.LENGTH_SHORT).show();
Button bt_add= (Button) findViewById(R.id.bt_add);bt_add.setOnClickListener((View.OnClickListener) this);
Button bt_modify=(Button)findViewById(R.id.bt_modify);bt_modify.setOnClickListener((View.OnClickListener) this);
Button bt_del=(Button)findViewById(R.id.bt_del);bt_del.setOnClickListener((View.OnClickListener) this);
et_name=(EditText)findViewById(R.id.et_name);
et_age=(EditText)findViewById(R.id.et_age);
myDAO = new MyDAO(this); //创建数据库访问对象
if(myDAO.getRecordsNumber()==0) { //防止重复运行时重复插入记录
myDAO.insertInfo("tian", 20); //插入记录
myDAO.insertInfo("wang", 40); //插入记录
}
displayRecords(); //显示记录
result.append("—查询了数据表并统计了记录数。\n");
textView=findViewById(R.id.textView);
textView.setText(result);
}
public void displayRecords(){ //显示记录方法定义
ListView listView = (ListView) findViewById(R.id.listView);
listData = new ArrayList<Map<String,Object>>();
Cursor cursor = myDAO.allQuery();
while (cursor.moveToNext()){
int id=cursor.getInt(0); //获取字段值
String name=cursor.getString(1);
//int age=cursor.getInt(2);
int age=cursor.getInt(cursor.getColumnIndex("age"));//推荐此种方式
listItem=new HashMap<String,Object>(); //必须在循环体里新建
listItem.put("_id", id); //第1参数为键名,第2参数为键值
listItem.put("name", name);
listItem.put("age", age);
listData.add(listItem); //添加一条记录
}
listAdapter = new SimpleAdapter(this,
listData,
R.layout.list_item, //自行创建的列表项布局
new String[]{"_id","name","age"},
new int[]{R.id.tv_id,R.id.tvname,R.id.tvage});
listView.setAdapter(listAdapter); //应用适配器
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { //列表项监听
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Map<String,Object> rec= (Map<String, Object>) listAdapter.getItem(position); //从适配器取记录
et_name.setText(Objects.requireNonNull(rec.get("name")).toString()); //刷新文本框
et_age.setText(Objects.requireNonNull(rec.get("age")).toString());
Log.i("ly", Objects.requireNonNull(rec.get("_id")).toString());
selId= Objects.requireNonNull(rec.get("_id")).toString(); //供修改和删除时使用
}
});
}
public void onClick(View v) { //实现的接口方法
if(selId!=null) { //选择了列表项后,可以增加/删除/修改
String p1 = et_name.getText().toString().trim();
int p2 = Integer.parseInt(et_age.getText().toString());
switch (v.getId()){
case R.id.bt_add:
myDAO.insertInfo(p1,p2);
break;
case R.id.bt_modify:
myDAO.updateInfo(p1,p2,selId);
Toast.makeText(getApplicationContext(),"更新成功!",Toast.LENGTH_SHORT).show();
break;
case R.id.bt_del:
myDAO.deleteInfo(selId);
Toast.makeText(getApplicationContext(),"删除成功!",Toast.LENGTH_SHORT).show();
et_name.setText(null);et_age.setText(null); selId=null; //提示
}
}else{ //未选择列表项
if(v.getId()==R.id.bt_add) { //单击添加按钮
String p1 = et_name.getText().toString();
String p2=et_age.getText().toString();
if(p1.equals("")||p2.equals("")){ //要求输入了信息
Toast.makeText(getApplicationContext(),"姓名和年龄都不能空!",Toast.LENGTH_SHORT).show();
}else{
myDAO.insertInfo(p1, Integer.parseInt(p2)); //第2参数转型
}
} else{ //单击了修改或删除按钮
Toast.makeText(getApplicationContext(),"请先选择记录!",Toast.LENGTH_SHORT).show();
}
}
displayRecords();//刷新ListView对象
}
class MyDbOpenHelper extends SQLiteOpenHelper { //内部工具类
public MyDbOpenHelper(Context context) { //构造方法
//必须调用抽象父类的构造方法,第4参数为数据库版本
super(context, "test.db", null,1); //建立或打开库
result.append("—创建或打开数据库;\n");
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "创建数据库表...", Toast.LENGTH_SHORT).show();
db.execSQL("CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20))");
db.execSQL("insert into person values(null,'Wu')");
db.execSQL("insert into person values(null,'Guan')");
result.append("—创建数据表并添加记录;\n");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Toast.makeText(MainActivity.this, "数据库表更新中...", Toast.LENGTH_SHORT).show();
db.execSQL("ALTER TABLE person ADD tel CHAR(20)");
db.execSQL("update person set tel='15527643858' where name='Wu'");
db.execSQL("update person set tel='1340862750' where name='Guan'");
result.append("—修改了数据表结构和记录;\n");
}
}
}
参考资料:http://www.wustwzx.com/as/sy/sy07.html#mk2