Android中关于数据库SQLite的insert插入操作的理解

SQLite Insert 语句详解 SQLite 的INSERT语句是数据库操作中最常用的语句之一。它允许你向数据库表中添加新数据,无论是单行、多行还是通过查询结果。通过理解INSERT语句的各种用法和注意事项,你可以更有效地管理你的 SQLite 数据库。本文详细介绍了 SQLite 的INSERT语句,包括其基本语法、使用方法以及一些高级特性。希望这些信息能帮助你更好地使用 SQLite。 阅读详情

关于SQLite的插入操作insert方法的理解

函数原型为:

long android.database.sqlite.SQLiteDatabase.insert(String table, String nullColumnHack, ContentValues values)

参数如下:

参数意义
String table要插入数据的表的名称
String nullColumnHack当values参数为空或者里面没有内容的时候,我们insert是会失败的(底层数据库不允许插入一个空行),为了防止这种情况,我们要在这里指定一个列名,到时候如果发现将要插入的行为空行时,就会将你指定的这个列名的值设为null,然后再向数据库中插入。
ContentValues values一个ContentValues对象,类似一个map.通过键值对的形式存储值。

理解: String nullColumnHack的作用是指定表中的一个字段名(列名),由于底层数据库不允许插入一个空行,因此,当values为空时,就会将我们指定的列的值设为null.
如下代码:

insert into tableName()values(); //这是错误的,不能为空
insert into tableName (nullColumnHack)values(null); //这是正确的

其实在底层,各种insert方法最后都会去调用insertWithOnConflict方法,这里我们粘贴出该方法的部分实现:

