SQLITE和contentprovider

本次作业包含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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值