问题的因素:

调试了一上午,我要判断数据库表的name字段是否为空,使用了TextUtils.isEmpty(nameStr);来判断name字段是否为空,明明数据库是没有值,却一直显示有值,然后还去质疑TextUtils.isEmpty(nameStr);,最后才发现是我存入数据的时候有问题 不能 name + ""

TextUtils.isEmpty(nameStr)没有问题, 是存入的时候 name + ""    会导致数据库表字段是null

以下代码的解释:

注意:⚠️ 由于在真实开发的项目中代码非常庞大/非常复杂,也不能暴露公司的代码,所以以下代码都是简单的测试代码:

问题的示范:

package liudeli.my_work_summary;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log; public class MainActivity02 extends Activity { private final String TAG = MainActivity02.class.getSimpleName();
private final String TABLE_NAME = "MainActivity02_TABLE"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main02); MySQLiteOpenHelper helper = new MySQLiteOpenHelper(this, "MainActivity02_DBName", null, 1); // 模拟插入数据
String name = null;
String body = null; SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("body", body);
values.put("name", name + ""); /** 注意:⚠️ 我这里是 name+"" */
db.insert(TABLE_NAME, null, values);
// 不能在这里关闭db.close();,因为以下代码还需要db // 判断数据库表里面的name是否为空
Cursor cursor = db.query(TABLE_NAME, new String[]{"body","name"}, null, null, null, null,null);
if (cursor.moveToFirst()) {
String nameStr = cursor.getString(cursor.getColumnIndex("name"));
if (TextUtils.isEmpty(nameStr)) {
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("name是空的")
.setPositiveButton("我知道了", null)
.show();
} else {
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("name是有值的")
.setPositiveButton("我指定了", null)
.show();
}
} // 关闭db
db.close();
} class MySQLiteOpenHelper extends SQLiteOpenHelper { public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
} @Override
public void onCreate(SQLiteDatabase db) {
String createTableSQL = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (ID INTEGER PRIMARY KEY, "
+ "body VARCHAR,"
+ "name VARCHAR);";
try {
db.execSQL(createTableSQL);
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, TAG + "创表异常:" + e.toString());
} } @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}


解决方案一:在判断的时候以null作为空的标记来判断,不推荐此方法

package liudeli.my_work_summary;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log; public class MainActivity02 extends Activity { private final String TAG = MainActivity02.class.getSimpleName();
private final String TABLE_NAME = "MainActivity02_TABLE"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main02); MySQLiteOpenHelper helper = new MySQLiteOpenHelper(this, "MainActivity02_DBName", null, 1); // 模拟插入数据
String name = null;
String body = null; SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("body", body);
values.put("name", name + ""); /** 注意:⚠️ 我这里是 name+"" */
db.insert(TABLE_NAME, null, values);
// 不能在这里关闭db.close();,因为以下代码还需要db // 判断数据库表里面的name是否为空
Cursor cursor = db.query(TABLE_NAME, new String[]{"body","name"}, null, null, null, null,null);
if (cursor.moveToFirst()) {
String nameStr = cursor.getString(cursor.getColumnIndex("name"));
// if (TextUtils.isEmpty(nameStr)) {
if ("null".equals(nameStr)) { /** 注意:⚠️ 这种解决方案会被所有安卓程序员鄙视 */
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("name是空的")
.setPositiveButton("我知道了", null)
.show();
} else {
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("name是有值的")
.setPositiveButton("我指定了", null)
.show();
}
} // 关闭db
db.close();
} class MySQLiteOpenHelper extends SQLiteOpenHelper { public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
} @Override
public void onCreate(SQLiteDatabase db) {
String createTableSQL = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (ID INTEGER PRIMARY KEY, "
+ "body VARCHAR,"
+ "name VARCHAR);";
try {
db.execSQL(createTableSQL);
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, TAG + "创表异常:" + e.toString());
} } @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}

结果:


解决方案二:存入数据的时候,千万不能加入 name + ""

package liudeli.my_work_summary;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log; public class MainActivity02 extends Activity { private final String TAG = MainActivity02.class.getSimpleName();
private final String TABLE_NAME = "MainActivity02_TABLE"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main02); MySQLiteOpenHelper helper = new MySQLiteOpenHelper(this, "MainActivity02_DBName", null, 1); // 模拟插入数据
String name = null;
String body = null; SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("body", body);
values.put("name", name); /** 注意:⚠️ 这种解决方案才是正确的 不能加 + "" */
db.insert(TABLE_NAME, null, values);
// 不能在这里关闭db.close();,因为以下代码还需要db // 判断数据库表里面的name是否为空
Cursor cursor = db.query(TABLE_NAME, new String[]{"body","name"}, null, null, null, null,null);
if (cursor.moveToFirst()) {
String nameStr = cursor.getString(cursor.getColumnIndex("name"));
if (TextUtils.isEmpty(nameStr)) {
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("name是空的")
.setPositiveButton("我知道了", null)
.show();
} else {
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("name是有值的")
.setPositiveButton("我指定了", null)
.show();
}
} // 关闭db
db.close();
} class MySQLiteOpenHelper extends SQLiteOpenHelper { public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
} @Override
public void onCreate(SQLiteDatabase db) {
String createTableSQL = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (ID INTEGER PRIMARY KEY, "
+ "body VARCHAR,"
+ "name VARCHAR);";
try {
db.execSQL(createTableSQL);
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, TAG + "创表异常:" + e.toString());
} } @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}

