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();
        }
    }
}
相关推荐
幻雨様1 小时前
UE5多人MOBA+GAS 45、制作冲刺技能
android·ue5
Jerry说前后端3 小时前
Android 数据可视化开发:从技术选型到性能优化
android·信息可视化·性能优化
Meteors.4 小时前
Android约束布局(ConstraintLayout)常用属性
android
alexhilton5 小时前
玩转Shader之学会如何变形画布
android·kotlin·android jetpack
whysqwhw9 小时前
安卓图片性能优化技巧
android
风往哪边走9 小时前
自定义底部筛选弹框
android
Yyyy48210 小时前
MyCAT基础概念
android
Android轮子哥10 小时前
尝试解决 Android 适配最后一公里
android
雨白11 小时前
OkHttp 源码解析:enqueue 非同步流程与 Dispatcher 调度
android
风往哪边走12 小时前
自定义仿日历组件弹框
android