Android实验:contentprovider 实验+SQLite 数据库的实现

目录

  • SQLite
  • 实验目的
  • 实验内容
  • 实验要求
  • 项目结构
  • 代码实现
  • 结果展示

SQLite

SQLite 是一个开源的嵌入式关系数据库,实现了自给自足的、无服务器的、配置无需的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库系统不同,比如 MySQL、PostgreSQL 等,SQLite 不需要在系统中设置和管理一个单独的服务。这也使得 SQLite 是一种非常轻量级的数据库解决方案,非常适合小型项目、嵌入式数据库或者测试环境中

SQLite 的一些主要特性包括:

无服务器的:SQLite 不是一个单独的服务进程,而是直接嵌入到应用程序中。它直接读取和写入磁盘文件
事务性的:SQLite 支持 ACID(原子性、一致性、隔离性、持久性)属性,能够确保所有事务都是安全、一致的,即使在系统崩溃或者电力中断的情况下
零配置的:SQLite 不需要任何配置或者管理,这使得它非常容易安装和使用
自包含的:SQLite 是一个自包含系统,这意味着它几乎不依赖其他任何外部系统或者库,这使得 SQLite 的跨平台移植非常方便
小型的:SQLite 非常小巧轻量,全功能的 SQLite 数据库引擎的大小只有几百KB
广泛应用:SQLite 被广泛应用在各种各样的产品和系统中,包括手机、平板电脑、嵌入式系统、物联网设备等。它也被广泛用于网站开发、科学研究、数据分析等领域
在一些轻量级的应用场景下,SQLite 是一个非常理想的选择,因为它简单、高效、易于使用和部署。然而,对于需要处理大量并发写操作或者需要更高级的功能(如用户管理或者存储过程等)的应用场景,更全功能的数据库系统(如 PostgreSQL 或 MySQL)可能会是更好的选择
当然了,这里只是见到那的提一下关于SQLite的内容,想深入了解可以自行查阅资料

实验目的

1、 掌握如何在 Android 开发中使用 SQLite 数据库
2、 熟悉设计数据库表结构的方法与步骤
3、 理解 contentprovider 的使用方法及流程,理解 ContentProvider、
Resolver、Uri、Urimatcher 等的原理。

实验内容

1、实现 contentprovider 和 contentresolver 通过 uri 的调用;
2、实现 contentprovider 对数据库 sqlite 的功能:增、删、改、查;
3、数据库的表结构自行设计;

实验要求

1、配置 SQLite 数据库的运行环境
2、熟悉 contentprovider 对数据库 sqlite 增、删、改、查的具体操作和流程
3、充分理解 SQLite 数据库的使用原理和方式

项目结构

在这里插入图片描述

代码实现

ContentProvider

import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;public class ContentProvider extends android.content.ContentProvider {private Context mContext;DBHelper mDbHelper = null;SQLiteDatabase db = null;@Overridepublic boolean onCreate() {mContext = getContext();mDbHelper = new DBHelper(getContext());db = mDbHelper.getWritableDatabase();db.execSQL("delete from user");db.execSQL("insert into user values(1,'丁真');");db.execSQL("insert into user values(2,'孙笑川');");return true;}@Overridepublic Uri insert(Uri uri, ContentValues values) {String table = DBHelper.USER_TABLE_NAME;db.insert(table, null, values);mContext.getContentResolver().notifyChange(uri, null);return uri;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder){String table = DBHelper.USER_TABLE_NAME;return db.query(table, projection, selection, selectionArgs, null, null, sortOrder, null);}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {String table = DBHelper.USER_TABLE_NAME;return db.update(table, values, selection, selectionArgs);}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {String table = DBHelper.USER_TABLE_NAME;return db.delete(table, selection, selectionArgs);}@Overridepublic String getType(Uri uri) {return null;}
}

DBHelper

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;import androidx.annotation.Nullable;public class DBHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "Student";// 表名public static final String USER_TABLE_NAME = "user";private static final int DATABASE_VERSION = 1;//数据库版本号public DBHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE IF NOT EXISTS " + USER_TABLE_NAME + "(_id INTEGER PRIMARY KEY AUTOINCREMENT," + " name TEXT)");}@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}
}

