Android初级开发(六)——3、SQLite数据库的增删改查

来源:互联网 发布:h3c端口聚合interface 编辑:程序博客网 时间:2024/05/29 11:23

这段时间对自己的工作生活状态都是不满意的。工作上因为我刚刚入职,上级是不会把核心的任务交给我,所以我除了写写界面,还有很多时候都不知道要干什么,在项目上的进步也很少。生活上总是一堆琐事,刚刚来到北京,算是刚刚安定下来吧,但是租房总是各种各样的问题,而且生活还是比较拮据,因为不想让父母再供应自己的生活费,除了经济上的压力,最重要的是平时给自己安排的学习任务总是不能按时执行,这让我很自责和厌烦自己。

吐完苦水,还是要继续努力呀,毕竟抱怨后悔都解决不了问题。扎扎实实的学好技术,心理才能踏实呀。今天整理一下SQLite数据存储的相关知识,这个知识点我在大学做项目的时候用到要吐,但是现在再去看竟然有很多点都忘了,所以如此看来,真的是要及时温故知新呀,要不然真的会因为理解不深入而很快忘记。

一、SQLite简介
用文件和SharedPreferences进行数据存储是很有限制的,它们只适合保存一些简单的数据和键值对,如果数据量比较大而且数据关系比较复杂时,SQLite就是比较合适的选择了。SQLite是Android Studio内置的一款轻量级关系型数据库,它的运行速度非常快,占用的资源很少,所以特别适合在异动设备上使用。如果有过SQL Sever的使用经验,那么就更容易上手SQLite了。
SQLite3支持NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)、BLOB(二进制对象)数据类型,实际上它也接受varchar、char、decimal(p,s)等数据类型,只不过在运算或保存时会转成对应的五中数据类型。

二、创建数据库
Android提供了一个SQLiteOpenHelper帮助类,借助这个类可以非常简单的对数据库进行创建和升级。但它是个抽象类,如果我们想要使用它的话,就要定义一个自己的帮助类去继承他,然后重写它的抽象方法。主要有两个重要的方法:onCreate()和onUpdate()用于实现数据库的创建和升级。
public abstract void onCreate (SQLiteDatabase db):当数据库第一次被创建的时候去调用,在onCreate()方法里面可以生成数据库表结构和添加一些应用使用到的初始化数据,返回DataBase
public abstract void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion):当数据库需要更新的时候调用,调用的时候需要先删除原来的表,或者去更新新的版本号

  当然我们还会用到getReadableDatabase()和getWritableDatabase()这两个放来来获取数据实例。

getWritableDatabase()方法以读写的方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读不能写;
getReadableDatabase()方法以读写的方式打开数据库,如果数据库的磁盘空间满了,就会打开失败。

三、来个例子
1、需求:创建一个名为“Student.db”的数据库,存储每个学生的学号、姓名、性别、年龄、专业、手机号。在第一个界面显示添加数据、修改数据、查询数据、删除数据功能按钮,点击按钮进入相应功能界面,完成相应功能。其中为了方便起见,将修改数据于查询数据功能放置在一个活动界面中,用户先利用学号进行查询,然后可根据查询出的结果,对学生的某一项属性进行修改。
2、先看效果把
首页
添加数据页面
查询和修改数据页面
删除数据页面

3、代码部分
数据库部分(自定义一个帮助类):

