原型:

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 print?
  1. [java] view plaincopy/**
  2. * General method for inserting a row into the database.
  3. *
  4. * @param table the table to insert the row into
  5. * @param nullColumnHack SQL doesn't allow inserting a completely empty row,
  6. *            so if initialValues is empty this column will explicitly be
  7. *            assigned a NULL value
  8. * @param initialValues this map contains the initial column values for the
  9. *            row. The keys should be the column names and the values the
  10. *            column values
  11. * @param conflictAlgorithm for insert conflict resolver
  12. * @return the row ID of the newly inserted row
  13. * OR the primary key of the existing row if the input param 'conflictAlgorithm' =
  14. * {@link #CONFLICT_IGNORE}
  15. * OR -1 if any error
  16. */
  17. public long insertWithOnConflict(String table, String nullColumnHack,
  18. ContentValues initialValues, int conflictAlgorithm) {
  19. if (!isOpen()) {
  20. throw new IllegalStateException("database not open");
  21. }
  22. // Measurements show most sql lengths <= 152
  23. StringBuilder sql = new StringBuilder(152);
  24. sql.append("INSERT");
  25. sql.append(CONFLICT_VALUES[conflictAlgorithm]);
  26. sql.append(" INTO ");
  27. sql.append(table);
  28. // Measurements show most values lengths < 40
  29. StringBuilder values = new StringBuilder(40);
  30. Set<Map.Entry<String, Object>> entrySet = null;
  31. if (initialValues != null && initialValues.size() > 0) {
  32. entrySet = initialValues.valueSet();
  33. Iterator<Map.Entry<String, Object>> entriesIter = entrySet.iterator();
  34. sql.append('(');
  35. boolean needSeparator = false;
  36. while (entriesIter.hasNext()) {
  37. if (needSeparator) {
  38. sql.append(", ");
  39. values.append(", ");
  40. }
  41. needSeparator = true;
  42. Map.Entry<String, Object> entry = entriesIter.next();
  43. sql.append(entry.getKey());
  44. values.append('?');
  45. }
  46. sql.append(')');
  47. } else {
  48. sql.append("(" + nullColumnHack + ") ");
  49. values.append("NULL");
  50. }

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

下面附上插入操作的方法代码:

[java] view plaincopy print?
  1. public void insert(String name, String address, String type, String notes) {
  2. ContentValues cv=new ContentValues();
  3. cv.put("name", name);
  4. cv.put("address", address);
  5. cv.put("type", type);
  6. cv.put("notes", notes);
  7. getWritableDatabase().insert("restaurants", "name", cv);
  8. }

转载于:https://www.cnblogs.com/printN/p/6611926.html

android之SQLite数据库insert操作相关推荐

  1. android sqlite 操作类封装,SQLiteUtils 一个简单的基于 Android 的 Sqlite 数据库的操作封装库 @codeKK Android开源站...

    一个简单的基于 Android 的 Sqlite 数据库的操作封装,它有如下的好处: 便捷地创建表和增添表字段 通过操作对象来 insert 或者 update 表记录 支持多种查询方式,支持分页查询 ...

  2. Android中实现SQLite数据库CRUD操作的两种方式

    Android中实现SQLite数据库CRUD操作的两种方式 SQLite是一款轻量级的关系型数据库,具有运行速度.占用资源少的特点.通常只需要几百KB的内存就够了,因此特别适合在移动设备上使用.SQ ...

  3. Android整合SQLite数据库进行基本的增删改查

    简言 使用Android整合SQLite数据库进行数据存储,大致可以划分为三步: ①继承 SQLiteOpenHelper,创建数据库 ②继承 ContentProvider 类,重写方法 ③在清单文 ...

  4. Android studio—SQlite数据库注册登录

    Android studio-SQlite数据库注册登录 文章目录 Android studio-SQlite数据库注册登录 创建用户类 创建数据库 注册写入数据库 登录读取数据库 效果展示 布局文件 ...

  5. Android Studio SQLite数据库应用(一)

    Android Studio SQLite数据库应用(一) 版本:Android Studio 1.5.1 创建数据库 升级数据库 CRUD数据操作 SQLite (英语发音:/ˌɛskjuːɛlˈl ...

  6. 从C#到Objective-C,循序渐进学习苹果开发(7)--使用FMDB对Sqlite数据库进行操作

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本篇主要开始介绍基于XCod ...

  7. 使用iOS原生sqlite3框架对sqlite数据库进行操作

    摘要: iOS中sqlite3框架可以很好的对sqlite数据库进行支持,通过面向对象的封装,可以更易于开发者使用. 使用iOS原生sqlite3框架对sqlite数据库进行操作 一.引言 sqlit ...

  8. Android开发笔记(三十)SQLite数据库基础操作

    SQLite语法 SQLite是一个小巧的嵌入式数据库,使用方便.开发简单,手机上最早由ios运用,后来android兴起同样也采用了sqlite.sqlite的多数sql语法与oracle是一样的, ...

  9. [原创,转载请注明来源]android中sqlite数据库的中文数据的插入(insert)和查询(select)

    写这个东西写的我万分痛苦,因为这么个小问题整整折磨了我两天多的时间, 大把的青春啊,就这么浪费了, 这些或许对其他人有用,我再花半小时写出来,或许你就可以避免跟我一样,少走两天的弯路. 首先说查询吧: ...

最新文章

  1. 怎么打开网卡rss_电脑任务栏右下角宽带图标提示网络电缆没插好怎么办?
  2. 转:万字总结:学习MySQL优化原理,这一篇就够了!
  3. 机房合作--驼峰命名法
  4. Firefly官方教程之Netconnect使用文档
  5. go和python组合开发_混合Python和Go
  6. 后台系统可扩展性学习笔记(十三)缓存
  7. 洪磊父亲避谈洪磊获释 拘留已过24小时留滞期
  8. RPC failed; curl 56 SSLRead() return error -9806
  9. 目前计算机应用最广的领悟是,最新职中计算机应用基础期中考试试题及答案
  10. 千行代码入门python-要学 Python 需要怎样的基础?
  11. Orion Network Configuration Manager (NCM)测试报告
  12. Listary Pro - 能极大幅度提高你 Windows 文件浏览与搜索速度效率的「超级神器」...
  13. 1319 移棋子游戏(sg函数模板)
  14. cdc comms interface驱动
  15. unlink函数 与 remove函数
  16. 巧用二重积分的积分中值定理
  17. 数据库为什么需要锁机制?有哪些锁机制?
  18. CAD教程:CAD联动模式的使用技巧
  19. 如何将图像保存至计算机G7X,佳能官方教程:如何将G7X通过WiFi与电脑连接.pdf
  20. CoherenceModel官网翻译

热门文章

  1. ECharts的点击事件
  2. JSP EL 表达式取request parameter
  3. zookeeper启动占用8080端口
  4. 【Error】Provider com.sun.xml.stream.ZephyrParserFactory not found
  5. java统计行列和字数的函数_JAVA使用POI获取Excel的列数与行数
  6. python保存数据_Python 保存数据的方法(4种方法)
  7. latex伪代码添加注释_Latex中文期刊投稿使用:以《系统工程学报》为例
  8. 切换 uniapp_万能前端框架uni app初探03:底部导航开发
  9. java中如何限制输入非空_项目中的参数限制、非空、以及集合中的验证,你真的会做吗(Java)...
  10. 使用sed修改最后一行数据