Android-工作总结-LX-2018-08-20-判断数据库表字段是否为空
问题的因素:
调试了一上午,我要判断数据库表的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-判断数据库表字段是否为空的更多相关文章
- 判断数据库表字段是否为null值,采用is null
use UserCentergo select * from AccountDetails1.判断一个字段是否为null值,进行查询:update AccountDetails set Project ...
- 2018.08.20 loj#116. 有源汇有上下界最大流(模板)
传送门 貌似就是转成无源汇,然后两遍最大流搞定? 其实第二遍跑最大流是自动加上了第一次的答案. 代码: #include<bits/stdc++.h> #define N 100005 # ...
- 2018.08.20 loj#117. 有源汇有上下界最小流(模板)
传送门 这题真有意思... 先是有一个点T的我怀疑人生. 然后学大佬们封装了我的dinic就莫名其妙的过了??? 所以说锅给谁好呢? 给dinic吧... 解法就是先求出一段可行流,然后从t到s加一条 ...
- 2018.08.20 bzoj1143: [CTSC2008]祭祀river(最长反链)
传送门 一道简单的求最长反链. 反链简单来说就是一个点集,里面任选两个点u,v都保证从u出发到不了v且v出发到不了u. 链简单来说就是一个点集,里面任选两个点u,v都保证从u出发可以到达v或者v出发可 ...
- 2018.08.20 loj#115. 无源汇有上下界可行流(模板)
传送门 又get到一个新技能,好兴奋的说啊. 一道无源汇有上下界可行流的模板题. 其实这东西也不难,就是将下界变形而已. 准确来说,就是对于每个点,我们算出会从它那里强制流入与流出的流量,然后与超级源 ...
- 在SQL Server 2018 Management Studio中修改表字段顺序
有时我们可能需要为一个已存在的数据库表添加字段,并且想让这个字段默认排的靠前一些,这时就需要为表字段重新进行排序,默认情况下在Management Studio中调整顺序并保存时会提示“不允许保存更改 ...
- 判断mysql数据库表和表字段是否存在
1.判断数据库表是否存在, // mysqlSELECT table_name FROM information_schema.tables WHERE table_name=#{tableName, ...
- 新手C#参数类型ref、out、params的学习2018.08.04
ref用于传递参数时,将实参传递到函数中,是引用参数,在使用前必须被赋值.string类型也同样适用. static void Main(string[] args) { string a1,a2; ...
- 新手C#SQLServer在程序里实现语句的学习2018.08.12
从C#中连接到SQL Server数据库,再通过C#编程实现SQL数据库的增删改查. ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据 ...
- 新手C#构造函数、继承、组合的学习2018.08.06/07
构造函数,是一种特殊的方法.主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同 ...
随机推荐
- 【转】java中创建对象的方法
有4种显式地创建对象的方式: 1.用); System.out.println("call default constructor"); } public Customer(Str ...
- java web 程序---购物车项目内容:
1.项目介绍 典型电子商务系统(在线购物平台).模拟了当当系统部分功能.2.功能需求 1)用户管理模块(3天)user 实现登录.注册功能 2)产品浏览模块(2天)ma ...
- HDU 4762 Cut the Cake(高精度)
Cut the Cake Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- Bootstrap-CL:导航栏
ylbtech-Bootstrap-CL:导航栏 1.返回顶部 1. Bootstrap 导航栏 导航栏是一个很好的功能,是 Bootstrap 网站的一个突出特点.导航栏在您的应用或网站中作为导航页 ...
- mysql-6正则表达式
mysql正则表达式 匹配的两种方式: 1.模糊匹配:like 2.正则表达式 正则表达式语法: 语法 说明 ^ 起始位置.如果设置了RegExp对象的Multiline属性,^也匹配'\n'或'\r ...
- 自己动手实现RPC服务调用框架
转自:http://www.cnblogs.com/rjzheng/p/8971629.html#3977269 担心后面忘了,先转了,后面借鉴实现一下RPC -------------------- ...
- django2.0实现数据详情页展示的流程
思路整理 1 先在urls.py中,定义路由获取的格式 url(r'^detail/(\d+)/$', views.blog_detail), 2 然后在views.py,定义数据获取的方法 def ...
- 使用MVC实现登录功能
首先,从底层开始即Models: (1)通用数据访问类(封装数据访问类方法):SqlHelper类 使用命名空间:using System.Data; using System.Data.SqlCli ...
- 迷你MVVM框架 avalonjs 0.93发布
这段时间吸取@limodou, @东灵等人的意见,做了以下改进 重构isArrayLike,提高avalon.each的性能,原来avalon.each是依赖于isArrayLike来判定是循环普通对 ...
- Linux中shell变量$0,$?等含义
linux中shell变量$#,$@,$0,$1,$2的基本含义: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...