Sqlite insert方法nullColumnHack字段的含义

Sqlite insert方法nullColumnHack字段的含义,第1张

概述利用数据库对象SQLiteDatabase对数据库进行增删改查 *** 作。     这里要强调一点,无论我们怎么获得的数据库连接,我们可以看到,我们最后都是为了获得一个SQLiteDatabase对象,而我们的所以增删改查方法便都是通过这个对象来实现的。   增加数据:      参数介绍: table 要插入数据的表的名称 values:一个ContentValues对象,类似一个map.通过键值对的

利用数据库对象sqliteDatabase对数据库进行增删改查 *** 作。@H_502_7@

这里要强调一点,无论我们怎么获得的数据库连接,我们可以看到,我们最后都是为了获得一个sqliteDatabase对象,而我们的所以增删改查方法便都是通过这个对象来实现的。@H_502_7@

@H_502_7@

增加数据:@H_502_7@

@H_502_7@

@H_502_7@

@H_502_7@

参数介绍:@H_502_7@

table 要插入数据的表的名称@H_502_7@

values:一个ContentValues对象,类似一个map.通过键值对的形式存储值。@H_502_7@

conflictAlgon:冲突解决方案。例如当数据表主键的唯一性检测出错的时候,就会按照该值设定的值进行处理。@H_502_7@

nullColumnHack:当values参数为空或者里面没有内容的时候,我们insert是会失败的(底层数据库不允许插入一个空行),为了防止这种情况,我们要在这里指定一个列名,到时候如果发现将要插入的行为空行时,就会将你指定的这个列名的值设为null,然后再向数据库中插入。@H_502_7@

@H_502_7@

(这里很多人会迷惑,nullColumnHack到底干什么用的,为什么会出现呢。当我们不设定一列的时候,不都是数据库给设为默认值吗?很多字段设置默认值也是null,这里显示的设置也是null,有什么区别吗,怎么会显示设置了之后就允许插入了呢?笔者为了找到原因,我去查看了源代码)@H_502_7@

其实在底层,各种insert方法最后都回去调用insertWithOnConflict方法,这里我们粘贴出该方法的部分实现@H_502_7@

@H_502_7@

@H_502_7@ [java]view plaincopy /** *Generalmethodforinsertingarowintothedatabase. * *@paramtablethetabletoinserttherowinto *@paramnullColumnHacksqldoesn'tallowinsertingacompletelyemptyrow, *soifinitialValuesisemptythiscolumnwillexplicitlybe *assignedaNulLvalue *@paraminitialValuesthismapcontainstheinitialcolumnvaluesforthe *row.Thekeysshouldbethecolumnnamesandthevaluesthe *columnvalues *@paramconflictAlgorithmforinsertconflictresolver *@returntherowIDofthenewlyinsertedrow *ORtheprimarykeyoftheexistingrowiftheinputparam'conflictAlgorithm'= *{@link#CONFliCT_IGnorE} *OR-1ifanyerror */ publiclonginsertWithOnConflict(Stringtable,StringnullColumnHack,92); line-height:18px"> ContentValuesinitialValues,intconflictAlgorithm){ if(!isopen()){ thrownewIllegalStateException("databasenotopen"); } //Measurementsshowmostsqllengths<=152 StringBuildersql=newStringBuilder(152); sql.append("INSERT"); sql.append(CONFliCT_VALUES[conflictAlgorithm]); sql.append("INTO"); sql.append(table); //Measurementsshowmostvalueslengths<40 StringBuildervalues=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('('); booleanneedSeparator=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);这样很显然就是可以的。@H_502_7@ 总结

以上是内存溢出为你收集整理的Sqlite insert方法nullColumnHack字段含义全部内容,希望文章能够帮你解决Sqlite insert方法nullColumnHack字段的含义所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1173514.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存