原型:

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方法,这里我们粘贴出该方法的部分实现

  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);这样很显然就是可以的。

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

    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. }

android之SQLite数据库insert操作的更多相关文章

  1. android 对sqlite数据库的增删改查等各种操作

    转载:http://blog.csdn.net/vrix/article/details/6717090 package com.sqlite.main; import java.io.File; i ...

  2. 我的Android六章:Android中SQLite数据库操作

    今天学习的内容是Android中的SQLite数据库操作,在讲解这个内容之前小编在前面有一篇博客也是讲解了SQLite数据库的操作,而那篇博客的讲解是讲述了 如何在Window中通过DOM来操作数据库 ...

  3. Android中SQLite数据库操作(1)——使用SQL语句操作SQLite数据库

    下面是最原始的方法,用SQL语句操作数据库.后面的"Android中SQLite数据库操作(2)--SQLiteOpenHelper类"将介绍一种常用的android封装操作SQL ...

  4. android 一个SQLite数据库多个数据表的基本使用框架 (带demo)

    android 一个SQLite数据库多个数据表(带demo) 前言        demo演示        一.搭建        二.建立实体类        三.建立数据库操作类        ...

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

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

  6. Android实现SQLite数据库联系人列表

    Android实现SQLite数据库联系人列表 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个通讯录查看程序: 要求使用SQLite ...

  7. IOS开发-UI学习-sqlite数据库的操作

    IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...

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

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

  9. android中sqlite数据库的基本使用和添加多张表

    看了很多关于android使用sqlite数据库的文章,很多都是介绍了数据库的建立和表的建立,而表通常都是只建立一张,而实际情况我们用到的表可能不止一张,那这种情况下我们又该怎么办呢,好了,下面我教大 ...

随机推荐

  1. 查找文本工具grep

    许多时候需要从一大堆的命令输出或文本内容中找出一两行关键的内容,例如从系统用户文件中查找某个用户.如果不借助工具,这将是一项非常繁琐的工作,这时可以使用grep工具对内容进行筛选. grep(glob ...

  2. Android工程内嵌Flutter

    本文记录一下Android主工程中嵌入部分Fluttter页面的实现方法. 创建一个Android工程模拟你的现有工程 为了让Android工程和Flutter工程互不干扰,这里不再以Android工 ...

  3. 算法笔记_140:最小费用最大流问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 在最大流有多组解时,给每条边在附上一个单位费用的量,问在满足最大流时的最小费用是多少? 2 解决方案 下面代码所使用的测试数据如下图: 具体代码如下 ...

  4. taro 填坑之路(三)taro 缓存

    1.taro 缓存 /** * 缓存数据 H5 小程序 * {food.id:{菜品信息 Num}, } */ import Taro from '@tarojs/taro'; // 取值 let s ...

  5. 〖Fedora〗设置Fedora静态ip地址

    root@Fedora:~# cat /etc/sysconfig/network-scripts/ifcfg-eth0 # Intel Corporation 82540EM Gigabit Eth ...

  6. 纯CSS实现蜂窝六边形的个性相册

    概述 纯CSS实现蜂窝六边形的个性相册 详细 代码下载:http://www.demodashi.com/demo/12804.html 此案例主要用到CSS3的 transform 和 transi ...

  7. activeMQ Jms Demo

    概述 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经 ...

  8. ASP.NET MVC之Html.RenderAction(无操作方法 传参数)

    WEB窗体模式开发惯了,切入MVC模式,好多东西都不懂,每一步都要查资料. 初步得来的一些知识点体会是: _Layout.cshtml就相当于母版页 然后partical视图(部分视图)就是用户控件. ...

  9. Python线程event

    python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法wait.clear.set 事件处理的机制:全局定义了一个“Flag”,如果“Flag”值为 False,那么当程序执行 e ...

  10. 摘:LIB和DLL的区别与在VC中的使用

    共有两种库:一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library.一种是LIB包含函数 ...