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.hqwc.cn/news/309990.html

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

相关文章

第3课 获取并播放音频流

本课对应源文件下载链接&#xff1a; https://download.csdn.net/download/XiBuQiuChong/88680079 FFmpeg作为一套庞大的音视频处理开源工具&#xff0c;其源码有太多值得研究的地方。但对于大多数初学者而言&#xff0c;如何快速利用相关的API写出自己想要的东西才是迫切需要…

【unity学习笔记】捏人+眨眼效果+口型效果

一、vriod捏人 1.在vroidstudio软件中捏人 2.导出模型&#xff08;.vrm) 二、vrid导入unity的插件 1.在Git上搜索、打开univrm。 2.找到release页面找到合适的插件版本。&#xff08;VRM-0.116.0_0f6c&#xff09; 3.将univrm导入到工程中&#xff08;assets&#xff09;。 三…

Python爬虫中的代理IP设置与实战策略

在Python爬虫中&#xff0c;使用代理IP设置是一种常见的策略&#xff0c;主要用于以下几个目的&#xff1a; 1. 避免被目标网站封禁&#xff1a;频繁的请求可能会引起目标网站的注意&#xff0c;导致你的IP被封锁。通过使用代理IP&#xff0c;你可以模拟来自不同地点和设备的请…

深入浅出理解TensorFlow的padding填充算法

一、参考资料 notes_on_padding_2 二、TensorFlow的padding算法 本文以TensorFlow v2.14.0版本为例&#xff0c;介绍TensorFlow的padding算法。 1. 引言 tf.nn.conv2d and tf.nn.max_pool2d 函数都有padding参数&#xff0c;在执行函数之前&#xff0c;都需要进行填充padd…

Linux自己的应用商店yum

&#x1f4ab;Linux系统如何安装软件 在Linux系统中我们可以通过多种方式安装软件&#xff0c;常见方式有以下三种&#xff1a;   1.源代码安装   2.rpm包安装   3.使用yum软件包管理器安装   早期人们通过下载软件源代码&#xff0c;然后再经过交叉编译等一系列工作下…

ESP32:整合存储配网信息和MQTT笔记

文章目录 1.给LED和KEY的所用IO增加配置项1.1 增加配置文件1.2 修改相应的c源码 2. 把mqtt\tcp的工程整合到一起2.1 在何处调用 mqtt_app_start() 3. 测试MQTT4. 完整的工程源码 有一段时间没有玩ESP32&#xff0c;很多知识点都忘记了。今天测试一下MQTT&#xff0c;做个笔记。…

行车记录仪变清晰,变高清的办法一定要收藏

有时候我们会发现行车记录仪拍摄的视频不够清晰&#xff0c;特别是出现事故需要视频为证的时候&#xff0c;如果视频太模糊&#xff0c;很难获得交警的支持&#xff0c;那么如何让行车记录仪拍摄的视频变得更加清晰呢&#xff1f; 小编给大家分享几个办法&#xff0c;建议收藏…

SpringBoot 增量/瘦身部署jar 包

背景 SpringBoot 项目的部署一般采用全量jar 包方式部署相关项目&#xff0c;如果我们对相关的Contrller\Service\Dao\Mapper 层进行相关业务调整就需要重新编译全量jar 包&#xff08;包大小约为200M左右&#xff09;实在太麻烦了。 本文:重点讲解使用SpringBoot 的增量/瘦身…

Qt Creator可视化交互界面exe快速入门5

上一期介绍了加法计算器,本期介绍QObject定时器。 首先一样先建个工程,比如我这项目名为QObject 本期的任务就是制作图片在界面上显示,然后每秒定时切换,点击另一个暂停按钮,可以定格当前图片,即取消定时切换功能。 显示图片的我们可以使用显示里面的label 这个用于显示…

探索 3D 图形处理的奥秘

最近一年多来&#xff0c;在 3Dfx、Intel 们的狂轰滥炸中&#xff0c;在 Quake、古墓丽影们的推波助澜下&#xff0c;三维图形已经成为计算机迷眼中的又一个热点。3D 世界到底是怎样的神奇&#xff0c;我们又是怎样享受它的乐趣呢&#xff1f;就让我们来一探究竟吧。 图形基础…

【eclipse】eclipse开发springboot项目使用入门

下载eclipse Eclipse downloads - Select a mirror | The Eclipse Foundation 安装eclipse 其他一步一步即可 我们是开发java web选择如下 界面修改 Window->Preferences-> 修改eclipse风格主题 Window->Preferences->General->Appearance 修改字体和大小…

akka集群结构、节点发现机制

akka集群结构、节点发现机制 引导流程 • Akka 管理 Kubernetes API 集群发现机制 使用 Akka Cluster 的服务比无状态应用程序有额外的要求。为了形成集群&#xff0c;每个 Pod 需要知道哪些其他 Pod 已部署为该服务的一部分&#xff0c;以便它们可以相互连接。 Akka 提供了…