更新SQLite数据库数据

news2024/11/18 6:31:06

本文所有代码均存放于
https://github.com/MADMAX110/Starbuzz
之前了解了如何修改应用让它从SQLite数据库中提取数据,但是还没有用过更新过数据库数据。
这里要修改应用使用户能够记录哪些饮料是他们的最爱。为此要为DrinkActivity增加一个复选框;
如果选中这个复选框,就说明当前饮料是用户的一个最爱。
还要为TopLevelActivity增加一个新的列表视图,其中包含用户最喜欢的饮料。

一、更新DrinkActivity

在之前的数据库中已经为DRINK表增加了一个FAVORITE列,下面要让用这个列让用户指示某个饮料是否是他的一个最爱。我们会在一个新的复选框中显示这个值,用户单击这个复选框时要用这个新值更新FAVORITE列。

1、向DrinkActivity的布局增加一个复选框

先增加一个字符串资源

    <string name="favorite">Favorite</string>

在activity_drink.xml中增加一个复选框

    <CheckBox
        android:id = "@+id/favorite"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/favorite"
        android:onClick="onFavoriteClicked"/>

要使返回的数据包含FAVORITE列,只需要把FAVORITE列增加到游标返回的列名数组。

Cursor cursor = db.query("DRINK",
		new String[]{"NAME", "DESCRIPTION", "IMAGE_RESOURCE_ID", "FAVORITE"},
		"_id = ?",
		new String[] {Integer.toString(drinkId)},
		null, null, null);

有了FAVORITE这个列的值后,就可以相应的更新favorite复选框。要得到这个值,首先导航到游标的第一个(也是唯一一个记录)。

cursor.moveToFirst()

然后得到当前饮料的FAVORITE列的值。FAVORITE列包含数值0和1。
1就选中复选框,0就不选中复选框:

boolean isFavorite = (cursor.getInt(3) == 1);
                CheckBox favorite = (CheckBox) findViewById(R.id.favorite);
                favorite.setChecked(isFavorite);

响应单击事件来更新数据库。

2、完整的DrinlkActivity代码

package com.hfad.starbuzz;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class DrinkActivity extends AppCompatActivity {

    public static final String EXTRA_DRINKID = "drinkId";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drink);

        int drinkId = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);

        SQLiteOpenHelper starbuzzDatabaseHelper = new StarbuzzDatabaseHelper(this);
        try {
            SQLiteDatabase db = starbuzzDatabaseHelper.getReadableDatabase();
            Cursor cursor = db.query("DRINK",
                    new String[]{"NAME", "DESCRIPTION", "IMAGE_RESOURCE_ID", "FAVORITE"},
                    "_id = ?",
                    new String[] {Integer.toString(drinkId)},
                    null, null, null);
            if (cursor.moveToFirst()) {
                String nameText = cursor.getString(0);
                String descriptionText = cursor.getString(1);
                int photoId = cursor.getInt(2);
                boolean isFavorite = (cursor.getInt(3) == 1);

                TextView name = (TextView) findViewById(R.id.name);
                name.setText(nameText);

                TextView description = (TextView) findViewById(R.id.description);
                description.setText(descriptionText);

                ImageView photo = (ImageView) findViewById(R.id.photo);
                photo.setImageResource(photoId);
                photo.setContentDescription(nameText);

                CheckBox favorite = (CheckBox) findViewById(R.id.favorite);
                favorite.setChecked(isFavorite);
            }
            cursor.close();
            db.close();
        }catch (SQLException e){
            Toast toast = Toast.makeText(this,
                    "Database unavailable",
                    Toast.LENGTH_SHORT);
            toast.show();
        }
    }

    public void onFavoriteClicked(View view){
        int drinkId = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);

        CheckBox favorite = (CheckBox) findViewById(R.id.favorite);
        ContentValues drinkValues = new ContentValues();
        drinkValues.put("FAVORITE", favorite.isChecked());

        SQLiteOpenHelper starbuzzDatabaseHelper = new StarbuzzDatabaseHelper(this);
        try{
            SQLiteDatabase db = starbuzzDatabaseHelper.getWritableDatabase();
            db.update("DRINK",
                    drinkValues,
                    "_id = ?",
                    new String[] {Integer.toString(drinkId)});
            db.close();
        }catch(SQLiteException e) {
            Toast toast = Toast.makeText(this, "Database unavailable", Toast.LENGTH_SHORT);
            toast.show();
        }
    }

}

