Android-SQLite数据库
- 1、SQLite数据库简介
- SQLite是一个轻量级的数据库。他的设计目标是嵌入式的,而且占用资源非常低。
- SQLite遵循的是ACID的关系型数据库管理系统(原子性:Atomicity;一致性:Consistency;隔离性:lsolation;持久性:Durability)
- SQLite没有服务器进程,他是通过文件保存数据,该文件是跨平台的。
- 在保存数据的时候,可以发现SQLite支持null(零)、real(浮点数字)、integer(整数)、text(字符串文本)和blob(二进制对象)5中数据类型。那么很多的时候你会发现,我们使用varchar(n)、char(n)、decimal(p,s)这些数据类型的时候也是没有问题的,是因为这些数据类型在运算或者保存的时候转换成为相对应的5种数据类型了。
- 2、数据库的创建
- Andriod系统推荐使用SQLiteOpenHelper的子类创建数据库,因此需要穿件一个类继承自SQLOpenHelper,并且重写这个类当中的onCreate()方法和onUdate()方法。
public class CourseHelper extends SQLiteOpenHelper { public CourseHelper(Context context){ super(context,"course.db",null,2); } //数据库第一次被创建是调用该方法 @Override public void onCreate(SQLiteDatabase db) { //初始化数据库的表结构,执行一条建表的SQL语句 db.execSQL("CREATE TABLE course(courseID VARCHAR(20),courseName VARCHAR(50),courseCredit REAL)"); } //当数据库的版本号增加时调用 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
- super()调用父类SQLiteOpenHelper的构造方法,并传入四个参数。
- 上下文对象
- 数据库名称
- 游标工厂(通常是null)
- 数据库版本
- onCreate()方法:数据库第一次被创建是调用该方法,一般用于初始化表结构;
- onUpdate()方法:当数据库的版本号增加时调用,如果版本号不增加的话,就是不调用的。
- Andriod系统推荐使用SQLiteOpenHelper的子类创建数据库,因此需要穿件一个类继承自SQLOpenHelper,并且重写这个类当中的onCreate()方法和onUdate()方法。
- 3、数据库的使用
-
增加一条数据
public void insert(String name,String price){ SQLiteDatabase db = helper.getWritableDatabase();//获取可读写的SQLiteDatabase对象 ContentValues values = new ContentValues();//创建ContentValues对象 values.put("name",name); values.put("price",price); long id = db.insert("information",null,values);//插入一条数据到information表 db.close();//关闭数据库 }
- 1、得到SQLiteDatabase对象
- 2、获得ContentValues对象,并将数据添加到该对象中
- 3、调用inserts()方法将数据插入到表中,其中这当中有三个参数
- (1)数据表的名称
- (2)如果发现将要插入的行为空行时,会将这个列名的值设为null
- (3)ContentValues对象(ContentValues对象存放数据的形式都是以键值对的形式存放的)
- 4、使用完SQLiteDatabase对象后,调用close方法关闭,否则的话数据库连接会一直存在,不断消耗内存,那么,当系统报告内存不够的时候获取不到SQLiteDatabase对象的时候,会说明数据库未关闭异常。
- insert()方法会返回数值表示这条数据插入在了第几位,如果这个数字是-1的话,那就说明你没有成功插入数据。
-
修改一条数据
public int update(String name,String price){ SQLiteDatabase db = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("price",price); int number = db.update("imformation",values,"name=?",new String[]{name}); db.close(); return number; }
- 基本步骤还是和插入的一样不在赘述了,那么久简单的说明一下这个update()方法的参数:
- (1)表名
- (2)接收一个ContentValues对象
- (3)可选的where语句
- (4)whereClause语句中表达式的占位参数列表,这些字符串会替换掉where条件中的“?”
- update()方法会返回这次更新的数量。
- 基本步骤还是和插入的一样不在赘述了,那么久简单的说明一下这个update()方法的参数:
-
删除一条数据
public int delete(long id){ SQLiteDatabase db = helper.getWritableDatabase(); int number = db.delete("information","_id=?",new String[]{id+""}); db.close(); return number; }
- delete()方法会返回这次删除的数据有多少条。
-
查询一条数据
public boolean find(long id){ SQLiteDatabase db = helper.getWritableDatabase(); Cursor cursor = db.query("information",null,"_id=?",new String[]{id+""},null,null,null); boolean result = cursor.moveToNext(); cursor.close(); return result; }
- 查询时候使用的是cursor游标,query()方法返回的是一个行数集合cursor。moveToNext()、moveToFirst()这些方法不仅可以更改游标的位置,也会返回一个布尔值,表示是否存在。
- 接下来也是简单的说明一下这些参数:
- (1)表名称
- (2)表示查询的列名
- (3)接收查询条件字句
- (4)接收查询条件字句对应的条件值
- (5)表示分组方式
- (6)接收having条件,即定义组的过滤器
- (7)表示排序方式
-
SQL语句进行数据库操作
//增加一条数据 db.execSQL("insert into information (name,price) values (?,?)",new Object[]{name,price});
//修改一条数据 db.execSQL("update information set name=? where price=?",new Object[]{name,price});
//删除一条数据 db.execSQL("delete from information where _id=1");
//执行查询的SQl语句 Cursor cursor = db.rawQuery("select * from person where name=?",new String[]{name});
- 查询操作的语句相对来说特殊一些,使用的是rawQuery()而不是execSQL(),这是因为查询数据库会返回一个结果集cursor,而execSQL()方法没有返回值。
-
下面是我自己编写的一个基于课程的具有增删改查功能的用户界面,仅供参考:
- activity_main.xml文件
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <EditText android:id="@+id/editText_courseID" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:layout_marginBottom="8dp" android:ems="10" android:hint="课程编号" android:inputType="textMultiLine" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.503" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.017" /> <EditText android:id="@+id/editText_courseName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:layout_marginBottom="8dp" android:ems="10" android:hint="课程名称" android:inputType="textMultiLine" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.503" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/editText_courseID" app:layout_constraintVertical_bias="0.07" /> <EditText android:id="@+id/editText_courseCredit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:layout_marginBottom="8dp" android:ems="10" android:hint="课程学分" android:inputType="textMultiLine" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.503" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/editText_courseName" app:layout_constraintVertical_bias="0.107" /> <Button android:id="@+id/button_Insert" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:layout_marginBottom="8dp" android:text="增加" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.157" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/editText_courseCredit" app:layout_constraintVertical_bias="0.158" /> <Button android:id="@+id/button_Delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:layout_marginBottom="8dp" android:text="删除" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.678" app:layout_constraintStart_toEndOf="@+id/button_Insert" app:layout_constraintTop_toBottomOf="@+id/editText_courseCredit" app:layout_constraintVertical_bias="0.153" /> <Button android:id="@+id/button_Change" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:layout_marginBottom="8dp" android:text="修改" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.157" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/button_Insert" app:layout_constraintVertical_bias="0.171" /> <Button android:id="@+id/button_Search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:layout_marginBottom="8dp" android:text="查询" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.678" app:layout_constraintStart_toEndOf="@+id/button_Change" app:layout_constraintTop_toBottomOf="@+id/button_Delete" app:layout_constraintVertical_bias="0.178" /> </android.support.constraint.ConstraintLayout>
- MainActivity.java文件
package com.example.coursemanage; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private CourseHelper helper; private Button btn1,btn2,btn3,btn4; private ListView lv1; private SQLiteDatabase db; private final String TableName = "course"; private TextView et1,et2,et3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); helper = new CourseHelper(this); btn1 = findViewById(R.id.button_Insert); btn2 = findViewById(R.id.button_Delete); btn3 = findViewById(R.id.button_Change); btn4 = findViewById(R.id.button_Search); et1 = findViewById(R.id.editText_courseID); et2 = findViewById(R.id.editText_courseName); et3 = findViewById(R.id.editText_courseCredit); btn1.setOnClickListener(this); btn2.setOnClickListener(this); btn3.setOnClickListener(this); btn4.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.button_Insert: db = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("courseID",et1.getText().toString().trim()); values.put("courseName",et2.getText().toString().trim()); values.put("courseCredit",Float.parseFloat(et3.getText().toString().trim())); long insertNumber = db.insert(TableName,null,values); Log.i("coursedb","本次插入在第" + insertNumber + "条"); db.close(); break; case R.id.button_Delete: db = helper.getWritableDatabase(); long deleteNumber = db.delete(TableName,"courseID=?",new String[]{et1.getText().toString().trim()}); Log.i("coursedb","本次删除了" + deleteNumber + "条记录"); db.close(); break; case R.id.button_Change: db = helper.getWritableDatabase(); values = new ContentValues(); values.put("courseID",et1.getText().toString().trim()); values.put("courseName",et2.getText().toString().trim()); values.put("courseCredit",et3.getText().toString().trim()); long updateNumber = db.update(TableName,values,"courseID=?",new String[]{et1.getText().toString().trim()}); Log.i("coursedb:","修改了" + updateNumber + "条记录"); db.close(); break; case R.id.button_Search: db = helper.getReadableDatabase(); //查询整张表就是所有值设置为null; Cursor cursor = db.query(TableName,null,null,null,null,null,null); Log.i("coursedb:","本次共查询" + cursor.getCount() + "条记录"); cursor.moveToFirst();//将游标定位到第一条记录 do {//往后一条一条查数据记录 String courseID = cursor.getString(cursor.getColumnIndex("courseID")); String courseName = cursor.getString(cursor.getColumnIndex("courseName")); float courseCredit = cursor.getFloat(cursor.getColumnIndex("courseCredit")); Log.i("coursedb:",courseID + " " + courseName + " " + courseCredit); }while ((cursor.moveToNext())); cursor.close(); db.close(); break; } } }
- CourseHelper.java文件
package com.example.coursemanage; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class CourseHelper extends SQLiteOpenHelper { public CourseHelper(Context context){ super(context,"course.db",null,2); } //数据库第一次被创建是调用该方法 @Override public void onCreate(SQLiteDatabase db) { //初始化数据库的表结构,执行一条建表的SQL语句 db.execSQL("CREATE TABLE course(courseID VARCHAR(20),courseName VARCHAR(50),courseCredit REAL)"); } //当数据库的版本号增加时调用 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
- activity_main.xml文件
-