实验六、contentprovider实验+SQLite数据库的实现-程序员宅基地

技术标签: sqlite  android  数据库  Android  

实验六、contentprovider实验+SQLite数据库的实现

【实验名称】实验六、contentprovider实验+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数据库的使用原理和方式

(请完成如下部分)
【实验设计】

1、设置Activity,通过按钮设置监听,而通过正确的uri来调用自定义的 ContentProvider: 匹配合适的uri之后,通过getContentResolver()去操作数据库。
public class MainContentProvider extends AppCompatActivity {
    
    TextView text;
    EditText username;
    EditText phone;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_content_provider);
        text = findViewById(R.id.ContactTV);
        username = findViewById(R.id.username);
        phone = findViewById(R.id.phone);

    }

    public void queryClick(View view){
    
        text.setText("");
        String id = username.getText().toString();
        Uri uri = Uri.parse("content://com.example.ContentProvider.provider/user/" + id);
        Cursor cursor = getContentResolver().query(uri,null,null,null,null);
        excuteCursor(cursor);
    }
    public void queryAll(View view){
    
//        text.setText("");
        Uri uri = Uri.parse("content://com.example.ContentProvider.provider/user" );
        Cursor cursor = getContentResolver().query(uri,null,null,null,null,null);
        excuteCursor(cursor);


    }
    public void insertClick(View view){
    
         String name = username.getText().toString();
        String phone1 = phone.getText().toString();
        Uri uri = Uri.parse("content://com.example.ContentProvider.provider/user");
        ContentValues values = new ContentValues();
        values.put("username",name);
        values.put("phone",phone1);
         getContentResolver().insert(uri, values);
        Toast.makeText(this,"已插入",Toast.LENGTH_SHORT).show();
            username.setText("");
            phone.setText("");

    }
    public void deleteClick(View view){
    
        String name = username.getText().toString();
        Uri uri = Uri.parse("content://com.example.ContentProvider.provider/user");
            getContentResolver().delete(uri,"username=?",new String[]{
    name});
        Toast.makeText(this,"已删除",Toast.LENGTH_SHORT).show();
    }
    public void updateClick(View view){
    
        String name = username.getText().toString();
        String pho = phone.getText().toString();
        Uri uri = Uri.parse("content://com.example.ContentProvider.provider/user");
        ContentValues values = new ContentValues();
        values.put("username",name);
        values.put("phone",pho);
        getContentResolver().update(uri,values,"username=?",new String[]{
    name});
        Toast.makeText(this,"已修改",Toast.LENGTH_SHORT).show();


    }

    @SuppressLint("SetTextI18n")
    private void excuteCursor(Cursor cursor) {
    
        if(cursor!=null){
    
            text.setText("");
            while (cursor.moveToNext()){
    
                int uid = cursor.getInt(0);
                String username = cursor.getString(1);
                String password = cursor.getString(2);
                text.append("联系人ID:"+uid+"\n联系人姓名:"+username+" " +
                        "   联系人电话:"+password+"\n");
                System.out.println("联系人ID:"+uid+"\n联系人姓名:"+username+" " +
                        "   联系人电话:"+password+"\n");
            }


        }
//        cursor.close();
    }
}


2、MyProvider : 
(1)自定义ContentProvider,根据Activity传来的uri进行匹配,匹配到符合的则开始 SQLiteDatabase 来将一些操作数据库的方法接口对Activity进行暴露(提供给Activity),使得Activity可通过 contentresolver 可对数据库进行操作。
(2) 还需要在AndroidManifest.xml中注册 contentprovider:
<provider
    android:authorities="com.example.ContentProvider.provider"
    android:name="com.example.ContentProvider.MyProvider"
    android:exported="true" >
</provider>

(3)MyProvider :

①声明 contentprovider 的authorities (主机名)及uri(资源标识符)
public class MyProvider extends ContentProvider {
    

