SQLite数据库,是一款轻型的数据库,具有运算速度快,体积小的特点。SQLite不要求具体的数据类型,但是为了方便一般我们还是明确写明了数据类型。SQLite支持事务操作。Android内置了这个数据库。
下面是SQLite数据库的一些基本知识:
1、常用类型:
Integer varcahr(10) float double char(10) text
2.1、创建表:
create table 表名(字段 数据类型 约束,字段 数据类型 约束......)
create table person(id integer primary key,name text not null...)
2.2 、删除表语句:
drop table 表名
drop table person
2.3 、插入数据:
insert into 表名 (字段1,字段2......) values(值1,值2......) 值的类型和顺序必须与字段一致
insert into person (id,name,age) values(1,'Alice',20) 若没有指定字段,值会按照顺序插入
2.4、修改数据:
update 表名 set 字段=新值 where 修改条件
update person set name="Judy" where id=1
update person set name="Judy",age=19 where id=1
2.5、删除数据
delete from 表名 where 删除的条件
delete from person where id=1 会删除整个行,如果没有指定where则删除这个表记录
SQLite操作
SQLIteOpenHelper() 数据库操作类
onCreate() 创建数据库执行的回调方法
onUpgrade() 升级数据库执行的回调方法
onOpen() 打开数据库使用的回调方法
栗子:
目标:创建4个按钮,完成创建数据库和表,新增数据,修改数据,删除数据的功能。
创建项目:SQLiteDemo
项目结构:
MySQLiteHelper.java
/**
* SQLiteOpenHelper
* 1、提供了onCreate()、onUpgrade()等相关的创建、更新数据库的方法
* 2、提供了获取数据库对象的函数
*/
public class MySQLiteHelper extends SQLiteOpenHelper {
private final String TAG = "MySQLiteHelper";
/**
* MySQLiteHelper构造函数
* @param context 上下文对象
* @param name 数据库表名
* @param factory 游标工厂,可以使用null
* @param version 数据库版本
*/
public MySQLiteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public MySQLiteHelper(Context context){
super(context,Constant.BD_NAME,null,Constant.VERSION);
}
/**
* 当数据库被创建时回调的函数
* 当getWritableDatabase()方法被调用时此方法才会运行,也就是说数据库创建是在调用getWritableDatabase()方法之后
* @param db 数据库对象
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.i(TAG, "-----onCreate-----");
String createTable = "create table person(id integer primary key,name text,age integer)";
db.execSQL(createTable);
}
/**
* 当数据库被更新时回调的函数
* @param db 数据库对象
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
Log.i(TAG, "-----onOpen-----");
}
}
知识点:这里创建了MySQLiteHpler类,继承了SQLiteOpenHelper类,这个类提供了如onCreate()、onUpgrade()等方法。并且提供了获取数据库对象的方法(getWritableDatabase()和getWritableDatabase())。在onCreate()方法中我们创建了一条sql语句用于建立一个数据库表person,然后使用SQLiteDatabase对象调用execSQL()方法执行这条语句。execSQL()方法可以执行增、删、改、创建的sql语句,但是不能执行查询的语句。
另外,为了方便操作数据库表,新建了一个Constant常量类,里面存储了要用到的数据库的常量,这样数据库和表的相关信息修改就能很方便在这个常量类里面操作了。
我们还重载了MySQLiteHelper的构造函数:
public MySQLiteHelper(Context context){ super(context,Constant.BD_NAME,null,Constant.VERSION); }
事先传入了部分常量信息,这些信息来自Constant常量类:
下面是这个类:
Constant.java
public class Constant {
public static final String BD_NAME = "info.db";
public static final String TABLE_NAME = "person";
public static final int VERSION = 1;
}
还定义了一个数据库操作工具类DbManager.java
如下代码:
public class DbManager {
static MySQLiteHelper helper;
static MySQLiteHelper getInstance(Context context){
if (helper == null){
helper = new MySQLiteHelper(context);
}
return helper;
}
}
该类用于方便的获取MySQLiteHelper类的对象,并且单例模式确保只有一个自己的实例。
接下来在activity_main.xml中创建放置4个按钮,如下:
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"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_create"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="创建数据库"
android:onClick="createDB"/>
<Button
android:id="@+id/btn_insert"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="插入数据"
android:onClick="click"/>
<Button
android:id="@+id/btn_update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click"
android:text="修改数据"
/>
<Button
android:id="@+id/btn_delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除数据"
android:onClick="click"/>
</LinearLayout>
通过单击不同的按钮触发不同的事件。
第一个按钮用于创建数据库和数据课表
第二个按钮用于向数据库表中插入数据
第三个按钮用于修改表中的数据
第四个按钮删除表中的数据
这些逻辑实现都写在MainActivity中
MainActivity.java
public class MainActivity extends AppCompatActivity {
private MySQLiteHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helper = DbManager.getInstance(this);
}
/**
* 点击按钮创建数据库
* @param view
*/
public void createDB(View view){
helper.getWritableDatabase();
}
public void click(View view){
switch (view.getId()){
case R.id.btn_insert:
SQLiteDatabase db = helper.getWritableDatabase();
String insertSql = "insert into "+Constant.TABLE_NAME+" values(2,'Bob',19)";
db.execSQL(insertSql);
String insertSql1 = "insert into "+Constant.TABLE_NAME+" values(1,'Jack',30)";
db.execSQL(insertSql1);
String insertSql2 = "insert into "+Constant.TABLE_NAME+" values(3,'Tommy',23)";
db.execSQL(insertSql2);
db.close();
break;
case R.id.btn_update:
db = helper.getWritableDatabase();
String updateSql = "update "+Constant.TABLE_NAME+" set name = 'Alice' where id = 2";
db.execSQL(updateSql);
db.close();
break;
case R.id.btn_delete:
db = helper.getWritableDatabase();
String deleteSql = "delete from "+Constant.TABLE_NAME+" where id = 3";
db.execSQL(deleteSql);
db.close();
break;
}
}
}
首先通过工具类DbManager类获取MySQLiteHelper类的实例helper,然后通过helper对象调用getWritaableDataBase()方法获取数据库对象db,将数据库的插入/更新/删除语句作为execSQL()方法的参数执行。
注意:
createDB这个方法只有helper.getWritableDatabase()
这一行语句。相关的创建表的语句在MySQLiteHelper类的onCreate()方法中,onCreate()这个方法是一个当数据库被创建后回调的方法,那么数据库是何时被创建呢?答案是当getWritableDatabase()方法被调用时。为了方便验证在onCreate()方法中打印一条语句-----onCreate-----
,顺便也给onOpen()方法打印一条语句------onOpen------
,下面运行这个程序:
程序开始运行,未点击任何按钮:
我们看到这个时候并未打印onCreate()运行的信息,这个数据库也并未被创建。
程序运行中,单击创建数据库按钮:
可以看到这个时候执行了onCreate()和onOpen()方法,数据库和表也被创建了,但是这个时候表中还没有任何数据。这个Button做了什么呢。这个Button只有这一行语句:helper.getWritableDatabase()
,这就说明了数据库的确是在getWritableDatabase()方法执行后创建的。getWritableDatabase()这个方法就是没有数据库就创建一个数据库,有数据库就不执行。
单击插入数据按钮:
这个时候会执行onOpen()这个方法
单击修改数据按钮:
这里我不注意点了两次,请自动忽略一个onOpen()方法,事实上这个时候会报一个错误,因为两次插入了完全相同的值。
单击删除数据按钮:
很明显onOpen()方法从创建到各种操作都被运行了,其实也很好理解,你要操作表当然得打开表啊。