android之SQLite数据库insert操作

原型:long android.database.sqlite.SQLiteDatabase.insert(String table, String nullColumnHack, ContentValues values) 参数介绍:table: 要插入数据的表的名称nullColumnHack:当values参数为空或者里面没有内容的时候,我们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://javaforall.net/121428.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux常用命令面试题(linux面试题必会题目)

    Linux常用命令因为热爱,所以拼搏。–RuiDer常用指令ls  显示文件或目录-l列出文件详细信息l(list)-a列出当前目录下所有文件及目录,包括隐藏的a(all)mkdir创建目录-p创建目录,若…

    2022年4月12日
    48
  • IT视频资源分享列表

    IT视频资源分享列表

    2022年2月10日
    42
  • linux内存管理之 ION 内存管理器浅析Ⅱ(system contig heap)

    linux内存管理之 ION 内存管理器浅析Ⅱ(system contig heap)目录1systemcontigheap与systemheap2systemcontigheap创建3systemcontigheap内存分配4systemcontigheap内存释放1systemcontigheap与systemheap从代码中我们看到systemcontigheap与systemheap同属一个文件中,ion_system_heap.c相同点:它们都是根据用户传递的字节len,转换成order,从buddy中

    2025年8月13日
    2
  • SLAM技术概述_SRAM工艺

    SLAM技术概述_SRAM工艺导语随着最近几年机器人、无人机、无人驾驶、VR/AR的火爆,SLAM技术也为大家熟知,被认为是这些领域的关键技术之一。本文对SLAM技术及其发展进行简要介绍,分析视觉SLAM系统的关键问题以及在实际应用中的难点,并对SLAM的未来进行展望。1.SLAM技术SLAM(SimultaneousLocalizationandMapping),同步定位与地图构建,最早在机器人领域提出,…

    2022年10月1日
    3
  • java.lang.abstractMethodError的错误解决「建议收藏」

    java.lang.abstractMethodError的错误解决「建议收藏」日常开发中,如果在打包后遇到过java.lang.abstractMethodError的问题,其中一部分,可能是混淆引起的。解决方法就是把提示报错的地方,通过-keep的方式过滤掉,不让那些代码进行混淆。本人遇到的是一个RecyclerView使用时adapter中的getItemCount方法报错。原因是Adapter是内部类,而getItemCount是公共方法。getItemCo…

    2022年5月5日
    683
  • 平衡二叉树与红黑树的区别_平衡二叉树怎么构造

    平衡二叉树与红黑树的区别_平衡二叉树怎么构造平衡二叉树与红黑树一、红黑树的性质:二、红黑树的主要用途,和其他树的比较:三、运用场景一、红黑树的性质:  红黑树是一颗二叉搜索树,通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因而是近似于平衡的。  树的每个结点包含5个属性,color,key,left,right,p。如果一个结点没有子结点或父结点,则该结点的响应指针属性的指为…

    2022年10月21日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号