问题的因素:

调试了一上午,我要判断数据库表的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. WIN10下搭建react-native开发Android环境

    最近公司要求使用react-native进行移动端开发,据说macOS上开发坑会少的多,但我们是windows,莫法,直接抗吧!周末配置环境遇到很多问题,谨以此文做个记录... 准备 安装Chocol ...

  2. Linux操作系统多线程信号总结

    linux 多线程信号编程总结 linux 多线程信号总结(一) 1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函 ...

  3. C++ 实例化对象 p->printX()

    一.从栈实例化对象 我们首先定义一个类,类的名字叫TV,里面包括两个成员变量,两个成员函数. class TV // 定义一个电视的类TV { public: ]; // 定义类的属性,一个数组 in ...

  4. IPv4正则表达式匹配

    IP地址的长度为32位,分为4段,每段8位.用十进制数字表示,每段数字范围为0~255,段与段之间用英文句点“.”隔开.例如:某台计算机IP地址为111.22.33.4. 分析IP地址的组成特点:25 ...

  5. vconsole使用

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  6. C关系运算结果及逻辑运算结果保存

    http://service.exmail.qq.com/

  7. Httpservlet源码说明

    上一篇看了Servlet接口,现在来看下我们经常涉及的Httpservlet: /** * * Provides an abstract class to be subclassed to creat ...

  8. django多对多数据库建立 以及数据的传输 并进行增加 删除 修改

    多对多数据库的建立 class Host(models.Model): nid = models.AutoField(primary_key=True) #自增id hostname = models ...

  9. fekit 搭建

    sudo apt-get install npmsudo apt-get install nodejs 保证npm配置正确 sudo  npm config set registry http://r ...

  10. Node.js的优点和缺点(转载)

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:FengqiAsia链接:http://www.zhihu.com/question/19653241/answer/1599 ...