问题的因素:

调试了一上午,我要判断数据库表的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. centos7开发环境配置总结

    1.win10下SecureCRT SSH连接慢 2.CentOS 7下Samba服务器的安装与配置 3.

  2. 原生态Vim使用快捷键

    我的第一篇博客,凌晨2点加班不想睡,随便写点.本人菜鸟一个,努力学习,争取成为大神.. 第一篇写点什么东西呢,我目前是搞运维的,俗话说"工欲善其事必先利其器",Vim作为最基本的工 ...

  3. ul li的添加 删除 复制 clone()

    语法总结 li=document.createElement('li') li.innerText = tag $('#i1').append(li) $(..).clone()  复制整个文本和Ht ...

  4. Spring Boot实践——基础和常用配置

    借鉴:https://blog.csdn.net/j903829182/article/details/74906948 一.Spring Boot 启动注解说明 @SpringBootApplica ...

  5. 【C】常用的字符串函数

    1. strcpy 函数名:strcpy 用法:char *strcpy(char *destin, char *cource) 功能:将一个字符串从一个拷贝到另外一个 程序示例: #include ...

  6. VMware Workstation 虚拟机的服务启动项

  7. 04-SSH综合案例:环境搭建之jar包引入

    刚才已经把表关系的分析已经分析完了,现在呢就先不去创建这个表,写到哪儿的时候再去创建这个表. 1.4 SSH环境搭建: 1.4.1 第一步:创建一个web项目. 1.4.2 第二步:导入相应jar包. ...

  8. loadrunner12--学习中遇到疑问及解释

    1.analysis里面,平均事务响应时间,平均事务响应时间+运行vuser,两个图的数据有区别是什么原因? 答: 请仔细查看以下两张图,其实两张图的数据是没有区别的. 之所以我们认为他们二者的数据有 ...

  9. error:while loading shared libraries: libevent-2.1.so.6: cannot open shared object file: No such file or directory

    执行 memcached 启动命令时,报错,提示:error while loading shared libraries: libevent-2.1.so.6: cannot open shared ...

  10. [OS]windows 2012 server-Local users and groups-Backup Operators

    怎样找到windows 2012 server上的Backup Operators Press the Windows + R keys to open the Run dialog, type lu ...