[java] view plaincopy/** 
    * General method for inserting a row into the database. 
    * 
    * @param table the table to insert the row into 
    * @param nullColumnHack SQL doesn't allow inserting a completely empty row, 
    *            so if initialValues is empty this column will explicitly be 
    *            assigned a NULL value 
    * @param initialValues this map contains the initial column values for the 
    *            row. The keys should be the column names and the values the 
    *            column values 
    * @param conflictAlgorithm for insert conflict resolver 
    * @return the row ID of the newly inserted row 
    * OR the primary key of the existing row if the input param 'conflictAlgorithm' = 
    * {@link #CONFLICT_IGNORE} 
    * OR -1 if any error 
    */  
   public long insertWithOnConflict(String table, String nullColumnHack,  
           ContentValues initialValues, int conflictAlgorithm) {  
       if (!isOpen()) {  
           throw new IllegalStateException("database not open");  
       }  
  
       // Measurements show most sql lengths <= 152  
       StringBuilder sql = new StringBuilder(152);  
       sql.append("INSERT");  
       sql.append(CONFLICT_VALUES[conflictAlgorithm]);  
       sql.append(" INTO ");  
       sql.append(table);  
       // Measurements show most values lengths < 40  
       StringBuilder values = new StringBuilder(40);  
  
       Set<Map.Entry<String, Object>> entrySet = null;  
       if (initialValues != null && initialValues.size() > 0) {  
           entrySet = initialValues.valueSet();  
           Iterator<Map.Entry<String, Object>> entriesIter = entrySet.iterator();  
           sql.append('(');  
  
           boolean needSeparator = false;  
           while (entriesIter.hasNext()) {  
               if (needSeparator) {  
                   sql.append(", ");  
                   values.append(", ");  
               }  
               needSeparator = true;  
               Map.Entry<String, Object> entry = entriesIter.next();  
               sql.append(entry.getKey());  
               values.append('?');  
           }  
  
           sql.append(')');  
       } else {  
           sql.append("(" + nullColumnHack + ") ");  
           values.append("NULL");  
       }

这里我们可以看到,当我们的ContentValues类型的数据initialValues为null,或者size<=0时,就会在sql语句中添加nullColumnHack的设置。这里,如果我们不添加nullColumnHack的话,那么我们的sql语句最终的结果将会类似insert into tableName()values();这显然是不允许的。而如果我们添加上nullColumnHack,sql将会变成insert into tableName (nullColumnHack)values(null);这样是可以的。

最后:我们可以通过代码注释理解该方法的四个参数分别代表的意思和作用。
其中第四个参数解释:

    * @param conflictAlgorithm for insert conflict resolver 
    * @return the row ID of the newly inserted row 
    * OR the primary key of the existing row if the input param 'conflictAlgorithm' = 
    * {@link #CONFLICT_IGNORE} 

它表示如果插入操作有冲突,该如何处理,比如说新插入的数据的primary key与已有的一条数据primary key相同。

Android SQLite数据库开发实战:从SQLiteOpenHelper到DAO模式完整指南 数据持久化是移动应用开发的核心基础,它确保应用数据在会话间得以保存和复用。其实现原理通常依赖于本地数据库技术,通过在设备存储中创建结构化的数据文件来实现。在Android生态中,SQLite作为内嵌的轻量级关系型数据库,因其零配置、单文件管理和系统级集成而成为本地存储的首选方案。这一技术价值在于为应用提供了高效、可靠的结构化数据管理能力,无需网络依赖。其典型应用场景包括用户偏好设置、离线数据缓存、以及笔记、记账等工具类应用的数据存储。本文聚焦于Android Studio中SQLiteOpenHelper的 阅读详情

相关推荐

Godot Mono C# SQLite数据库读写与安卓兼容性实战指南

在游戏与应用开发中,数据持久化是核心需求,而SQLite作为一款轻量级、零配置的嵌入式关系型数据库,因其单文件、跨平台的特性,成为本地数据存储的理想选择。其工作原理基于将数据存储在单一磁盘文件中,并通过SQL引擎提供完整的ACID事务支持,无需独立的服务器进程。这一技术价值在于为开发者提供了高效、可靠且易于集成的结构化数据管理方案,尤其适用于需要离线存储、复杂查询和排序分页的场景,如游戏存档、配置管理和工具应用。在Godot引擎的C#(Mono)开发环境中,实现SQLite的稳定读写并确保跨平台(特别是安卓

congdi7904的博客 370

Android学习之sqlite基础

sqlite基础知识介绍 1.sqlite数据库数据类型 Integer varchar(10) float double char(10) text 2.数据库语句 2.1创建表语句 create table person(-id Integer primary key, name varchar(10), age Integer not null) 2.2删除表语句 dr

陈正的博客 622

Android应用中SQLite数据库操作实战指南

SQLiteOpenHelper类是Android开发中用于管理SQLite数据库版本和创建数据库的辅助类。它封装了创建和升级数据库的逻辑,使得开发者可以不必手动编写重复的代码,专注于数据操作的实现。@Override// 创建数据库表@Override// 在数据库版本更新时,进行数据库的升级操作以上代码展示了如何初始化一个SQLiteOpenHelper类的实例,并在其构造函数中传递了数据库名称和版本。onCreate方法在数据库第一次创建时被调用,用于初始化数据库表。

weixin_34163588的博客 1140

android insert方法,android中SQLite数据库中用insert同时插入多条记录的方法和效率比较...

在Android开发中我们常会遇到这样一种情况:在建立一个SQLite数据库时,想同时插入大量数据。那么应该怎么做呢?下面笔者以插入20条记录为例:将同时插入大量的数据写成一条SQL语句最笨的方法用insert语句一条一条的输入使用事务代码如下:public class DateBaseOpenHelper extends SQLiteOpenHelper {public static final...

weixin_39612122的博客 1123

ContactApp:深入掌握SQLite在Android中的CRUD操作

本文还有配套的精品资源,点击获取 简介:ContactApp是一个使用Java开发的Android应用程序,展示了在移动平台上如何有效地利用SQLite数据库执行基本的CRUD操作。该应用包含对SQLiteOpenHelper子类的实现,定义了创建和升级数据库的逻辑。它演示了如何使用SQL语句进行数据的读取、更新和删除操作。同时,ContactApp还展示了如何通过隐式意图...

weixin_28713083的博客 1242

Android SQLite数据库实践教程.zip

在本章节中,我们深入探讨了sqlite3命令行工具的基础和高级用法。首先,我们了解了如何使用sqlite3创建和打开数据库,以及如何执行基本的查询和修改操作。然后,我们探索了sqlite3的高级应用,包括数据库的备份和恢复、数据库的优化和维护等,这些都是数据库管理和维护中不可或缺的操作。通过本章节的介绍,我们能够更好地理解和应用sqlite3命令行工具来管理和操作 SQLite 数据库。数据表是数据库中最基本的组织数据形式,是存储数据的结构化对象。

weixin_42462474的博客 1055

Android SqLite中insert()方法解析

android SqLite中insert()方法解析           Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。对SQLiteDatabase的学习,我

常兴E站 7398

android中SQLite数据库中用insert同时插入多条记录的方法和效率比较

android中SQLite数据库中用insert同时插入多条记录的方法和效率比较

在 Android 中使用 SQLite 数据库及其操作详解

在 Android 开发中,使用 SQLite 数据库是一种常见的持久化数据存储方式。本文将通过代码示例详细讲解如何在 Android 中创建数据库表、插入数据、执行查询操作以及验证查询结果。

weixin_41496173的博客 2891

用CesiumLab2+nginx零成本构建三维地形服务:从DEM数据到浏览器渲染全流程

本文详细介绍了如何利用CesiumLab2和nginx零成本构建私有三维地形服务的完整流程。从获取DEM数据、使用CesiumLab2进行格式转换,到配置nginx服务器并重点解决跨域问题(Access-Control-Allow-Origin),最终实现在Cesium中流畅加载与渲染自定义地形,为内网或涉密项目提供了高性价比的解决方案。

weixin_29300931的博客 118

家庭路由器从入门到精通:连接设置、优化排障全指南

路由器作为家庭网络的核心枢纽,其工作原理基于NAT(网络地址转换)和DHCP(动态主机配置协议)两大关键技术。NAT负责将公网IP转换为多个内网IP,实现多设备共享上网;DHCP则自动为接入设备分配IP地址,简化网络配置。这些技术共同构建了稳定、安全的局域网环境,其价值在于为智能家居、在线办公、高清影音和游戏娱乐等场景提供可靠的网络基础。理解路由器的物理连接、后台设置与故障排查逻辑,是优化Wi-Fi信号覆盖、提升网络性能、保障家庭网络安全的关键。本文以路由器配置与排障为核心,详细解析从WAN/LAN口区分、

weixin_33393017的博客 406

android sqlite的SqliteDataBase.insert()方法,以及如何在事务管理中使用

1.db.insert()方法,方法中已经写了try catch块,会捕捉SqliteException,因此如果直接用 db.beginTransaction(); try{   db.insert(...);   db.setTransactionSuccessful(); }finally{  db.endtransaction(); } 这样的代码去开启事务,会导致无论是否

7620

〔重庆理工大学〕大学物理实验--液体表面张力系数的测定

每个老师要求不同,实验报告内容和数据仅供参考。

Pretty Boy Fox的博客 2805

android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed异常解决

问题 E/SQLiteDatabase: Error inserting thumb_uri=content://media/external/images/thumbnails/3959 image_id=8474 image_uri=content://media/external/images/media/8474 orientation=360 android.database.sqlite.SQLiteConstraintException: UNIQUE constraint fa

Tomes.V.White 3063

微信支付PHP集成指南

完整实现建议参考微信支付官方文档,包含更多支付场景(H5支付、Native支付等)和安全性处理细节。微信支付在PHP中的集成主要涉及服务端接口的调用和支付流程的实现。

bqq506615054的专栏 160

Autosar诊断实战系列05-Dcm之0x27加解密服务配置开发详解

UDS 0x27服务实战开发介绍,对解锁尝试次数及delay时间进一步解释。

initiallizer的博客 1994

Android sql数据库的Android包里面的函数介绍

SQLiteDataBase对象的query()接口: public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy,String limit) Query

永远在身边的专栏 880

Matlab R2018b简体中文版完整安装图文教程(附安装包下载)

目 录 一、安装过程 二、下载地址 matlab R2018b安装包如下所示,包括主程序和补丁文件两部分。 一、安装过程 双击安装包中的setup.exe。 选择使用文件安装MIYAO,点击下一步。 接受协议,选择是,点击下一步。 输入序列号:09806-07443-53955-64350-21751-41297,点击下一步。 修改安装路径,点击下...

智慧空间实验室 1万+

Android开发12——Andorid中操作数据库的insert的两种方法以及nullColumnHack

Android开发12——Andorid中操作数据库的insert的两种方法以及nullColumnHack

qq_44884300的博客 1306

Open-AutoGLM 实战:手把手教你用 AI 操作手机「喂饭教程」

Open-AutoGLM 是一个由智谱AI开源的手机操作智能体框架,由手机端智能助手框架Phone Agent和9B大小的模型AutoGLM-Phone-9B组成,借助ADB自动执行点击、滑动、输入等操作——用户只需用自然语言描述任务,系统便能自动规划并完成整个操作流程。

blues_C的博客 1270

Allegro如何画Photoplot_Outline操作指导

在用Allegro进行PCB设计的时候,最后进行光绘输出前,Photoplot_Outline是必备一个图形,所有在Photoplot_Outline中的图形将被输出,Photoplot_Outline以外的图形都将不被输出。如何绘制Photoplot_Outline,具体操作如下。如何画Photoplot_Outline操作指导。

weixin_54787054的博客 2641

Android SQLite数据库开发实战:从零掌握原生数据库操作与调试技巧

数据库作为移动应用数据持久化的核心技术,其底层原理与实现是每位开发者必须掌握的基础。SQLite作为Android系统内置的轻量级关系型数据库引擎,以其零配置、无服务器、事务性ACID兼容的特性,成为本地存储场景下的首选方案。理解SQLite的工作原理,不仅能帮助开发者进行深度性能优化和复杂问题排查,更能为后续使用Room等ORM框架打下坚实基础。在Android开发实践中,通过SQLiteOpenHelper管理数据库生命周期、执行原生SQL语句实现CRUD操作,是处理轻量级数据存储、依赖敏感型项目的关键

weixin_33937913的博客 366

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【Android】SQLite使用——增删查改

创建数据库:通过继承SQLiteOpenHelper类,重写onCreate()方法执行建表SQL语句,管理数据库版本。 插入数据:使用ContentValues封装数据,通过getWritableDatabase()获取可写数据库对象,调用insert()方法实现数据添加。 查询数据:通过query()方法执行条件查询,返回Cursor对象遍历结果集,将数据转换为Java对象集合。 注意事项:数据库操作应放在子线程执行避免主线程阻塞,查询条件支持参数绑定防止SQL注入。

阿华的博客 1048

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SQLite数据库的增删改查

其实我们可以对数据进行的操作无非有4种,即CRUD。其中C代表添加( Create), R代表查询( Retrieve), U代表更新(Update), D代表删除( Delete)。每一种操作又各自对应了一种SQL命令,如果不熟悉SQL语言,Android也提供了一系列的辅助性方法,使得在Android中即使不去编写SQL语句,也能轻松完成所有的CRUD操作。调用SQLiteOpenHelper的getReadableDatabase( )或getWritableDatabase()方法是可以用于创建和升

Massimo__JAVA的博客 6827

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android sqlite 完全用replace替代 insert 和 update 操作

android 中 sqlite数据库相信大家或多或少都使用过。我也一样。之前只知道 insert,update,query,delete并不知道有replace 不清楚replace()的,可以看下这个来自博客园,和这个。这两篇都讲了replace()方法的使用。但是,并不是很详细。 特别是,他们都没有强调,如果要使用replace,一定要有一个primary key,并且,该字段,是唯一区分到底

Cat的专栏 1万+

android sqlite帮助类,什么是现有SQLite数据库的完整Android数据库帮助器类?

这是我想出来的,希望能帮助那些有麻烦的人.package com.MyPackage;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.UUID;import android.conten...

weixin_35033082的博客 217
上一篇: Xposed基本知识整理
下一篇: Android 如何全局获取Context
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值