    MySQLite mySQLite;
    SQLiteDatabase db;
    public static final int USER_DIR = 0;
    public static final int USER_ITEM = 1;
    public static final String authority ="com.example.ContentProvider.provider";
    public static UriMatcher uriMatcher;
        static {
    
      uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); // 默认不匹配uri
      uriMatcher.addURI(authority,"user",USER_DIR); //为0 为 com.example.ContentProvider.provider/user :对整张表操作
      uriMatcher.addURI(authority,"user/#",USER_ITEM); // 为1 则为  com.example.ContentProvider.provider/user/1, user此表的第一行

        }
    //
    @Override
    public boolean onCreate() {
    
        mySQLite = new MySQLite(getContext(),"userphone.db",null,1);
        // 构造数据库(获取上下文、数据库文件名称,不用工厂,版本为1)
        db = mySQLite.getWritableDatabase();  // 创建可写数据库

        return true;
    }
    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
    
        // 查询 , 匹配uri
        Cursor cursor = null;
        switch (uriMatcher.match(uri)){
    
            case USER_DIR:
                cursor = db.query("user",projection,selection,selectionArgs,null,null,null);
                break;
            case USER_ITEM:
                String queryid = uri.getPathSegments().get(1);
                 cursor = db.query("user", projection, "uid=?", new String[]{
    queryid}, null, null, null);
                break;
        }
        return cursor;
    }
    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
    
        switch (uriMatcher.match(uri)){
    
            case USER_DIR:
                return "vnd.android.cursor.dir/vnd";
            case USER_ITEM:
                return "vnd.android.cursor.item/vnd.cn.edu.cdut.provider.user";
        }
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
    
        switch (uriMatcher.match(uri)){
    
            case USER_DIR:

            case USER_ITEM:
                long l = db.insert("user", null, values);
                System.out.println("=================="+l);
                break;
            default:
                break;
        }

        return null;
    }
    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
    
       int delete = 0;
        switch (uriMatcher.match(uri)){
    
            case USER_DIR:
                delete = db.delete("user", selection, selectionArgs);
                break;
            case USER_ITEM:
                String queryid = uri.getPathSegments().get(1);
               delete = db.delete("user","uid =?",new String[]{
    queryid});
                break;
            default:
                break;
        }
        return delete;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
    
        int update = 0;
        switch (uriMatcher.match(uri)){
    
            case USER_DIR:
                update = db.update("user", values,selection, selectionArgs);
                break;
            case USER_ITEM:
                String queryid = uri.getPathSegments().get(1);
                update = db.update("user",values,"uid=?",new String[]{
    queryid});
                break;
            default:
                break;
        }
     return update;
    }
}

3、 MySQLite :进行数据库表的创建

public class MySQLite extends SQLiteOpenHelper {
    
    public MySQLite(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
    
        super(context, name, factory, version);
    }

    @Override
    public void onConfigure(SQLiteDatabase db) {
    
        super.onConfigure(db);
        db.disableWriteAheadLogging();

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    
        String sql = "CREATE TABLE user( uid integer primary key autoincrement," +
                "username text not null," +
                "phone text not null)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    

    }
}

【实验结果】
1、初始界面:
在这里插入图片描述

2、添加用户:

在这里插入图片描述

3、点击查询所有:
在这里插入图片描述

4、根据id查询用户:
在这里插入图片描述

5、删除用户:
在这里插入图片描述

删除成功:
在这里插入图片描述

6、修改ID为7的用户:
在这里插入图片描述

修改结果:

在这里插入图片描述

【实验分析或心得】
掌握了如何在Android 开发中使用 SQLite 数据库,熟悉设计数据库表结构的方法与步骤并且理解contentprovider的使用方法及流程,理解了ContentProvider、Resolver、Uri、Urimatcher等的原理。。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45888242/article/details/121184464

智能推荐

240320俄罗斯方块java,JAVA游戏编程之三----j2me 手机游戏入门开发--俄罗斯方块_2-程序员宅基地

文章浏览阅读202次。packagecode;//importjava.awt.*;//importjava.awt.Canvas;//importjava.awt.event.*;//importjavax.swing.*;importjava.util.Random;importjavax.microedition.lcdui.*;//写界面所需要的包/***//***俄罗斯方块*高雷*2007年1..._240×320java游戏

在线电影院售票平台(源码+开题报告)-程序员宅基地

文章浏览阅读779次,点赞14次,收藏19次。然后,实现系统的数据管理和服务功能,包括用户的注册与登录、电影的分类与展示、电影信息的查询与推荐、座位的选择与预订、在线支付与电子票生成等。此外,随着在线视频平台的兴起,越来越多的人选择在线观看电影,这对传统电影院产生了巨大的冲击。研究意义: 开发在线电影院售票平台对于提升用户的观影体验、优化电影院的运营效率、促进电影产业的发展具有重要的意义。该系统旨在通过技术手段解决传统电影院售票中的问题,提供一个集成化的电影信息展示、座位选择、在线支付和用户评价平台,同时也为电影院和电影制作方提供有效的工具。

程序员熬夜写代码,用C/C++打造一个安全的即时聊天系统!_基于c++的即时聊天系统设计-程序员宅基地

