文章目录
- 1. SQLite 介绍
- 2. SQLite可视化工具 安装
- 3. SQLite的增删改查
- 3.1 SqliteOpenHelper 创建 库或表
- 3.2 SqliteOpenHelper 实现 增删改查
1. SQLite 介绍
SQLite的注意事项:
- 标准的主键写法:_id。(不标准写法:id),此外,主键只能是Integer类型的。
- 像varchar,char等最终内部都会转变成text格式。
android里面的SQLite数据库是由底层的sqlite.c的代码来动态生成的。
2. SQLite可视化工具 安装
官方下载地址:https://www.sqliteexpert.com/download.html
模拟器下面的db数据库查找:
3. SQLite的增删改查
3.1 SqliteOpenHelper 创建 库或表
android系统封装了一个SqliteOpenHelper抽象工具类,来对SQLite进行增删改查。
示例:
实现通过点击按钮,来创建一个数据库,并且数据库中带有表格的效果。
<?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"tools:context=".MainActivity"android:orientation="vertical"><Buttonandroid:text="生成DB文件"android:onClick="createDB"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>
MySqliteOpenHelper
package com.example.sqlitetest;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;/*** MySqliteOpenHelper 工具类 单例模式(1.构造函数私有化,2.对外提供函数。)*/
// 该类就可以理解为一个数据库了。
public class MySqliteOpenHelper extends SQLiteOpenHelper {// 单例模式private static SQLiteOpenHelper mInstance;// 提供对外提供的函数。public static synchronized SQLiteOpenHelper getInstance(Context context){if (mInstance == null){mInstance = new MySqliteOpenHelper(context,"itholmes.db",null,1);}return mInstance;}/*** 通过构造函数,将数据库名称 , 数据库版本号等定义出来。因此,必须要声明一个构造函数。* @param context context就是环境,在此环境下进行创建数据库。* @param name 数据库名称* @param factory 工厂* @param version 版本 数据库升级后需要不断加1操作!*/public MySqliteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}/*** 数据库初始化用的:* 创建表 表数据初始化 数据库第一次创建的时候调用。第二次发现有该表了就不会重复创建了!* 此函数只会执行一次。 因此,添加了新的数据库或者修改了数据库,必须要对应项目目录将databases目录下的db等文件删除。* @param sqLiteDatabase*/@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {// 创建表:person表。// 主键: _id(标准) 或者 id(不标准) 必须唯一,也可以添加自动增长 。String sql = "create table persons(" +"_id integer primary key autoincrement," +"name text" +")";// 执行sqlsqLiteDatabase.execSQL(sql);}// 数据库升级用的@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}}
MainActivity
package com.example.sqlitetest;import androidx.appcompat.app.AppCompatActivity;import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.View;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}// 生成DB文件public void createDB(View view){// 通过MySqliteOpenHelper来操作SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this);// databases数据库文件的创建,靠下面这句话。// 读SQLiteDatabase readableDatabase = helper.getReadableDatabase();// 写// SQLiteDatabase writableDatabase = helper.getWritableDatabase();}}
数据线连接到手机,开启开发者调试也可以找到:
注意:因为,SQLiteOpenHelper的onCreate只会加载一次,并且如果发现该数据库已经创建就不会在执行了。因此,修改了sqlite的数据库内容,再次加载前一定要删除对应databases目录下的内容。
3.2 SqliteOpenHelper 实现 增删改查
SqliteOpenHelper 实现 增删改查效果:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"><Buttonandroid:text="生成DB文件"android:onClick="createDB"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:text="查询"android:onClick="query"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:text="插入"android:onClick="insert"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:text="修改"android:onClick="update"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:text="删除"android:onClick="delete"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>
MySqliteOpenHelper
package com.example.sqlitetest;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;/*** MySqliteOpenHelper 工具类 单例模式(1.构造函数私有化,2.对外提供函数。)*/
// 该类就可以理解为一个数据库了。
public class MySqliteOpenHelper extends SQLiteOpenHelper {// 单例模式private static SQLiteOpenHelper mInstance;// 提供对外提供的函数。public static synchronized SQLiteOpenHelper getInstance(Context context){if (mInstance == null){mInstance = new MySqliteOpenHelper(context,"itholmes.db",null,1);}return mInstance;}/*** 通过构造函数,将数据库名称 , 数据库版本号等定义出来。因此,必须要声明一个构造函数。* @param context context就是环境,在此环境下进行创建数据库。* @param name 数据库名称* @param factory 工厂* @param version 版本 数据库升级后需要不断加1操作!*/public MySqliteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}/*** 数据库初始化用的:* 创建表 表数据初始化 数据库第一次创建的时候调用。第二次发现有该表了就不会重复创建了!* 此函数只会执行一次。 因此,添加了新的数据库或者修改了数据库,必须要对应项目目录将databases目录下的db等文件删除。* @param sqLiteDatabase*/@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {// 创建表:person表。// 主键: _id(标准) 或者 id(不标准) 必须唯一,也可以添加自动增长 。String sql = "create table persons(" +"_id integer primary key autoincrement," +"name text" +")";// 执行sqlsqLiteDatabase.execSQL(sql);}// 数据库升级用的@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}}
MainActivity
package com.example.sqlitetest;import androidx.appcompat.app.AppCompatActivity;import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}// 生成DB文件public void createDB(View view){// 通过MySqliteOpenHelper来操作SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this);// databases数据库文件的创建,靠下面这句话。// 读SQLiteDatabase readableDatabase = helper.getReadableDatabase();// 写// SQLiteDatabase writableDatabase = helper.getWritableDatabase();}// sql 查询语句public void query(View view){// helper单例模式,因此随便调用。SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this);// 查询调用getReadableDatabase就行。SQLiteDatabase db = helper.getReadableDatabase();// db.isOpen():如果db数据库是打开的,就返回true,反之返回false。if (db.isOpen()){// rawQuery方法进行查询,并且返回了一个Cursor游标。Cursor cursor = db.rawQuery("select * from persons", null);// 迭代游标// cursor.moveToNext()就是让游标下移,遍历数据。while (cursor.moveToNext()){// 可以直接通过索引获取。// int anInt = cursor.getInt(0);// 也可以通过cursor.getColumnIndex("_id")这种形式来获取,容错率大一点。int id = cursor.getInt(cursor.getColumnIndex("_id"));String name = cursor.getString(cursor.getColumnIndex("name"));Log.d("itholmes","_id:"+ id + ",name" + name);}// 一定记得关闭游标,否则耗费性能!cursor.close();// 数据库也要关闭!db.close();}}public void insert(View view) {// helper单例模式,因此随便调用。SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this);// 增删改都需要调用getWritableDatabaseSQLiteDatabase db = helper.getWritableDatabase();if (db.isOpen()){// 插入语句String sql = "insert into persons(name) values ('张三')";db.execSQL(sql);}// 关闭数据库db.close();}// 修改public void update(View view) {// helper单例模式,因此随便调用。SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this);// 增删改都需要调用getWritableDatabaseSQLiteDatabase db = helper.getWritableDatabase();if (db.isOpen()){String sql = "update persons set name = ? where _id = ?";// 添加参数db.execSQL(sql,new Object[]{"李四",1});}db.close();}// 删除public void delete(View view) {// helper单例模式,因此随便调用。SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this);// 增删改都需要调用getWritableDatabaseSQLiteDatabase db = helper.getWritableDatabase();if (db.isOpen()){String sql = "delete from persons where _id = ?";db.execSQL(sql,new Object[]{1});}db.close();}
}