在这里插入图片描述

二、在TopLevelActivity中显示用户的最爱

1、为TopLevelActivity的布局增加一个列表视图和一个文本视图
2、填充列表视图,并让它响应单击事件
3、选择一个新的最爱饮料时刷新列表视图数据

1、更新activity_top_level.xml

先增加字符串

  <string name="favorites">Your favorite drinks:</string>

再在activity_top_level.xml中增加一个列表视图和文本视图

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="@string/favorites" />

    <ListView
        android:id="@+id/list_favorites"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

2、更新TopLevelActivity

package com.hfad.starbuzz;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class TopLevelActivity extends AppCompatActivity {

    private SQLiteDatabase db;
    private Cursor favoritesCursor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_top_level);
        setupOptionsListView();
        setupFavoritesListView();
    }

    private void setupOptionsListView() {
        //创建监听器
        AdapterView.OnItemClickListener itemClickListener =
                new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        //Drink是列表视图中的第一项,所以位于位置0
                        if (position == 0) {
                            //这个意图来自TopLevelActivity,需要启动DrinkCategoryActivity
                            Intent intent = new Intent(TopLevelActivity.this, DrinkCategoryActivity.class);
                            startActivity(intent);
                        }
                    }
                };
        //为列表视图增加监听器
        ListView listView = (ListView) findViewById(R.id.list_options);
        listView.setOnItemClickListener(itemClickListener);
    }

    private void setupFavoritesListView() {
        ListView listFavorites = (ListView) findViewById(R.id.list_favorites);
        try{
            SQLiteOpenHelper starbuzzDatabaseHelper = new StarbuzzDatabaseHelper(this);
            db = starbuzzDatabaseHelper.getReadableDatabase();
            favoritesCursor = db.query("DRINK",
                    new String[]{"_id", "NAME"},
                    "FAVORITE = 1",
                    null, null, null, null);
            CursorAdapter favoriteAdapter = new SimpleCursorAdapter(TopLevelActivity.this,
                    android.R.layout.simple_list_item_1,
                    favoritesCursor,
                    new String[]{"NAME"},
                    new int[]{android.R.id.text1}, 0);
            listFavorites.setAdapter(favoriteAdapter);
        }catch (SQLiteException e){
            Toast.makeText(this, "Database unavailable", Toast.LENGTH_SHORT).show();
        }

        listFavorites.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long id) {
                Intent intent = new Intent(TopLevelActivity.this, DrinkActivity.class);
                intent.putExtra(DrinkActivity.EXTRA_DRINKID, (int)id);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        favoritesCursor.close();
        db.close();
    }
}

在这里插入图片描述

3、游标不会自动刷新

如果用户导航到DrinkActivity来选择一个新的最爱饮料。这个新的最爱饮料不会自动显示在TopLevelActivity的list_favorites列表视图中。这是因为游标只在创建时获取数据
需要使用changeCursor方法改变游标
向DrinkActivity中添加onRestart即可:

    @Override
    protected void onRestart() {
        super.onRestart();
        Cursor newCursor = db.query("DRINK",
                new String[]{"_id", "NAME"},
                "FAVORITE = 1",
                null, null, null, null);
        ListView listFavorites = (ListView) findViewById(R.id.list_favorites);
        CursorAdapter adapter = (CursorAdapter) listFavorites.getAdapter();
        adapter.changeCursor(newCursor);
        favoritesCursor = newCursor;
    }

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

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

相关文章

iPhone苹果手机闹钟智能跳过节假日怎么设置?

