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()**方法也会得到执行,所以通常会在这里去处理一些创建表的逻辑。

示例

步骤
  1. 实现SQLiteOpenHelper接口,重写其中的onCreate()onUpgrade()方法
    • 定义建表语句
    • onCreate()方法中使用参数调用execSQL()方法传入建表语句;【可以使用一个Toast显示创建成功】
  2. 在java文件中定义触发方式触发逻辑
    • 使主类继承点击接口;定义控件,获取控件,定义事件监听器
      • 别忘了在onCreate()方法中找到控件
      • 使用SQLiteDatabase定义数据库操作对象
      • 使用ContentValues定义数据组装以便后续传入数据库
      • 对象调用ContentValuesput()方法组装数据
      • 对象调用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();
        }
    }
}
相关推荐
HerayChen1 小时前
HbuildderX运行到手机或模拟器的Android App基座识别不到设备 mac
android·macos·智能手机
顾北川_野1 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
hairenjing11231 小时前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
小黄人软件1 小时前
android浏览器源码 可输入地址或关键词搜索 android studio 2024 可开发可改地址
android·ide·android studio
dj15402252032 小时前
group_concat配置影响程序出bug
android·bug
周全全2 小时前
MySQL报错解决:The user specified as a definer (‘root‘@‘%‘) does not exist
android·数据库·mysql
- 羊羊不超越 -3 小时前
App渠道来源追踪方案全面分析(iOS/Android/鸿蒙)
android·ios·harmonyos
wk灬丨3 小时前
Android Kotlin Flow 冷流 热流
android·kotlin·flow
千雅爸爸3 小时前
Android MVVM demo(使用DataBinding,LiveData,Fresco,RecyclerView,Room,ViewModel 完成)
android