日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

android之SQLite数据库insert操作

發布時間:2024/9/5 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android之SQLite数据库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 print?
  • [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);這樣很顯然就是可以的。

    ?

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

    [java]?view plaincopy print?
  • 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://www.cnblogs.com/printN/p/6611926.html

    總結

    以上是生活随笔為你收集整理的android之SQLite数据库insert操作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。