国内绝大多数的手机用户使用的操作系统只有三个&#xff0c;安卓、鸿蒙和苹果的ios。而iPhone苹果手机的忠实用户是非常多的&#xff0c;所以日积月累中用户数量也就非常庞大&#xff0c;并且相当一部分用户都是上班族。而工作忙碌的上班族因为事情比较多&#xff0c;为了避免自…

前端笔试题总结,带答案和解析(持续更新,上次更新23/10/5,目前有30题)

前端笔试题总结&#xff0c;带答案和解析&#xff08;持续更新&#xff0c;上次更新23/10/5&#xff0c;目前有30题&#xff09; 这个系列将持续更新前端笔试题一期十题&#xff0c;每五题做一个标题&#xff08;方便跳转&#xff09;&#xff0c;您可以一期一期阅读&#xff0…

SAP BAPI2017_GOODSMVT_CREATE 不支持 货物移动失败

SAP BAPI2017_GOODSMVT_CREATE 不支持 货物移动失败 可能的原因两种&#xff1a; 1.移动类型允许的事务代码不全 2.BAPI传值的移动类型有问题

Laya3.0 如何快速调试

点击play箭头 点击右边的开发者工具 就会弹出 chrome的调试窗口 然后定位到你自己的ts文件 直接在ts里断点即可 不需要js文件 如何自动生成代码&#xff1f; 比如你打开一个新项目 里面显示的是当前场景 只需要点击 UI运行时 右边的框就可以了 他会自动弹窗提示你 创建一个文…

百元内挂耳式耳机哪款好、百元挂耳式耳机推荐

开放式耳机采用挂耳式设计&#xff0c;佩戴不需要堵住耳道&#xff0c;这种创新的设计不仅可以享受音乐&#xff0c;还保留了外界环境的听觉感知能力&#xff0c;让我们在户外运动、通勤或进行其他活动时更加安全&#xff0c;预算不多&#xff0c;百元价位范围内&#xff0c;我…

Spring:处理@Autowired和@Value注解的BeanPostProcessor

AutowiredAnnotationBeanPostProcessor,它实现了MergedBeanDefinitionPostProcessor,因此会调用postProcessMergedBeanDefinition方法。 它实现了InstantiationAwareBeanPostProcessor,因此在属性注入时会调用postProcessPropertyValues方法 如果Autowired注解按类型找到了大…

微信如何防止被限制?一文了解原因和处理方法

微信引流频繁被限制加好友&#xff0c;是许多人在营销过程中遇到的一大难题。为了解决这一问题&#xff0c;我们需要先了解微信官方对好友添加的限制和政策。只有明确了这些规定&#xff0c;才能更有效地进行微信引流&#xff0c;提高营销效果。 为什么被限制&#xff1f; 为了…

为什么企业都在申报“高新技术”?有以下十大好处!

随着信息技术时代的迅速发展&#xff0c;很多企业为了能够在同行中脱颖而出&#xff0c;都会选择办理一些和企业相关的资质证书&#xff0c;以便提升企业的核心竞争力&#xff0c;今天同邦信息科技的小编就告诉大家为什么那么多企业都选择申报“高新技术”企业&#xff1f; 首先…

智慧用电安全云监控系统

近年来&#xff0c;我国电气火灾频发&#xff0c;2017年至2019年&#xff0c;我国共之间发生发展电气控制火灾31.1万起&#xff0c;占全国进行火灾总量及伤亡风险损失的30&#xff05;以上&#xff0c;2019年全年共接报火灾23.3万起&#xff0c;电气火灾11.1万&#xff0c;占52…

Doris 2.0.1 DockerFile版 升级实战

1、Doris 2.0.1 DockerFile 的制作 参考 Doris 2.0.1 Dockerfile制作-CSDN博客 2、之前的Doris 集群通过 Docker容器进行的部署&#xff0c;需提前准备好Doris2.0.1的镜像包 参考&#xff1a; 集群升级 - Apache Doris Doris 升级请遵守不要跨两个及以上关键节点版本升级的…