myActivty

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;import com.example.exp61.R;import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class myActivity extends Activity {// 设置URIprivate Uri uri = Uri.parse("content://com.example.exp61.ui.theme.ContentProvider/user");ContentResolver resolver;Button bt_add, bt_delete, bt_querry, bt_update;ListView listView;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.myactivity);bt_add = findViewById(R.id.b_add);bt_delete = findViewById(R.id.b_delete);bt_querry = findViewById(R.id.b_querry);bt_update = findViewById(R.id.b_update);listView = findViewById(R.id.list_view);bt_add.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {ContentValues values = new ContentValues();values.put("_id",4);values.put("name", "luyunchi");resolver = getContentResolver();resolver.insert(uri, values);Toast.makeText(myActivity.this, "添加成功", Toast.LENGTH_SHORT).show();}});bt_querry.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {List<String> data = new ArrayList<String>();resolver = getContentResolver();Cursor cursor = resolver.query(uri, new String[]{"_id","name"}, null, null, null);while (cursor.moveToNext()){data.add(cursor.getInt(0) + " " + cursor.getString(1));}ArrayAdapter<String> adapter=new ArrayAdapter<>(myActivity.this,android.R.layout.simple_list_item_1,data);listView.setAdapter(adapter);cursor.close();Toast.makeText(myActivity.this, "查询完成", Toast.LENGTH_SHORT).show();}});bt_delete.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {resolver = getContentResolver();String selection = "_id = ?";String [] Arg = new String[]{"2"};int rowsAffected = resolver.delete(uri, selection, Arg);if (rowsAffected > 0) {Toast.makeText(myActivity.this, "删除成功", Toast.LENGTH_SHORT).show();} else {Toast.makeText(myActivity.this, "删除失败", Toast.LENGTH_SHORT).show();}}});bt_update.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {ContentValues values = new ContentValues();values.put("_id", 10);String selection = "_id = ?";String [] Arg = new String[]{"1"};resolver = getContentResolver();int rowsAffected = resolver.update(uri, values, selection, Arg);if (rowsAffected > 0) {Toast.makeText(myActivity.this, "更新成功", Toast.LENGTH_SHORT).show();} else {Toast.makeText(myActivity.this, "更新失败", Toast.LENGTH_SHORT).show();}}});}
}

myactivity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/list_view"android:layout_width="match_parent"android:layout_height="455dp" /><Buttonandroid:id="@+id/b_add"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="添加" /><Buttonandroid:id="@+id/b_delete"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="删除" /><Buttonandroid:id="@+id/b_update"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="更新" /><Buttonandroid:id="@+id/b_querry"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="查询" /></LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Exp61"tools:targetApi="31"><activityandroid:name=".ui.theme.myActivity"android:exported="true"android:label="@string/app_name"android:theme="@style/Theme.Exp61"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><providerandroid:name=".ui.theme.ContentProvider"android:authorities="com.example.exp61.ui.theme.ContentProvider"android:exported="true"/></application></manifest>

结果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上。

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

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

相关文章

安全生产知识竞赛活动方案

为进一步普及安全生产法律法规知识&#xff0c;增强安全意识&#xff0c;提高安全技能&#xff0c;经研究&#xff0c;决定举办以“加强安全法治、保障安全生产”为主题的新修订《安全生产法》知识竞赛活动&#xff0c;现将有关事项通知如下&#xff1a; 一、活动时间&#xf…

【教学类-43-03】20231229 N宫格数独3.0(n=1、2、3、4、6、8、9) (ChatGPT AI对话大师生成 回溯算法)

作品展示&#xff1a; 背景需求&#xff1a; 大4班20号说&#xff1a;我不会做这种&#xff08;九宫格&#xff09;&#xff0c;我做的是小格子的&#xff0c; 他把手工纸翻过来&#xff0c;在反面自己画了矩阵格子。向我展示&#xff1a;“我会做这种&#xff01;” 原来他会…

分类预测 | Matlab实现SCSO-SVM基于沙猫群优化算法优化支持向量机的多变量分类预测【23年新算法】

分类预测 | Matlab实现SCSO-SVM基于沙猫群优化算法优化支持向量机的多变量分类预测【23年新算法】 目录 分类预测 | Matlab实现SCSO-SVM基于沙猫群优化算法优化支持向量机的多变量分类预测【23年新算法】分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SCSO-…

2023十大编程语言及未来展望

2023十大编程语言及未来展望 1. 2023年十大编程语言排行榜2. 十大编程语言未来展望PythonCCJavaC#JavaScriptPHPVisual BasicSQLAssembly language 1. 2023年十大编程语言排行榜 TIOBE排行榜是根据互联网上有经验的程序员、课程和第三方厂商的数量&#xff0c;并使用搜索引擎&a…

Peter算法小课堂—浮点数危机

大家先想想下面这个代码运行结果&#xff1a; #include <bits/stdc.h> using namespace std; int main(){double x5.2;double y4.11.1;cout<<(x<y)<<endl;cout<<x-y<<endl;return 0; } 最终发现&#xff0c; &#xff1f;&#xff1f;&…

css 用多个阴影做出光斑投影的效果 box-shadow

css 用多个阴影做出光斑投影的效果 box-shadow 你首先需要知道的一点是 box-shadow 可以接收多个值&#xff0c;也就是可以设置多个阴影&#xff0c;这样就可以做一个类似光斑投影的效果。 一、效果 二、代码 里面用到了我一些 scss 工具方法&#xff0c;不过不影响&#xf…

【音视频 ffmpeg 学习】 RTMP推流 mp4文件

1.RTMP(实时消息传输协议)是Adobe 公司开发的一个基于TCP的应用层协议。 2.RTMP协议中基本的数据单元称为消息&#xff08;Message&#xff09;。 3.当RTMP协议在互联网中传输数据的时候&#xff0c;消息会被拆分成更小的单元&#xff0c;称为消息块&#xff08;Chunk&#xff…

