一、简单的介绍SQLite数据库
1、SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLite.
2、SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。SQLite 基本上符合 SQL-92 标准,和其他的主要 SQL 数据库没什么区别。它的优点就是高效,Android 运行时环境包含了完整的 SQLite。
3、SQLite 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。比如可以把一个字符串(String)放入 INTEGER 列。SQLite 称这为“弱类型”(manifest typing.)。此外,SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。除了上述功能外,SQLite 是一个完整的 SQL 系统,拥有完整的触发器,交易等等。
4、Android 在运行时集成了 SQLite轻量级关系型数据库,所以每个 Android 应用程序都可以使用 SQLite 数据库。对于熟悉 SQL 的开发人员来时,在 Android 开发中使用 SQLite 相当简单。但是,由于 JDBC 会消耗太多的系统资源,所以 JDBC 对于手机这种内存受限设备来说并不合适。因此,Android 提供了一些新的 API 来使用 SQLite 数据库,Android 开发中,程序员需要学使用这些 API。数据库存储在 data/< 项目文件夹 >/databases/ 下。
注:该介绍摘自https://www.ibm.com/developerworks/cn/opensource/os-cn-sqlite/
二、使用SQLite数据库的界面布局
1、界面布局的代码:
<?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"
tools:layout_editor_absoluteY="81dp">
<Button
android:id="@+id/create_db"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="创建数据库"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/add_data"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="添加数据"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/create_db" />
<Button
android:id="@+id/select_data"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="96dp"
android:text="查询数据"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/create_db" />
<Button
android:id="@+id/del_data"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="48dp"
android:text="删除数据"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/create_db" />
<Button
android:id="@+id/update_data"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="152dp"
android:text="修改数据"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/create_db" />
</android.support.constraint.ConstraintLayout>
2、界面布局的效果展示:
二、创建一个MyDBHelper类继承SQLiteOpenHelper
1、SQLiteOpenHelper是一个抽象类,一个帮助类,用于管理数据库创建和版本管理。
- 有两个抽象方法,onCrearte(SQLiteDatabase db)、onUpdate(SQLiteDatabase db, int oldVersion, int newVersion)。
- 实现的方法有getReadableDatabase()、getWriteableDatabase()用来创建数据库或者打开一个现有的数据库。
2、MyDBHelper.java代码
package cn.edu.sxy.databasedemo;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
public class MyDBHelper extends SQLiteOpenHelper {
//创建Book表的SQL语句
public static final String CREATE_BOOK = "create table Book(" +
"id integer primary key autoincrement,"
+ "author text,"
+ "price real,"
+ "pages integer,"
+ "name text)";
//1.在已经创建Book表的基础上,再创建category表,表的SQL语句如下(增加表)
private static final String CREATE_CATEGORY = "create table category ("
+ "id integer primary key autoincrement,"
+ "category_name text,"
+ "category_code integer)";
private Context mContext;
/**
* 构造方法
* @param context
* @param name
* @param factory
* @param version
*/
public MyDBHelper (Context context, String name, SQLiteDatabase.CursorFactory factory,int version){
super(context,name,factory,version);
mContext = context;
}
/**
* 创建数据库
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);//2.新增加category表,还需要在onUpdate()方法中做出修改
Toast.makeText(mContext,"数据库创建成功",Toast.LENGTH_LONG).show();
}
/**
* 升级数据库
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
/**
* 3.在onUpdate()方法中执行两条DROP语句,若数据库中已经存在Book表或Category表,
* 就将者两张表删除,然后调用onCreate()方法重新创建
*/
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
}
三、在MainActivity.java中创建数据库,及对数据进行CRUD操作
1、实现代码:
package cn.edu.sxy.databasedemo;
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.Toast;
public class MainActivity extends AppCompatActivity {
private MyDBHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* 4.想要onUpgrade()能够执行,就需要修改SQLiteOpenelper的构造方法,将第
* 四个参数的值改为比1大的数,该参数表示的是当前数据库的版本号。
* 例如:dbHelper = new MyDBHelper(this,"BookStore.db",null,2);
*/
dbHelper = new MyDBHelper(this, "BookStore.db", null, 2);
Button createDB = findViewById(R.id.create_db);
createDB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//调用getWritableDatabase()方法可以创建数据库
//若有该数据库,则直接打开;否则,重新创建一个数据库
dbHelper.getWritableDatabase(); //返回的是一个SQLiteDatabase对象
}
});
//添加数据
Button addData = findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
//开始组装第一条数据
values.put("name", "Think in java(Java编程思想)");
values.put("author", "XXX");
values.put("pages", 800);
values.put("price", 85.36);
//插入第一条数据
db.insert("Book", null, values);
values.clear();
//开始组装第二条数据
values.put("name", "Android");
values.put("author", "XX");
values.put("pages", 354);
values.put("price", 45.36);
//插入第二条数据
db.insert("Book", null, values);
Toast.makeText(MainActivity.this, "数据插入成功", Toast.LENGTH_LONG).show();
}
});
//查询数据
Button queryData = findViewById(R.id.select_data);
queryData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
//查询Book表中的所有数据
Cursor cursor = db.query("Book", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
//遍历Cursor对象,取出数据并打印
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
Log.d("MainActivity", "书的名字是 :" + name);
Log.d("MainActivity", "书的作者是 :" + author);
Log.d("MainActivity", "书的页数是 :" + pages);
Log.d("MainActivity", "书的价格是 :" + price);
Toast.makeText(MainActivity.this, " " + name + " " + author + " " + pages + " " + price, Toast.LENGTH_LONG).show();
} while (cursor.moveToNext());
}
Toast.makeText(MainActivity.this, "数据查询成功", Toast.LENGTH_LONG).show();
}
});
//修改数据
Button updateData = findViewById(R.id.update_data);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price",30.00);
db.update("Book",values,"name = ?" ,new String[]{"Think in java(Java编程思想)"});
}
});
//删除数据
Button delData = findViewById(R.id.del_data);
delData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book","pages > ?",new String[] {"600"});
Toast.makeText(MainActivity.this,"页数超过500页的数据删除成功",Toast.LENGTH_LONG).show();
}
});
}
}