Android实验:contentprovider 实验+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

java 复制代码
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;
    @Override
    public 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;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        String table = DBHelper.USER_TABLE_NAME;
        db.insert(table, null, values);
        mContext.getContentResolver().notifyChange(uri, null);
        return uri;
    }

    @Override
    public 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);
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {
        String table = DBHelper.USER_TABLE_NAME;
        return db.update(table, values, selection, selectionArgs);
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        String table = DBHelper.USER_TABLE_NAME;
        return db.delete(table, selection, selectionArgs);
    }
    @Override
    public String getType(Uri uri) {
        return null;
    }
}

DBHelper

java 复制代码
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);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE IF NOT EXISTS " + USER_TABLE_NAME + "(_id INTEGER PRIMARY KEY AUTOINCREMENT," + " name TEXT)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    }
}

myActivty

java 复制代码
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 {
    // 设置URI
    private 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;
    @Override
    protected 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() {
            @Override
            public 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() {
            @Override
            public 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() {
            @Override
            public 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() {
            @Override
            public 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">

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="455dp" />

    <Button
        android:id="@+id/b_add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="添加" />

    <Button
        android:id="@+id/b_delete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="删除" />

    <Button
        android:id="@+id/b_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="更新" />

    <Button
        android: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">

    <application
        android: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">
        <activity
            android: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>
        <provider
            android:name=".ui.theme.ContentProvider"
            android:authorities="com.example.exp61.ui.theme.ContentProvider"
            android:exported="true"/>
    </application>

</manifest>

结果展示





以上。

相关推荐
尘浮生8 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
六月闻君22 分钟前
MySQL 报错:1137 - Can‘t reopen table
数据库·mysql
SelectDB技术团队30 分钟前
兼顾高性能与低成本,浅析 Apache Doris 异步物化视图原理及典型场景
大数据·数据库·数据仓库·数据分析·doris
闲暇部落43 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
inventecsh1 小时前
mongodb基础操作
数据库·mongodb
白云如幻1 小时前
SQL99版链接查询语法
数据库·sql·mysql
Lucky小小吴1 小时前
有关django、python版本、sqlite3版本冲突问题
python·django·sqlite
爱吃烤鸡翅的酸菜鱼1 小时前
MySQL初学之旅(4)表的设计
数据库·sql·mysql·database
The_Ticker2 小时前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
Elastic 中国社区官方博客2 小时前
Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索