结果:

Android-工作总结-LX-2018-08-20-判断数据库表字段是否为空的更多相关文章

  1. 判断数据库表字段是否为null值,采用is null

    use UserCentergo select * from AccountDetails1.判断一个字段是否为null值,进行查询:update AccountDetails set Project ...

  2. 2018.08.20 loj#116. 有源汇有上下界最大流(模板)

    传送门 貌似就是转成无源汇,然后两遍最大流搞定? 其实第二遍跑最大流是自动加上了第一次的答案. 代码: #include<bits/stdc++.h> #define N 100005 # ...

  3. 2018.08.20 loj#117. 有源汇有上下界最小流(模板)

    传送门 这题真有意思... 先是有一个点T的我怀疑人生. 然后学大佬们封装了我的dinic就莫名其妙的过了??? 所以说锅给谁好呢? 给dinic吧... 解法就是先求出一段可行流,然后从t到s加一条 ...

  4. 2018.08.20 bzoj1143: [CTSC2008]祭祀river(最长反链)

    传送门 一道简单的求最长反链. 反链简单来说就是一个点集,里面任选两个点u,v都保证从u出发到不了v且v出发到不了u. 链简单来说就是一个点集,里面任选两个点u,v都保证从u出发可以到达v或者v出发可 ...

  5. 2018.08.20 loj#115. 无源汇有上下界可行流(模板)

    传送门 又get到一个新技能,好兴奋的说啊. 一道无源汇有上下界可行流的模板题. 其实这东西也不难,就是将下界变形而已. 准确来说,就是对于每个点,我们算出会从它那里强制流入与流出的流量,然后与超级源 ...

  6. 在SQL Server 2018 Management Studio中修改表字段顺序

    有时我们可能需要为一个已存在的数据库表添加字段,并且想让这个字段默认排的靠前一些,这时就需要为表字段重新进行排序,默认情况下在Management Studio中调整顺序并保存时会提示“不允许保存更改 ...

  7. 判断mysql数据库表和表字段是否存在

    1.判断数据库表是否存在, // mysqlSELECT table_name FROM information_schema.tables WHERE table_name=#{tableName, ...

  8. 新手C#参数类型ref、out、params的学习2018.08.04

    ref用于传递参数时,将实参传递到函数中,是引用参数,在使用前必须被赋值.string类型也同样适用. static void Main(string[] args) { string a1,a2; ...

  9. 新手C#SQLServer在程序里实现语句的学习2018.08.12

    从C#中连接到SQL Server数据库,再通过C#编程实现SQL数据库的增删改查. ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据 ...

  10. 新手C#构造函数、继承、组合的学习2018.08.06/07

    构造函数,是一种特殊的方法.主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同 ...

随机推荐

  1. 黄聪:360浏览器、chrome开发扩展插件教程(1)开发Chrome Extenstion其实很简单

    转载:http://www.cnblogs.com/walkingp/archive/2011/03/31/2001628.html Chrome的更新速度可以说前无古人,现在我每天开机的第一件事就是 ...

  2. 给VS类文件添加默认头注释

    找到类文件所在路径:C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplatesCache\CSharp\ ...

  3. Ngnix常用的操作

    Nginx的常用参数如下: # /usr/local/nginx/sbin/nginx -h nginx version: nginx/0.7.63 Usage: nginx [-?hvVt] [-s ...

  4. React性能优化 PureComponent

    为什么使用? React15.3中新加了一个 PureComponent 类,顾名思义, pure 是纯的意思, PureComponent 也就是纯组件,取代其前身 PureRenderMixin  ...

  5. hive 创建/删除/截断 表(翻译自Hive wiki)

    这里罗列常用操作,更多参考 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL- ...

  6. 496. Next Greater Element I + 503. Next Greater Element II + 556. Next Greater Element III

    ▶ 给定一个数组与它的一个子列,对于数组中的一个元素,定义它右边第一个比他大的元素称为他的后继,求所给子列的后继构成的数组 ▶ 第 496 题,规定数组最后一个元素即数组最大元素的后继均为 -1 ● ...

  7. Selenium Webdriver——去哪儿网输入实例

    1.对出发地方和到达地方进行Xpath定位,这里采用了Xpath的text() 函数进行定位 用following::sibling选择当前元素后的兄弟元素,比如出发框的Xpath表达式如下: .// ...

  8. 可视化库-Matplotlib-Pandas与sklearn结合(第四天)

    1. 计算每一种的比例的百分比 import pandas as pd from matplotlib.ticker import FuncFormatter np.random.seed(0) df ...

  9. Eclipse can not find the tag library descriptor for http://java.sun.com/jsf/*

    问题页面: <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@ ta ...

  10. Maven(五)使用Nexus搭建Maven私服

    文章装载于:http://blog.csdn.net/jun55xiu/article/details/39497089 Nexus介绍 Nexus是Maven仓库管理器,如果你使用Maven,你可以 ...