Android开发之内访Sqlite数据库(六)

文章目录

  • 1. Android开发之外访Sqlite数据库
    • 1.1 Sqlite数据库的优点
    • 1.2 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 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.Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/create_database"android:text="Create database"/><android.widget.Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/add_data"android:text="Add data"/><android.widget.Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/update_data"android:text="Update data"/><android.widget.Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/delete_data"android:text="Delete data"/></LinearLayout>

MySqliteOpenHelper.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;}// 数据库创建时调用@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);Toast.makeText(mContext, "create succeed", Toast.LENGTH_SHORT).show();}// 数据库升级时使用@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

MainActivity.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;@Overrideprotected 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);}@Overridepublic 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();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/23379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python的优势有哪些?

python的优点很多&#xff0c;下面简单地列举一些&#xff1a; 简单 Python的语法非常优雅&#xff0c;甚至没有像其他语言的大括号&#xff0c;分号等特殊符号&#xff0c;代表了一种极简主义的设计思想。阅读Python程序像是在读英语。 易学 Python入手非常快&#xff0c;学习…

K8s:无状态

无状态服务 无状态服务是指服务的实例之间没有持久化状态&#xff0c;每个实例都是相同的&#xff0c;可以互换使用。 调度器 ReplicationController 简称 RC是 Kubernetes 早期版本中用来确保 Pod 副本始终运行的 API 对象。它通过监控 Pod 副本的数量&#xff0c;确保任何…

vue 常用的 UI 框架及表格

vue 3 常用的 UI 框架及表格 常用 UI 框架 Element PlusAnt Design VueiViewVxe UIVuetifyBootstrap VueMuse UI 专业表格 SpreadJSAG GridVxe Table

Linux——内存管理代码分析

虚空间管理 页框和页的关系 页框 将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个页框&#xff0c;也叫页帧&#xff0c;即物理页面&#xff0c;是linux划分内存空间的结果。 每个页框都有一个页框号&#xff0c;即内存块号、物理块号。 页 将用户…

深度学习之指数移动平均模型(EMA)介绍

指数移动平均模型&#xff08;Exponential Moving Average Model&#xff0c;EMA&#xff09;是一种用于平滑时间序列数据的技术。它通过对数据进行加权平均来减少噪音和波动&#xff0c;从而提取出数据的趋势。 在深度学习中&#xff0c;EMA 常常用于模型的参数更新和优化过程…

完整指南:远程管理 Linux 服务器的 Xshell6 和 Xftp6 使用方法(Xshell无法启动:要继续使用此程序........,的解决方法)

&#x1f600;前言 在当今软件开发领域&#xff0c;远程管理 Linux 服务器已成为日常工作的重要组成部分。随着团队成员分布在不同的地理位置&#xff0c;远程登录工具的使用变得至关重要&#xff0c;它们为开发人员提供了访问和管理服务器的便捷方式。本文将介绍两款功能强大的…

python随机显示四级词汇 修改版直接显示释义

python随机显示四级词汇 修改版直接显示释义 添加暂停 和继续(按下中建滚轮触发) 按下右键 退出程序 解决在暂停后 ,重新调用update_word 会明显发现每隔5秒更新一次单词的速率已经改变 速率改变的问题可能是由于暂停期间没有清除之前的定时器所导致的。为了确保重新调用updat…

Linux高级进阶-ssh配置

Ubuntu-system 允许使用root远程登陆 apt install ssh -y在/etc/ssh/sshd_config 文件修改PermitRootLogin yes systemctl restart ssh远程连接软件用户名为root

Ubuntu系统中Apache Web服务器的配置与实战

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Educational Codeforces Round 166(Div.2) A~D

A.Verify Password&#xff08;字符串&#xff09; 题意&#xff1a; Monocarp正在开发他的新网站&#xff0c;目前面临的挑战是如何让用户选择强密码。 Monocarp认为&#xff0c;强密码应满足以下条件&#xff1a; 密码只能由小写拉丁字母和数字组成&#xff1b;字母后面不…

