【转载】android之SQLite数据库insert操作

原博文地址:http://blog.csdn.net/jason0539/article/details/9977175

原型:

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
23        // Measurements show most sql lengths <= 152
24        StringBuilder sql = new StringBuilder(152);
25        sql.append("INSERT");
26        sql.append(CONFLICT_VALUES[conflictAlgorithm]);
27        sql.append(" INTO ");
28        sql.append(table);
29        // Measurements show most values lengths < 40
30        StringBuilder values = new StringBuilder(40);
31
32        Set<Map.Entry<String, Object>> entrySet = null;
33        if (initialValues != null && initialValues.size() > 0) {
34            entrySet = initialValues.valueSet();
35            Iterator<Map.Entry<String, Object>> entriesIter = entrySet.iterator();
36            sql.append(‘(‘);
37
38            boolean needSeparator = false;
39            while (entriesIter.hasNext()) {
40                if (needSeparator) {
41                    sql.append(", ");
42                    values.append(", ");
43                }
44                needSeparator = true;
45                Map.Entry<String, Object> entry = entriesIter.next();
46                sql.append(entry.getKey());
47                values.append(‘?‘);
48            }
49
50            sql.append(‘)‘);
51        } else {
52            sql.append("(" + nullColumnHack + ") ");
53            values.append("NULL");
54        }  

这里我们可以看到,当我们的ContentValues类型的数据initialValues为null,或者size<=0时,就会再sql语句中添加nullColumnHack的设置。我们可以想象一下,如果我们不添加nullColumnHack的话,那么我们的sql语句最终的结果将会类似insert into tableName()values();这显然是不允许的。而如果我们添加上nullColumnHack呢,sql将会变成这样,insert into tableName (nullColumnHack)values(null);这样很显然就是可以的。

时间: 2024-10-05 23:40:53

【转载】android之SQLite数据库insert操作的相关文章

Android实现SQLite数据库的增、删、改、查的操作

核心代码DAO类 package com.examp.use_SQLite.dao; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import

Android开发之通过Android的API对sqlite数据库的操作以及数据库事务的练习

一.通过Android的API对sqlite数据库的操作 通过已有的ContentValues类,实例一个对象value来调用其中内部的方法来操作sqlite数据库 代码: package com.example.databasedemo; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sql

android 一个SQLite数据库多个数据表的基本使用框架 (带demo)

android 一个SQLite数据库多个数据表(带demo) 前言        demo演示        一.搭建        二.建立实体类        三.建立数据库操作类        四.配置Application        五.使用    GitHub 前言 我的上一篇博客讲的是简单的 android SQLite 数据库的基本操作如增删改查,有兴趣的朋友可以点一下这里android 简单SQLite数据库 增删改查 但是呢,一般的项目里,一个数据库也不会只有一个数据表,

android中SQLite数据库的增删改查

1.数据库帮助类PersonSQLiteOpenHelper package com.wzw.sqllitedemo.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper

Android学习---SQLite数据库的增删改查和事务(transaction)调用

上一篇文章中介绍了手工拼写sql语句进行数据库的CRUD操作,本文将介绍调用sqlite内置的方法实现CRUD操作,其实质也是通过拼写sql语句. 首先,创建一个新的android项目: 其次,查看代码实现增删查改: 1.创建DB工具类 MyDBHelper.java(创建数据库的操作) package com.amos.android_db; import android.content.Context; import android.database.sqlite.SQLiteDatabas

Android中SQLite事务的操作

1.创建一个数据库帮助类. package com.wzw.sqllitedemo.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.

android greenDao SQLite数据库操作工具类使用

上一篇介绍了如何建立类生成工程,现在介绍如何使用. 以下是ExampleDaoGenerator工程代码,做了一些修改 /* * Copyright (C) 2011 Markus Junginger, greenrobot (http://greenrobot.de) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in com

[Unity]SQLite-C#调用 SQLite数据库-Unity操作

SQLite数据库-Unity操作 项目开发的时候,经常会遇到的一种需求,数据存储 离线缓存的数据类型很多,大致分成两类 字符串文本数据 多媒体数据 字符串数据的类型只有字符串,但是结构有很多: xml json md5 base64 普通字符串 多媒体数据的类型: 图片(jpg,png,gif...) 音频(mp3,aif...) 视频(mp4,mpv) 通常用数据库来存储字符串文本类型的数据,但是需要注意的是数据库同时也能存储多媒体类型的数据 关系数据库 在一个给定的应用领域中,所有实体及实

IOS开发-UI学习-sqlite数据库的操作

IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这两款著名的数据库都还快,在ios和安卓app中常用来完成对数据进行离线缓存的处理,如新闻数据的离线缓存. 它的基本操作步骤是: 1.先加入sqlite开发库libsqlite3.dylib, 2.新建或打开数据库, 3.创建数据表, 4.插入数据, 5.查询数据并打印, 6.关闭数据库, 具体操作步