生活随笔
收集整理的這篇文章主要介紹了
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 ???public?long?insertWithOnConflict(String?table,?String?nullColumnHack,???? ???????????ContentValues?initialValues,?int?conflictAlgorithm)?{???? ???????if?(!isOpen())?{???? ???????????throw?new?IllegalStateException("database?not?open");???? ???????}???? ???? ??????? ???????StringBuilder?sql?=?new?StringBuilder(152);???? ???????sql.append("INSERT");???? ???????sql.append(CONFLICT_VALUES[conflictAlgorithm]);???? ???????sql.append("?INTO?");???? ???????sql.append(table);???? ??????? ???????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操作 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。