1、SQLite简介
SQLite是一款轻量级的关系型数据库,他支持SQL语言。由于它占用的资源非常少,利用很少的内存就有很好的性能,所以很多嵌入式设备都使用SQLite来存储数据。它支持windows、Linux以及UNIX等主流的操作系统,兼容性好。可以使用java、C#和PHP等多种开发语言,通过ODBC接口操作SQLite。
目前的一些主流移动操作系统(如Android和IOS等),都在使用SQLite作为复杂数据的存储引擎。
2、SQLite的数据类型
一般数据库采用的是固定的静态数据类型,而SQLite采用的是动态数据类型,它会根据输入的数值自动判断并存储。SQLite具有以下五种数据类型。
NULL:空值;
INTEEGER: 带符号的整型,具体取决于存入数字的范围大小;
REAL:浮点数字,存储为8-byte IEEE浮点数;
TEXT:字符串文本;
BLOB:二进制对象。
实际上,SQLite3也支持smallint、integer、float、decimal、double、varchar、date以及time等数据类型。
3、SQLite的基本用法
1.创建或打开数据库
当需要创建或打开一个数据库并获得数据库对象时,首先根据指定的文件名,利用SQLiteOpenHelper类创建一个辅助对象,并调用该对象的getWritableDatabase()方法或者getReadableDatabase()方法来获得一个SQLiteDatabase对象,此时才创建或者打开了一个数据库。
创建或者打开一个数据库的基本语法如下:
//创建StudentsDBHelper对象
StundentsDBHelper dbHelper = new StundentsDBHelper(MainActivity.this,"stdentDB",null,1);
//得到一个可读的SQLiteDatabase对象
SQLiteDatabase db = dbHelper.getReadableDatabase();
2.关闭数据库
使用完数据库后,应该及时将其关闭,以便释放其所占的系统资源。Android系统利用SQLiteOpenHelper类的close()方法关闭打开的数据库。
3.创建或删除表
创建数据库的一个表的基本方法是:编写创建表(create table)或删除表(drop table)的SQL语句,然后调用SQLiteDatabase类的execSQL()方法来执行该SQL语句。
4.插入数据
向表中插入数据有以下两种方法。
方法1:利用SQLiteDatabase类的insert(String table,String nullColumnHack,ContentValues values)方法。
其中,各参数的意义如下:
table:表名称。
nullColumnHack:空列的默认值。
values:ContentValues类型的键值对Key-Values。
方法2:编写插入数据(insert)的SQL语句,然后调用SQLiteDatabase类的execSQL()方法执行该SQL语句。
5.删除语句
删除表中的数据有以下两种方法。
方法1:利用SQLiteDatabase类的delete(String table,String whereClause,String【】 whereArgs)方法。
其中,各参数的意义如下:
table:表名称。
whereClause:删除条件。
whereArgs:删除条件值数组。
方法2:编写删除数据(delete)的SQL语句,然后调用SQLiteDatabase类的execSQL()方法来执行该SQL语句。
6.修改数据
修改表中的数据有以下两种方法。
方法1:利用SQLiteDatabase类的update(String table,ContentValues values,String whereClause,String【】 whereArgs)方法。
其中,各参数的意义如下:
table:表名称。
values:ContentValues类型的键值对Key-Values。
whereClause:更新条件(where子句)。
whereArgs:更新条件数据。
方法2:编写更新数据(update)的SQL语句,然后调用SQLiteDatabase类的execSQL()方法来执行该SQL语句。
7.查询数据
查询表中的数据有以下两种常用的方法。
方法1:在Android中查询数据可以通过Cursor类实现。当使用SQLiteDatabase.query()方法时,会得到一个Cursor对象,Cursor指向每一条数据,提供了很多有关查询的方法,常用的方法是 public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit)。
其中,各参数的意义如下:
table:表名称。
columns:列名称数组。
selection:条件子句,相当于where。
selectionArgs:条件子句,参数数组。
groupBy:分组列。
having:分组条件。
orderBy:排序列。
limit:分页查询限制。
Cursor:返回值,相当于结果集ResultSet。
【说明】对于不使用的参数,可以将将他们设置为NULL。
Cursor是一个游标接口,提供了遍历查询结果的方法,例如,移动指针方法move()、获得列值方法getString()等。
方法2:同样通过Cursor类,利用db.rawQuery(String sql,String[] selectionArgs)方法。
其中,各参数的意义如下:
sql:查询(select)的SQL条件子句。
selectionArgs:条件子句,参数数组。
示例:
开发一个Android应用程序,通过单击相应按钮,创建一个SQLite数据库,用来保存学生的“姓名”、“年龄”和“入学日期”这3个字段数据,并且还可以实现数据库的增加、删除、修改和查询等基本功能。
XML布局代码如下:
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:columnCount="4"
tools:context="zut.edu.e13_4.MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_row="1"
android:layout_column="0"
android:layout_gravity="right"
android:text="姓名:"
android:textColor="@android:color/black"/>
<EditText
android:id="@+id/name"
android:layout_columnSpan="2"
android:ems="6"/>
<TextView
android:id="@+id/textView2"
android:layout_column="0"
android:layout_gravity="right"
android:text="年龄:"
android:textColor="@android:color/black"/>
<EditText
android:id="@+id/age"
android:layout_columnSpan="2"
android:ems="6"/>
<TextView
android:id="@+id/textView3"
android:layout_column="0"
android:layout_gravity="right"
android:text="入学时间:"
android:textColor="@android:color/black"/>
<EditText
android:id="@+id/enrol"
android:layout_columnSpan="2"
android:ems="6"/>
<Button
android:id="@+id/previous"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_column="1"
android:text="<上一条"/>
<Button
android:id="@+id/next"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_column="2"
android:text="下一条>"/>
<Button
android:id="@+id/insert"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_row="5"
android:layout_column="0"
android:text="插入"/>
<Button
android:id="@+id/update"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:text="更新"/>
<Button
android:id="@+id/query"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:text="查询"/>
<Button
android:id="@+id/delete"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:text="删除"/>
<Button
android:id="@+id/createDatabase"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="6"
android:layout_column="1"
android:layout_columnSpan="2"
android:layout_gravity="center"
android:text="创建数据库"/>
</GridLayout>
另外 在包含MainActivity.java的包里面新建一个StudentsDBHelper类。
其中该类的具体代码如下:
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* Created by 86166 on 2022/5/9.
*/
public class StundentsDBHelper extends SQLiteOpenHelper {
private static final String TAG = "studentDB";
//必要构造参数
public StundentsDBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
//第一次创建数据库时调用该方法
public void onCreate(SQLiteDatabase db){
//创建新表
String sql = "create table student_table(TxtName TEXT,IntAge INTEGER,TxtEnrol TEXT)";
db.execSQL(sql);
//输出创建数据库的日志信息
Log.i(TAG,"create Database OK!");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i(TAG,"update Database OK!");
}
}
打开MainActivity.java,编写相应的代码:
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
//定义各种控件对象
private Button createBtn;
private Button insertBtn;
private Button updateBtn;
private Button queryBtn;
private Button deleteBtn;
private Button previousBtn;
private Button nextBtn;
private EditText nameEdt;
private EditText ageEdt;
private EditText enrolEdt;
//定义对应的参数
private Cursor cursor;
private String name,age,enrol;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获得各控件对象;
createBtn = (Button)findViewById(R.id.createDatabase);
insertBtn = (Button)findViewById(R.id.insert);
updateBtn = (Button)findViewById(R.id.update);
queryBtn = (Button)findViewById(R.id.query);
deleteBtn = (Button)findViewById(R.id.delete);
previousBtn = (Button)findViewById(R.id.previous);
nextBtn = (Button)findViewById(R.id.next);
nameEdt = (EditText)findViewById(R.id.name);
ageEdt = (EditText)findViewById(R.id.age);
enrolEdt = (EditText) findViewById(R.id.enrol);
//为按钮注册监听器
createBtn.setOnClickListener(new CreateListener());
deleteBtn.setOnClickListener(new DeleteListener());
queryBtn.setOnClickListener(new QueryListener());
updateBtn.setOnClickListener(new ModifyListener());
insertBtn.setOnClickListener(new InsertListener());
nextBtn.setOnClickListener(new NextListener());
previousBtn.setOnClickListener(new PreviousListener());
}
//创建数据库
class CreateListener implements View.OnClickListener{
@Override
public void onClick(View v){
//创建StudentsDBHelper对象
StundentsDBHelper dbHelper = new StundentsDBHelper(MainActivity.this,"stdentDB",null,1);
//得到一个可读的SQLiteDatabase对象
SQLiteDatabase db = dbHelper.getReadableDatabase();
Toast.makeText(MainActivity.this,"数据库创建成功。",Toast.LENGTH_LONG).show();
}
}
//插入数据
class InsertListener implements View.OnClickListener{
@Override
public void onClick(View v){
try{
StundentsDBHelper dbHelper = new StundentsDBHelper(MainActivity.this,"studentDB",null,1);
//得到一个可写的数据库对象
SQLiteDatabase db = dbHelper.getWritableDatabase();
//生成ContentValues对象(key:列名,value:要插入的值)
ContentValues cv = new ContentValues();
//向ContentValues对象中存放数据(键—值对)
cv.put("TxtName",nameEdt.getText().toString());
cv.put("IntAge",ageEdt.getText().toString());
cv.put("TxtEnrol",enrolEdt.getText().toString());
//将数据插入表
db.insert("student_table",null,cv);
//关闭数据库
db.close();
Toast.makeText(MainActivity.this,"插入数据成功。",Toast.LENGTH_LONG).show();
}catch (SQLException e){
Toast.makeText(MainActivity.this,"插入数据失败.",Toast.LENGTH_LONG).show();
}
}
}
//查询数据
class QueryListener implements View.OnClickListener{
@Override
public void onClick(View v){
StundentsDBHelper dbHelper = new StundentsDBHelper(MainActivity.this,"studentDB",null,1);
//获得一个可读的数据库
SQLiteDatabase db = dbHelper.getReadableDatabase();
cursor = db.rawQuery("SELECT * FROM student_table WHERE TxtName=?",new String[]{nameEdt.getText().toString()});
//如果有查询结果,则移动游标到第一条记录
if(cursor.getCount()>0){
cursor.moveToFirst();
name = cursor.getString(cursor.getColumnIndex("TxtName"));
nameEdt.setText(name);
age = cursor.getString(cursor.getColumnIndex("IntAge"));
ageEdt.setText(age);
enrol = cursor.getString(cursor.getColumnIndex("TxtEnrol"));
enrolEdt.setText(enrol);
}else {
Toast.makeText(MainActivity.this,"没有满足条件的数据。",Toast.LENGTH_LONG).show();
}
//关闭数据库
db.close();
}
}
//修改数据
class ModifyListener implements View.OnClickListener{
@Override
public void onClick(View v){
StundentsDBHelper dbHelper = new StundentsDBHelper(MainActivity.this,"studentDB",null,1);
//得到一个可写的数据库对象
SQLiteDatabase db = dbHelper.getWritableDatabase();
//定义一个ContentValeus对象
ContentValues cv = new ContentValues();
cv.put("IntAge",ageEdt.getText().toString());
cv.put("TxtEnrol",enrolEdt.getText().toString());
//where子句
String whereClause="TxtName=?";
//where子句的条件
String [] whereArgs = {String.valueOf(nameEdt.getText())};
db.update("student_table",cv,whereClause,whereArgs);
//关闭数据库
db.close();
Toast.makeText(MainActivity.this,"修改数据成功。",Toast.LENGTH_LONG).show();
}
}
//删除数据
class DeleteListener implements View.OnClickListener{
@Override
public void onClick(View v){
StundentsDBHelper dbHelper = new StundentsDBHelper(MainActivity.this,"studentDB",null,1);
//得到一个可写的数据库对象
SQLiteDatabase db = dbHelper.getWritableDatabase();
String whereClauses = "TxtName = ?";
String [] whereArgs = {String.valueOf(nameEdt.getText())};
//删除数据
db.delete("student_table",whereClauses,whereArgs);
nameEdt.setText("");
ageEdt.setText("");
enrolEdt.setText("");
db.close();
Toast.makeText(MainActivity.this,"删除数据成功。",Toast.LENGTH_LONG).show();
}
}
//上一条数据
class PreviousListener implements View.OnClickListener{
@Override
public void onClick(View v){
if(!cursor.isFirst()){
cursor.moveToFirst();
name = cursor.getString(cursor.getColumnIndex("TxtName"));
nameEdt.setText(name);
age = cursor.getString(cursor.getColumnIndex("IntAge"));
ageEdt.setText(age);
enrol = cursor.getString(cursor.getColumnIndex("TxtEnrol"));
enrolEdt.setText(enrol);
}
}
}
//下一条数据
class NextListener implements View.OnClickListener{
@Override
public void onClick(View v){
if(!cursor.isLast()){
cursor.moveToNext();
name = cursor.getString(cursor.getColumnIndex("TxtName"));
nameEdt.setText(name);
age = cursor.getString(cursor.getColumnIndex("IntAge"));
ageEdt.setText(age);
enrol = cursor.getString(cursor.getColumnIndex("TxtEnrol"));
enrolEdt.setText(enrol);
}
}
}
}