文章目录
- [1. Android开发之外访Sqlite数据库](#1. Android开发之外访Sqlite数据库)
1. Android开发之外访Sqlite数据库
SQLite是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite是一个增长最快的数据库引擎,这是在普及方面的增长,与它的尺寸大小无关。SQLite 源代码不受版权限制。
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。
就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。
1.1 Sqlite数据库的优点
- 不需要一个单独的服务器进程或操作的系统(无服务器的)。
- SQLite 不需要配置,这意味着不需要安装或管理。
- 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。
- SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。
- SQLite 是自给自足的,这意味着不需要任何外部的依赖。
- SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
- SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。
- SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。
- SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行。
1.2 Sqlite接口简介
接口中的抽象方法
- 首先你要知道SQLiteOpenHelper 是一个抽象类,这意味着如果我们想要使用它的话,就需要创建一个 自己的帮助类去继承它。SQLiteOpenHelper 中有两个抽象方法,分别是onCreate()和onUpgrade() ;两个方法需要实现创建、升级数据库的逻辑。
接口中的实例方法
-
sQLiteOpenHelper中还有两个非常重要的实例方法 : **getReadableDatabase()**和 getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。
不同的是当数据库不可写人的时候(如磁盘空间已满), **getReadableDatabase()方法返回的对象将以只读的方式打开数据库,而getWritableDatabase()**方法则将出现异常。
接口的构造方法
- SQLiteOpenHelper 中有两个构造方法可供重写,一般使用参数少一点的那个构造方法即可。这个构造方法中接收4个参数,第一个参数是Context ,就是上下文环境,必须要有它才能对数据库进行操作。第二个参数是数据库名,创建数据库时使用的就是这里指定的名称。第三个参数允许我们在查询数据的时候返回一个自定义的Cursor ,一般都是传人null 。第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。构建出SQLiteOpenHelper 的实例之后,再调用它的**getReadableDatabase()或 getWritableDatabase()方 法就能够创建数据库了此时,重写的onCreate()**方法也会得到执行,所以通常会在这里去处理一些创建表的逻辑。
示例
步骤
- 实现
SQLiteOpenHelper
接口,重写其中的onCreate()
和onUpgrade()
方法- 定义建表语句
- 在
onCreate()
方法中使用参数调用execSQL()
方法传入建表语句;【可以使用一个Toast显示创建成功】
- 在java文件中定义触发方式 和触发逻辑
- 使主类继承点击接口;定义控件,获取控件,定义事件监听器
- 别忘了在
onCreate()
方法中找到控件 - 使用
SQLiteDatabase
定义数据库操作对象 - 使用
ContentValues
定义数据组装以便后续传入数据库 - 对象调用
ContentValues
的put()
方法组装数据 - 对象调用
SQLiteDatabase
定义的insert()
、update()
、delete()
方法操作数据库
- 别忘了在
- 使主类继承点击接口;定义控件,获取控件,定义事件监听器
例子 ------ 实现增删改查
activity_main.xml
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<android.widget.Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/create_database"
android:text="Create database"/>
<android.widget.Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/add_data"
android:text="Add data"/>
<android.widget.Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/update_data"
android:text="Update data"/>
<android.widget.Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/delete_data"
android:text="Delete data"/>
</LinearLayout>
MySqliteOpenHelper.java
java
package com.example.sql;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
import androidx.annotation.Nullable;
public class MySqliteOpenHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK = "create table Book ("
+ "_id integer primary key autoincrement,"
+ "author text,"
+ "price real,"
+ "pages integer,"
+ "name text)";
private Context mContext;
public MySqliteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
// 数据库创建时调用
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
Toast.makeText(mContext, "create succeed", Toast.LENGTH_SHORT).show();
}
// 数据库升级时使用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
MainActivity.java
java
package com.example.sql;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
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 implements View.OnClickListener {
private MySqliteOpenHelper dbHelper;
private Button createDatabase;
private Button addData;
private Button updateData;
private Button deleteData;
private Button queryData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MySqliteOpenHelper(this,"BookStore.db",null,2);
createDatabase = findViewById(R.id.create_database);
addData = findViewById(R.id.add_data);
updateData = findViewById(R.id.update_data);
deleteData = findViewById(R.id.delete_data);
queryData = findViewById(R.id.query_data);
createDatabase.setOnClickListener(this);
addData.setOnClickListener(this);
updateData.setOnClickListener(this);
deleteData.setOnClickListener(this);
queryData.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v.getId() == R.id.create_database){
dbHelper.getWritableDatabase();
}else if(v.getId() == R.id.add_data){
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
// 开始组装第一条数据
values.put("name","The Da Vinci Code");
values.put("author","Dan Brown");
values.put("pages","454");
values.put("price","16.96");
db.insert("Book",null,values); // 插入第一条数据
values.clear();
// 开始组装第二条数据
values.put("name","The Lost Symbol");
values.put("author","Dan Brown");
values.put("pages","510");
values.put("price","19.95");
db.insert("Book",null,values); // 插入第一条数据
Toast.makeText(this, "add succeed", Toast.LENGTH_SHORT).show();
}else if(v.getId() == R.id.update_data){
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price",10.99);
db.update("Book",values,"name = ?",new String[]{"The Da Vinci Code"});
Toast.makeText(this, "update succeed", Toast.LENGTH_SHORT).show();
}else if(v.getId() == R.id.delete_data){
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book","pages > ?",new String[]{ "500" });
Toast.makeText(this, "delete succeed", Toast.LENGTH_SHORT).show();
}else if(v.getId() == R.id.query_data){
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(0);
String author = cursor.getString(0);
int pages = cursor.getInt(0);
double price = cursor.getDouble(0);
Log.d("MainActivity","book name is " + name);
Log.d("MainActivity","book author is " + author);
Log.d("MainActivity","book pages is " + pages);
Log.d("MainActivity","book price is " + price);
}while(cursor.moveToNext());
}
Toast.makeText(this, "yes", Toast.LENGTH_SHORT).show();
cursor.close();
}
}
}