引言
文件存储和SharePreference存储只适合存储一些简单的数据和键值对,当需要存储大量复杂的关系型数据的时候,就需要用到SQLite数据库。
函数与相关类介绍
SQLiteOpenHelper
SQLiteOpenHelper是一个抽象类,里面含有两个抽象方法onCreate
和onUpgrade
,他们实现数据库的创建和升级!
getReadableDatabase()
和getWritableDatabase()
都可以创建或打开一个现有的数据库(当数据库不存在时他们就会创建一个数据库),并返回一个可对数据库进行读写的对象,而他们唯一的区别就在于,当磁盘空间满时,及不可以写入,那么getReadableDatabase()
返回的是一个只读对象,而getWritableDatabase()
会出现异常
创建数据库
编写建表语句
public static final String CREATE_BOOK="create table Book(" +
"id integer primary key autoincrement," +
"author text," +
"price real," +
"pages integer," +
"name text)";
创建MyDatabaseHelper.java
package com.example.sqlite;
import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK="create table Book( _id integer primary key autoincrement,sname text,snumber text)";
private Context mContext;
public MyDatabaseHelper(@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 succeeded",Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
编辑视图
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/create_database"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Create database"
tools:ignore="MissingConstraints"/>
</androidx.constraintlayout.widget.ConstraintLayout>
编写主活动
package com.example.sqlite;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button createDatabase=(Button)findViewById(R.id.create_database);
dbHelper=new MyDatabaseHelper(this,"BookStore.db",null,1);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
}
}
运行
出现以下错误:
我是未实例化
dbHelper=new MyDatabaseHelper(this,“BookStore.db”,null,1);
```java
java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase com.example.sqlite.MyDatabaseHelper.getWritableDatabase()' on a null object reference
at com.example.sqlite.MainActivity$1.onClick(MainActivity.java:18)
查看创建的数据库表
首先配置ADB
然后再CMD操作
如何向数据库中插入表
通过以上部分我们知道了,如何创建数据库,并向其中创建一个表!那么我们再次向数据库中加入表时,又将会如何呢?
创建表
public static final String CREATE_CATEGORY="create table Category(" +
"id integer primary key autoincrement, " +
"author text, " +
"price real, " +
"pages integer, " +
"name text)";
加入我们直接修改成以下代码,那么会成功吗
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext,"Create succeeded",Toast.LENGTH_SHORT).show();
}
我们重新运行程
将不会有提示产生,并且查看adb,依旧没有新表。
原因,因为数据库已经存在,所以程序将不会运行onCreate()函数。
解决方法
在onUpgrade()方法中进行操作
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
并且修改MainActivety.java
dbHelper=new MyDatabaseHelper(this,"BookStore.db",null,2);
运行结果
建表成功
总结
已经了解到如何创建数据库,并且添加新表,对数据库进行升级更新!在下一篇我们将继续了解SQLite数据库的增删改查!
依赖教材代码,从中找出漏洞,提高自己的思维!
欢迎加入程序员技术交流群一起成长!