SQLite数据库存储

引言

         文件存储和SharePreference存储只适合存储一些简单的数据和键值对,当需要存储大量复杂的关系型数据的时候,就需要用到SQLite数据库。

函数与相关类介绍

SQLiteOpenHelper

         SQLiteOpenHelper是一个抽象类,里面含有两个抽象方法onCreateonUpgrade,他们实现数据库的创建和升级!
         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)

参考链接:
1
2
3

查看创建的数据库表

首先配置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数据库的增删改查!

依赖教材代码,从中找出漏洞,提高自己的思维!

欢迎加入程序员技术交流群一起成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值