原型:

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. MySQL之myisamchk

    Description, check and repair of MyISAM tables.Used without options all tables on the command will b ...

  2. windows配置meld

    meld                   官网:http://meldmerge.org/ git配置: git bash: git config --global merge.tool meld ...

  3. java反射-获取方法信息

    例子代码如下: package com.reflect; import java.lang.reflect.Method; public class ClassUtill { /* * 打印类的信息, ...

  4. session 防止表单重复提交

    防止表单重复提交应该现在前台做一遍,再在后台做一遍.这样双重安全而且减轻服务器负担. 代码: package flying.form; import java.io.IOException; impo ...

  5. MySQL修改root密码的各种方法整理(转)

    整理了以下四种在MySQL中修改root密码的方法,可能对大家有所帮助! 方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR ' ...

  6. Java Socket网络编程Server端详解

    Socket通信:分为客户端和服务端的socket代码. Java SDK提供一些相对简单的Api来完成.对于Java而言.这些Api存在与java.net 这个包里面.因此只要导入这个包就可以开始网 ...

  7. some issues that you should be take care of when use the plupload module

    1. the config arguments 'browse_button' should not be a single element like button etc. because in i ...

  8. django abstract base class ---- 抽象基类

    抽象蕨类用于定义一些同享的列.类本身并不会在数据库端有表与之对应 一.例子: 1.定义一个叫Person 的抽象基类.Student 继承自Person from django.db import m ...

  9. 如何编写安全的PHP代码

    转于:http://www.nowamagic.net/php/php_HowToWriteSafePhpCode.php

  10. angular.js 动态插入删除dom节点

    angular.js 是新一代web开发框架,它轻松在web前端实现了MVC模式,相比 jquery 模式,这种新玩意竟然不需要开发者直接去操作dom . 作为前端开发而不去操作dom ,这简直是一个 ...