android之SQLite数据库insert操作
原型:
long Android.database.sqlite.SQLiteDatabase.insert(String table, String nullColumnHack, ContentValues values)
参数介绍:
table: 要插入数据的表的名称
nullColumnHack:当values参数为空或者里面没有内容的时候,我们insert是会失败的(底层数据库不允许插入一个空行),为了防止这种情况,我们要在这里指定一个列名,到时候如果发现将要插入的行为空行时,就会将你指定的这个列名的值设为null,然后再向数据库中插入。
values:一个ContentValues对象,类似一个map.通过键值对的形式存储值。
这里很多人会迷惑,nullColumnHack到底干什么用的,为什么会出现呢。当我们不设定一列的时候,不都是数据库给设为默认值吗?很多字段设置默认值也是null,这里显示的设置也是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);这样很显然就是可以的。
下面附上插入操作的方法代码:
- public void insert(String name, String address, String type, String notes) {
- ContentValues cv=new ContentValues();
- cv.put("name", name);
- cv.put("address", address);
- cv.put("type", type);
- cv.put("notes", notes);
- getWritableDatabase().insert("restaurants", "name", cv);
- }
转载于:https://www.cnblogs.com/printN/p/6611926.html
android之SQLite数据库insert操作相关推荐
- android sqlite 操作类封装,SQLiteUtils 一个简单的基于 Android 的 Sqlite 数据库的操作封装库 @codeKK Android开源站...
一个简单的基于 Android 的 Sqlite 数据库的操作封装,它有如下的好处: 便捷地创建表和增添表字段 通过操作对象来 insert 或者 update 表记录 支持多种查询方式,支持分页查询 ...
- Android中实现SQLite数据库CRUD操作的两种方式
Android中实现SQLite数据库CRUD操作的两种方式 SQLite是一款轻量级的关系型数据库,具有运行速度.占用资源少的特点.通常只需要几百KB的内存就够了,因此特别适合在移动设备上使用.SQ ...
- Android整合SQLite数据库进行基本的增删改查
简言 使用Android整合SQLite数据库进行数据存储,大致可以划分为三步: ①继承 SQLiteOpenHelper,创建数据库 ②继承 ContentProvider 类,重写方法 ③在清单文 ...
- Android studio—SQlite数据库注册登录
Android studio-SQlite数据库注册登录 文章目录 Android studio-SQlite数据库注册登录 创建用户类 创建数据库 注册写入数据库 登录读取数据库 效果展示 布局文件 ...
- Android Studio SQLite数据库应用(一)
Android Studio SQLite数据库应用(一) 版本:Android Studio 1.5.1 创建数据库 升级数据库 CRUD数据操作 SQLite (英语发音:/ˌɛskjuːɛlˈl ...
- 从C#到Objective-C,循序渐进学习苹果开发(7)--使用FMDB对Sqlite数据库进行操作
本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本篇主要开始介绍基于XCod ...
- 使用iOS原生sqlite3框架对sqlite数据库进行操作
摘要: iOS中sqlite3框架可以很好的对sqlite数据库进行支持,通过面向对象的封装,可以更易于开发者使用. 使用iOS原生sqlite3框架对sqlite数据库进行操作 一.引言 sqlit ...
- Android开发笔记(三十)SQLite数据库基础操作
SQLite语法 SQLite是一个小巧的嵌入式数据库,使用方便.开发简单,手机上最早由ios运用,后来android兴起同样也采用了sqlite.sqlite的多数sql语法与oracle是一样的, ...
- [原创,转载请注明来源]android中sqlite数据库的中文数据的插入(insert)和查询(select)
写这个东西写的我万分痛苦,因为这么个小问题整整折磨了我两天多的时间, 大把的青春啊,就这么浪费了, 这些或许对其他人有用,我再花半小时写出来,或许你就可以避免跟我一样,少走两天的弯路. 首先说查询吧: ...
最新文章
- 怎么打开网卡rss_电脑任务栏右下角宽带图标提示网络电缆没插好怎么办?
- 转:万字总结:学习MySQL优化原理,这一篇就够了!
- 机房合作--驼峰命名法
- Firefly官方教程之Netconnect使用文档
- go和python组合开发_混合Python和Go
- 后台系统可扩展性学习笔记(十三)缓存
- 洪磊父亲避谈洪磊获释 拘留已过24小时留滞期
- RPC failed; curl 56 SSLRead() return error -9806
- 目前计算机应用最广的领悟是,最新职中计算机应用基础期中考试试题及答案
- 千行代码入门python-要学 Python 需要怎样的基础?
- Orion Network Configuration Manager (NCM)测试报告
- Listary Pro - 能极大幅度提高你 Windows 文件浏览与搜索速度效率的「超级神器」...
- 1319 移棋子游戏(sg函数模板)
- cdc comms interface驱动
- unlink函数 与 remove函数
- 巧用二重积分的积分中值定理
- 数据库为什么需要锁机制?有哪些锁机制?
- CAD教程:CAD联动模式的使用技巧
- 如何将图像保存至计算机G7X,佳能官方教程:如何将G7X通过WiFi与电脑连接.pdf
- CoherenceModel官网翻译
热门文章
- ECharts的点击事件
- JSP EL 表达式取request parameter
- zookeeper启动占用8080端口
- 【Error】Provider com.sun.xml.stream.ZephyrParserFactory not found
- java统计行列和字数的函数_JAVA使用POI获取Excel的列数与行数
- python保存数据_Python 保存数据的方法(4种方法)
- latex伪代码添加注释_Latex中文期刊投稿使用:以《系统工程学报》为例
- 切换 uniapp_万能前端框架uni app初探03:底部导航开发
- java中如何限制输入非空_项目中的参数限制、非空、以及集合中的验证,你真的会做吗(Java)...
- 使用sed修改最后一行数据