数字化转型频频失败?一体化模式提供新的思考

数字化连续6年出现在政府报告中&#xff0c;从《中小企业数字化赋能专项行动方案》到《关于推进“上云用数赋智”行动》、《“十四五” 规划和 2035 年远景目标建议》、《中小企业数字化转型指南》&#xff0c;再到2023年2月《数字中国建设整体布局规划》&#xff0c;加快数字化…

新基建智慧铁路:高铁沿线综合视频监控及风险智能预警管理方案

一 、方案背景 铁路沿线安全环境直接关系铁路运输安全畅通。随着我国铁路特别是高速铁路运营里程不断增加&#xff0c;改善铁路沿线安全环境对保障铁路高质量发展和人民群众生命财产安全的作用更加突出。为了保障高铁的安全运营&#xff0c;高铁对安防尤其是视频监控的需求不断…

【转载】vscode配置numpy环境,实测有效

1.首先找到python.exe文件的位置 查看python.exe文件在哪的方法&#xff1a; 1、在vscode中执行下面的程序即可直接输出python.exe文件的路径 import sys sys.executable 输出结果如下&#xff1a; 2、新建终端 然后输入下列进行跳转 cd C:\Users\胡萝卜超爱兔子\AppData\Lo…

【EI会议征稿】第三届公共管理与大数据分析国际学术会议 (PMBDA 2023)

第三届公共管理与大数据分析国际学术会议 &#xff08;PMBDA 2023&#xff09; 2023 3rd International Conference on Public Management and Big Data Analysis 第三届公共管理与大数据分析国际学术会议 &#xff08;PMBDA 2023&#xff09;将于2023年12月15-17日在中国南京…

c#访问sql server数据库登录失败

以下配置适用于如下情况&#xff1a;已经能连接数据库的server&#xff0c;而且用户名、密码都对&#xff0c;但通过c#访问数据库时出错&#xff0c;提示login、管道相关的错误。通过一些配置&#xff0c;最终解决了该问题&#xff0c;遇到该问题的小伙伴也可以按照同样配置尝试…

如何将AI智能分析与视频监控平台EasyCVR相融合构建监狱安防体系

当前大多数监狱的视频监控系统安防设施普遍落后&#xff0c;存在设备无法正常会用、画面不清晰、网络故障等问题&#xff0c;加上传统人工巡检方式落后&#xff0c;人工需求量大、信息化程度较低&#xff0c;监狱监控系统亟需改革。 改革方案 1、视频监控系统 通过在监狱内部…

PyTorch - 大模型多卡训练 “CUDA error: an illegal memory access was encountered”

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/133640212 错误日志&#xff1a; # ...File "lib/python3.7/site-packages/pytorch_lightning/trainer/trainer.py", line 580, in fi…

来看看老旧物件这样与现代空间结合完美结合

室内设计最重要的是平衡&#xff0c;但要在家居装饰中达到这一完美境界却很困难&#xff0c;尤其是在现代家居中融入老旧物件的时候。 1. 将老旧物件作为装饰品 由于老旧风格的本质&#xff0c;它们在现代和当代潮流中彰显个性。采用简约的方式&#xff0c;通过简单的装饰和少…

Library <iconv2.4.0> not found 解决方法

1、升级到Xcode15之后&#xff0c;跑到C的库出现了这个问题。 2、于是去Xcode里面搜了一下&#xff0c;这个库已经搜不到了&#xff0c;但是项目里还是配置的&#xff0c;于是接下意识把它删掉了&#xff0c;就不报错了&#xff0c;顺手还把类似的这个库给加进去了 3、而且跑起…

自动化测试架构你都了解吗?

如果没有组织的智能测试功能&#xff0c; 随着系统复杂性的增加&#xff0c; 新开发的成本可能非常高。构建、部署、更新、创新等将会变得麻烦&#xff0c;因为现有的代码库需要更多的努力来验证。保持系统的可靠性和稳定性将获得对开发和创新的所有权。 现在需要做的是提高发…