PasteCode系列系统说明

定义 PasteCode系列是指项目是基于PasteTemplate构建的五层以上项目&#xff0c;包括不仅限于 Domain EntityFrameworkCore Application.Contracts Application HttpApi.Host 熟悉ABP vNext就很好理解了&#xff0c;因为PasteTemplate就是基于ABP的框架精简而来&#xff01;在…

一些Mysql面试题

InnoDB是如何存储数据的&#xff1f; InnoDB 的数据是按「数据页」为单位来读写的&#xff0c;默认数据页大小为 16 KB。每个数据页之间通过双向链表的形式组织起来&#xff0c;物理上不连续&#xff0c;但是逻辑上连续。 数据页内包含用户记录&#xff0c;每个记录之间用单向…

【java 如何将字符串反转?】

文章目录 概要示例&#xff08;1&#xff09;使用StringBuilder的reverse方法&#xff08;2&#xff09;使用charAt和循环&#xff08;3&#xff09;使用双指针&#xff08;4&#xff09;使用递归 总结 概要 在Java中&#xff0c;有多种方法可以将字符串反转&#xff0c;我这里…

代码随想录训练营第二天 977有序数组的平方 209长度最小的子数组 59螺旋矩阵II

第一题&#xff1a; 题目链接&#xff1a;977. 有序数组的平方 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 先将数组求完平方和后进行排序&#xff0c;很简单&#xff0c;主要是排序算法的考察。 这里采用快排 快排的思路&#xff1a; 取这个数组的中间值…

代码随想录算法训练营第四十六 | ● 139.单词拆分 ● 关于多重背包,你该了解这些! ● 背包问题总结篇!

139.单词拆分 视频讲解&#xff1a;https://www.bilibili.com/video/BV1pd4y147Rh https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<st…

java stream流之groupby的用法

简单分组 按照年龄对 Person 对象进行分组&#xff1a; 代码示例 import java.util.*; import java.util.stream.Collectors;public class SimpleGrouping {public static void main(String[] args) {List<Person> people Arrays.asList(new Person("Alice"…

上市即交付,比亚迪秦L DM-i万人交车暨千媒众测开营

6月6日&#xff0c;“引领中级 开创油耗2时代”秦L DM-i万人交车暨千媒众测开营仪式在比亚迪大本营深圳盛大举行。 众多车主代表亲临现场&#xff0c;与全国各地的比亚迪4S店千店联动&#xff0c;将秦L DM-i全国交付推向新的高潮。发布即量产&#xff0c;上市即交付&#xff0…

ESP32:FreeRTOS节拍配置(vTaskDelay延时10ms改为1ms)

文章目录 背景方法手动修改sdkconfig通过idf.py menuconfig 背景 在FreeRTOS的默认配置中&#xff0c;任务调度的频率默认是100HZ&#xff0c;因此默认vTaskDelay默认延时是10ms。 FreeRTOS 的系统时钟节拍可以在配置文件 FreeRTOSConfig.h 里面设置&#xff1a;#define confi…

【HarmonyOS】鸿蒙应用子模块module资源如何获取

【HarmonyOS】鸿蒙应用子模块module资源如何获取 一、问题背景&#xff1a; 在多模块项目工程中&#xff0c;单个模块的资源不会放在主模块中&#xff0c;所以我们需要在子模块中访问自己的资源。如果使用默认的资源获取api&#xff0c;会提示找不到资源。 那如何获取子模块下…

【AI基础】第四步:保姆喂饭级-langchain+chatglm2-6b+m3e-base

在第三步手动安装chatglm2-6b时&#xff0c;已经可以通过web进行交互。langchain重新封装了一下AI框架&#xff0c;提供更加友好的开发功能&#xff0c;类似于AI届的spring框架。langchain的安装过程也类似于上一步说的&#xff1a;【AI基础】第三步&#xff1a;纯天然手动安装…