public class MyDatabaseHelper extends SQLiteOpenHelper {    //SQL语句创建表,并定义为一个字符串常量    public static final String CREATE_STUDENT = "create table Student("            + "id text primary key,"            + "name text,"            + "sex text,"            + "age text,"            + "major text,"            + "phone text)";    private Context mContext;    //重写SQLiteOpenHelper的构造方法    //这个构造方法接收四个参数,第一个参数是Context,上下文;    //第二个参数是数据库名,创建数据库时使用的就是这里指定的名称;    //第三个参数允许我们在查询数据时返回一个自定义的Cursor,一般传入null;    //第四个参数表示当前数据库的版本号,用于对数据库进行升级操作。    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);        mContext = context;    }    //创建数据库    @Override    public void onCreate(SQLiteDatabase sqLiteDatabase) {        sqLiteDatabase.execSQL(CREATE_STUDENT) ; //在创建SQLite数据库的同时执行建表语句        Toast.makeText(mContext, "数据库创建成功!", Toast.LENGTH_SHORT).show();    }    //升级数据库    @Override    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {    }}

MainActivity比较简单,布局就是一个TextView和四个Button,给Button设置监听和跳转就可以了。

添加数据活动(布局就不写了,根据效果图很容易做出来):

public class AddActivity extends AppCompatActivity {    private EditText et_id,et_name,et_sex,et_age,et_major,et_phone;    private Button btn_add;    private MyDatabaseHelper dbHelper = new MyDatabaseHelper(this,"Student.db",null,1);    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_add);        initView();    }    private void initView() {        et_id = (EditText) findViewById(R.id.et_id);        et_name = (EditText) findViewById(R.id.et_name);        et_age = (EditText) findViewById(R.id.et_age);        et_sex = (EditText) findViewById(R.id.et_sex);        et_major = (EditText) findViewById(R.id.et_major);        et_phone = (EditText) findViewById(R.id.et_phone);        btn_add = (Button) findViewById(R.id.btn_add);        btn_add.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                SQLiteDatabase db = dbHelper.getWritableDatabase();                ContentValues values = new ContentValues();                //组装第一条数据                values.put("id",et_id.getText().toString());                values.put("name",et_name.getText().toString());                values.put("sex",et_sex.getText().toString());                values.put("age",et_age.getText().toString());                values.put("major",et_major.getText().toString());                values.put("phone",et_phone.getText().toString());                //插入第一条数据                db.insert("Student",null,values);                Toast.makeText(AddActivity.this, "添加成功!", Toast.LENGTH_SHORT).show();            }        });    }}

修改和查询活动:

public class FixAndSearchActivity extends AppCompatActivity implements View.OnClickListener{    private MyDatabaseHelper dbHelper = new MyDatabaseHelper(this,"Student.db",null,1);    private EditText sear_id,fix_name,fix_sex,fix_age,fix_major,fix_phone;    private Button btn_search,btn_fix_name,btn_fix_sex,btn_fix_age,btn_fix_major,btn_fix_phone;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_fix_search);        initView();    }    private void initView() {        sear_id = (EditText) findViewById(R.id.sear_id);        fix_name = (EditText) findViewById(R.id.fix_name);        fix_age = (EditText) findViewById(R.id.fix_age);        fix_sex = (EditText) findViewById(R.id.fix_sex);        fix_major = (EditText) findViewById(R.id.fix_major);        fix_phone = (EditText) findViewById(R.id.fix_phone);        btn_search = (Button) findViewById(R.id.btn_search);        btn_search.setOnClickListener(this);        btn_fix_name = (Button) findViewById(R.id.btn_fix_name);        btn_fix_name.setOnClickListener(this);        btn_fix_sex = (Button) findViewById(R.id.btn_fix_sex);        btn_fix_sex.setOnClickListener(this);        btn_fix_age = (Button) findViewById(R.id.btn_fix_age);        btn_fix_age.setOnClickListener(this);        btn_fix_major = (Button) findViewById(R.id.btn_fix_major);        btn_fix_major.setOnClickListener(this);        btn_fix_phone = (Button) findViewById(R.id.btn_fix_phone);        btn_fix_phone.setOnClickListener(this);    }    @Override    public void onClick(View view) {        SQLiteDatabase db = dbHelper.getWritableDatabase();        String inputId = sear_id.getText().toString();        ContentValues values = new ContentValues();        switch (view.getId()){            case R.id.btn_search:                search(inputId);                break;            case R.id.btn_fix_name:                fix(fix_name,"name",inputId);                break;            case R.id.btn_fix_age:                fix(fix_age,"age",inputId);                break;            case R.id.btn_fix_sex:               fix(fix_sex,"sex",inputId);                break;            case R.id.btn_fix_major:                fix(fix_major,"major",inputId);                break;            case R.id.btn_fix_phone:               fix(fix_phone,"phone",inputId);                break;            default:                break;        }    }    //输入学号查找学生的相关信息    private void search(String inputId) {        SQLiteDatabase db = dbHelper.getWritableDatabase();        if(inputId == null){            Toast.makeText(this, "请输入学号", Toast.LENGTH_SHORT).show();        }else{            //查找Student表中的相关数据            //query()方法参数            //table 指定查询的表名            //columns 指定查询的列名            //selection 指定where的约束条件            //selectionArgs 为where的占位符提供具体的值            //groupBy  指定需要group by的列            //having  对group by后的结果进一步约束            //orderBy  指定查询结果的排序方式            Cursor cursor = db.rawQuery("select * from Student where id = ?",new String[]{inputId});            if (cursor.moveToNext()){                fix_name.setText(cursor.getString(cursor.getColumnIndex("name")));                fix_age.setText(cursor.getString(cursor.getColumnIndex("age")));                fix_sex.setText(cursor.getString(cursor.getColumnIndex("sex")));                fix_major.setText(cursor.getString(cursor.getColumnIndex("major")));                fix_phone.setText(cursor.getString(cursor.getColumnIndex("phone")));            }            Toast.makeText(this, "查询成功!", Toast.LENGTH_SHORT).show();            cursor.close();        }    }    public void fix(EditText edittext,String string,String inputId){        SQLiteDatabase db = dbHelper.getWritableDatabase();        ContentValues values = new ContentValues();        values.put(string,edittext.getText().toString());        db.update("Student",values,"id = ?",new String[]{inputId});        Toast.makeText(this, "修改成功!", Toast.LENGTH_SHORT).show();    }}