文章浏览阅读509次。保护我们剩下的人的通话信息安全,使用TOX可以让你在和家人,朋友,爱人交流时保护你的隐私不受政府无孔不入的的偷窥.关于TOX:其他牛逼的软件因为一些细化服务问你要钱的时候, TOX分文不取 . 你用了TOX, 想干嘛就干嘛.网友评论:项目源码展示:源码测试效果:最后,如果你学C/C++编程有什么不懂的,可以来问问我哦,或许我能够..._基于c++的即时聊天系统设计

linux Java服务swap分区被占用内存泄露问题故障及解决方法_linux swap占用很高-程序员宅基地

文章浏览阅读584次。鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)当Java服务在Linux系统中运行时,可能会出现swap分区被占用的内存泄露问题,导致系统性能下降或者崩溃。下面是该问题的故障及解决方法、底层结构、架构图、工作原理、使用场景详解和实际应用方式、原理详细描述、相关命令使用示例以及文献材料链接。_linux swap占用很高

word中利用宏替换标点标点全角与半角-程序员宅基地

文章浏览阅读662次。Alt+F11,然后插入-模块:复制下面代码到编辑窗口:Sub 半角标点符号转换为全角标点符号()'中英互译文档中将中文段落中的英文标点符号替换为中文标点符号 Dim i As Paragraph, ChineseInterpunction() As Variant, EnglishInterpunction() As Variant Dim MyRange..._替换半角宏

Android WebView使用总结_android webview真正加载完成-程序员宅基地

文章浏览阅读2.8k次。#.简介: WebView是Android提供的用来展示展示web页面的View,内部使用webkit浏览器引擎(一个轻量级的浏览器引擎),除了展示Web页面外,还可与Web页面内的JS脚本交互调用。WebView内部的WebSetting对象负责管理WebView的参数配置; WebViewClient负责处理WebView的各种请求和通知事件,在对应事件发生时会执行WebViewClient的对应回调; ChromeWebviewClient辅助Webview处理与JS一些交互......_android webview真正加载完成

随便推点

bitcoin 调试环境搭建-程序员宅基地

文章浏览阅读1.6k次。_bitcoin 调试环境搭建

曲线生成 | 图解B样条曲线生成原理(基本概念与节点生成算法)-程序员宅基地

文章浏览阅读4.3k次,点赞93次,收藏94次。为了解决贝塞尔曲线无法局部修正、控制性减弱、曲线次数过高、不易拼接的缺陷,引入B样条曲线(B-Spline)。本文介绍B样条曲线的基本概念:节点向量、支撑性、次数阶数、加权性质、节点生成算法等,为后续曲线计算打下基础。_样条曲线生成

CDH安装宝典之ClouderaManager_/opt/cloudera/cm-agent/service/mgmt/mgmt.sh: line -程序员宅基地

文章浏览阅读902次。配置本地repo库下载我的阿里云盘文件文件放置#创建目录mkdir -p /opt/cloudera/parcel-repo/mkdir -p /opt/cloudera/cm/yum install createrepoCDH 6.2.0 的三个文件放到/opt/cloudera/parcel-repo/中,并且注意把sha256后缀的文件名修改为sha#执行createrepo命令生成rpm元数据 最终/opt/cloudera/parcel-repo/会多一个repodata目录_/opt/cloudera/cm-agent/service/mgmt/mgmt.sh: line 76: /usr/java/jdk1.8.0_181

uni.canvasToTempFilePath在app正常,微信小程序报错: fail canvas is empty-程序员宅基地

文章浏览阅读943次,点赞2次,收藏2次。uni.canvasToTempFilePath_uni.canvastotempfilepath

SDRAM笔记_sdram 干扰-程序员宅基地

文章浏览阅读3.1k次。SRAM :静态RAM,不用刷新,速度可以非常快,像CPU内部的cache,都是静态RAM,缺点是一个内存单元需要的晶体管数量多,因而价格昂贵,容量不大。DRAM:动态RAM,需要刷新,容量大。SDRAM:同步动态RAM,需要刷新,速度较快,容量大。DDR SDRAM:双通道同步动态RAM,需要刷新,速度快,容量大。........................_sdram 干扰

Excel转SQL语句_excel数据怎么生成sql语句-程序员宅基地

文章浏览阅读7.3k次。假设表格有A、B、C、D四列数据,希望导入到你的数据库中表格table,对应的字段分别是col1、col2、col3、col4。_excel数据怎么生成sql语句

推荐文章

热门文章

相关标签