二叉树的中序遍历,力扣

目录 题目地址&#xff1a; 题目&#xff1a; 解题方法&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 注&#xff1a; 代码实现&#xff08;递归&#xff09;&#xff1a; 代码实现&#xff08;迭代&#xff09;&#xff1a; 题目地址&#xf…

【目标检测】yolov8结构及代码分析

yolov8代码:https://github.com/ultralytics/ultralytics yolov8的整体结构如下图&#xff08;来自mmyolo&#xff09;&#xff1a; yolov8的配置文件&#xff1a; # Ultralytics YOLO &#x1f680;, AGPL-3.0 license # YOLOv8 object detection model with P3-P5 outputs.…

跨境电商迎来综合竞争力比拼时代 五大趋势解读跨境2024

过去几年&#xff0c;跨境电商成为外贸出口增长的一大亮点&#xff0c;随着年底国务院办公厅《关于加快内外贸一体化发展的若干措施》的发布&#xff0c;跨境电商在促进经济发展、助力内外贸一体化发展方面的价值更加凸显。 这是跨境电商变化最快的时代&#xff0c;也是跨境电…

GrayLog日志平台的基本使用-ssh之Email报警

1、首先编辑并添加邮件配置到server.conf&#xff08;注意&#xff1a;是添加&#xff09; vim /etc/graylog/server/server.conf # Email transport transport_email_enabled true transport_email_hostname smtp.qq.com transport_email_port 465 transport_email_use_a…

Net6 Core webApi发布到IIS

Net6 Core Api发布到IIS不同于webapi&#xff0c;依赖框架不同&#xff0c;配置也移至项目内Program.cs 一、发布到指定文件夹和IIS&#xff0c;不过注意IIS应用程序池选择的是 “无托管代码“ 在IIS管理器中点击浏览&#xff0c;访问接口路径报500.19&#xff0c;原因是所依赖…

杰发科技AC7840——EEPROM初探

0.序 7840和7801的模拟EEPROM使用不太一样 1.现象 按照官方Demo&#xff0c;在这样的配置下&#xff0c;我们看到存储是这样的&#xff08;连续三个数字1 2 3&#xff09;。 使用串口工具的多帧发送功能 看不出多少规律 修改代码后 发现如下规律&#xff1a; 前四个字节是…

GBASE南大通用携手宇信科技打造“一表通”全链路解决方案

什么是“一表通”&#xff1f; “一表通”是国家金融监督管理总局为发挥统计监督效能、完善银行保险监管统计制度、推进监管数据标准化建设、打破数据壁垒&#xff0c;而制定的新型监管数据统计规范。相较于以往的报送接口&#xff0c;“一表通”提高了对报送时效性、校验准确…

stm32学习笔记:TIM-定时中断和外部时钟

定时器四部分讲解内容&#xff0c;本文是第一部分 ​​​​​TIM简介 基本定时器 时基单元&#xff1a;预分频器、计数器、自动重装载寄存器 预分频器之前&#xff0c;连接的就是基准计数时钟的输入&#xff0c;由于基本定时器只能选择内部时钟&#xff0c;所以可以认为这根…

【MySQL】数据库之存储过程(“SQL语句的脚本“)

目录 一、什么是存储过程&#xff1f; 二、存储过程的作用 三、如何创建、调用、查看、删除、修改存储过程 四、存储过程的参数&#xff08;输入参数&#xff0c;输出参数&#xff0c;输入输出参数&#xff09; 第一种&#xff1a;输入参数 第二种&#xff1a;输出参数 …

【数据结构】什么是二叉树?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;二叉树的定义 &#x1f4cc;二叉树的特点 &#x1f4cc;特殊二叉树 &#x1f4cc;二叉树的性质 &#x1f4cc;二叉树的存储结构 &#x1f4cc;二叉树…

链表精选题集

目录 1 链表翻转 题目链接&#xff1a; 解题&#xff1a; 试错版&#xff1a; 2 找中间节点 题目链接: 题解&#xff1a; 3 找倒数第k个节点 题目链接&#xff1a; 题解&#xff1a; 4 将两个升序链表合并为一个升序链表 题目链接&#xff1a; 题解&#xff1a; …

Spark SQL

目录 一、Spark SQL简介 &#xff08;一&#xff09;从Shark说起 &#xff08;二&#xff09;Spark SQL架构 &#xff08;三&#xff09;为什么推出Spark SQL 二、DataFrame概述 三、DataFrame的创建 四、DataFrame的保存 五、DataFrame的常用操作 六、从RDD转换得到D…

nodejs+vue+ElementUi农产品团购销售系统zto2c

目标是为了完成小区团购平台的设计和实现&#xff0c;在疫情当下的环境&#xff0c;方便小区业主购入生活所需&#xff0c;减小居民的生活压力 采用B/S模式架构系统&#xff0c;开发简单&#xff0c;只需要连接网络即可登录本系统&#xff0c;不需要安装任何客户端。开发工具采…