删除数据活动:

public class DeleteActivity extends AppCompatActivity {    private EditText delete_id;    private Button delete;    private MyDatabaseHelper dbHelper;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_delete);        initView();    }    private void initView() {        delete_id = (EditText) findViewById(R.id.delete_id);        delete = (Button) findViewById(R.id.delete);        delete.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                dbHelper = new MyDatabaseHelper(DeleteActivity.this,"Student.db",null,1);                SQLiteDatabase db = dbHelper.getWritableDatabase();                //删除语句                db.delete("Student","id = ?",new String[]{delete_id.getText().toString()});                Toast.makeText(DeleteActivity.this, "删除成功!", Toast.LENGTH_SHORT).show();            }        });    }}

**总结:在创建了数据库后,之后对数据做增删改查的操作首先一定要有两个步骤:
1、MyDatabaseHelper dbHelper = new MyDatabaseHelper(DeleteActivity.this,”Student.db”,null,1);
2、 SQLiteDatabase db = dbHelper.getWritableDatabase();
然后在用db去调用增删查改方法。**
下面是四个操作的简单的代码段,方便参考:
增加:

public void add(Student student) {          dbDatabase = dbOpenHelper.getWritableDatabase();          ContentValues values = new ContentValues();          values.put("name", student.getName());         dbDatabase.insert("student", null, values);          if (dbDatabase != null) {              dbDatabase.close();          }      }  

删除

public void delete(Integer id) {          dbDatabase = dbOpenHelper.getWritableDatabase();          dbDatabase.delete("student", "stu_id= ? ",  new String[] { String.valueOf(id) });     }  

查询

public List<Student> findAll() {          dbDatabase = dbOpenHelper.getWritableDatabase();          Cursor cursor = dbDatabase.query("student", new String[] { "stu_id",  "name"}, null, null,null, null,  null);          List<Student> list = new ArrayList<Student>();          Student student = null;          while (cursor.moveToNext()) {              student = new Student();              student.setId(cursor.getInt(0));              student.setName(cursor.getString(1));             list.add(student);          }          if (dbDatabase != null) {              dbDatabase.close();          }          return list;      }      public Student findById(Integer id) {          dbDatabase = dbOpenHelper.getWritableDatabase();          Cursor cursor = dbDatabase.query("student", new String[] { "stu_id",                  "name" }, "stu_id=?",                  new String[] { String.valueOf(id) }, null, null, null);          int count = cursor.getCount();          if (count != 0) {              cursor.moveToNext();              Student student = new Student(cursor.getInt(cursor                      .getColumnIndex("stu_id")), cursor.getString(cursor                      .getColumnIndex("name")), cursor.getString(cursor));              if (dbDatabase != null) {                  dbDatabase.close();              }              return student;          } else {              {                  return null;              }          }      }  

修改

public void update(Student student, Integer id) {          dbDatabase = dbOpenHelper.getWritableDatabase();          ContentValues values = new ContentValues();          values.put("name", student.getName());          values.put("gender", student.getGender());                  dbDatabase.update("student", values, "stu_id=?",                 new String[] { String.valueOf(id) });          if (dbDatabase != null) {              dbDatabase.close();          }      }  

4、测试一下
添加数据
查询数据
修改数据
修改成功
删除成功

5、在这个例子里,我直接将数据展示到了APP中,如果你的应用不需要把数据向用户展示出来,但是你又想自己查看数据库表,那么如果你使用的是Windows系统,可以在系统环境变量中,找到Path变量,将platform-tools目录配置进去。如果你使用的是Linx或Mac系统,可以在home路径下编辑.bash_文件,将platform-tools目录配置进去。
配置好了环境变量之后,就可以使用adb工具,打开命令行界面,输入adb shell,就会进入到设备的控制台,然后cd命令进入到/data/data/包名/dataabases目录下,并使用ls命令查看到该目录里的文件,目录中有两个数据库文件,一个是我们创建的Student.db,另一个是Student.db-journal,后一个是为了让数据库能够支持事务而昌盛的临时日志文件,通常情况下这个文件的大小都是0字节。
然后我们就可以借助sqlite命令来打开数据库,只需要键入sqlite3,后面加上数据库名称即可。然后.table找到我们创建的表。最后.exit或.quit命令退出数据库的编辑。

阅读全文
0 0