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单例模式等一些程序的写法....持续更新...
一.单例模式的写法: public class MyFactory { /** * 饿汉式 */ private static MyFactory instance = new MyFactory() ...
- springboot中filter的用法
一.在spring的应用中我们存在两种过滤的用法,一种是拦截器.另外一种当然是过滤器.我们这里介绍过滤器在springboot的用法,在springmvc中的用法基本上一样,只是配置上面有点区别. 二 ...
- mysql 8.0 初识
1 下载并安装mysql 8.0官网下载比较慢,这里选择163的镜像http://mirrors.163.com/mysql/Downloads/MySQL-8.0/下载版本mysql-8.0.14- ...
- 225. Implement Stack using Queues + 232. Implement Queue using Stacks
▶ 栈和队列的相互表示.发现内置的队列和栈结构都十分高效,相互表示后性能损失都很小. ▶ 第 225 题,用队列实现栈 ● 自己的代码,3 ms,单队列实现,入栈 O(1),读取栈顶元素 O(n),出 ...
- fastjson数据格式转换 SerializerFeature属性详解
SerializerFeature属性 名称 含义 备注 QuoteFieldNames 输出key时是否使用双引号,默认为true UseSingleQuotes 使用单引号而不是双引号,默认为 ...
- 想取得刚才nextval()的值时,放心大胆的用currval()吧,currval()的返回值并不会因为nextval()的并发访问而混乱
以前写sql的时候总是担心current()得到的值并不会绝对等于我上一次nextval()取得的值;因为可能其他线程并发访问nextval(). 先说结论吧:当你拿到一个数据库连接,先nextval ...
- JSON.parse() 方法解析一个JSON字符串
JSON.parse() 方法解析一个JSON字符串,构造由字符串描述的JavaScript值或对象.可以提供可选的reviver函数以在返回之前对所得到的对象执行变换. 语法EDIT JSON.pa ...
- open File Browser in shell
[maxosx] open /usr/include [ubuntu] 发现三个,如下: xdg-open xxxx.pdf gnome-open . nautilus . 喜欢把它alias一下 . ...
- Django基础学习五_引入静态文件
今天继续学习Django,今天主要掌握两个小点 一.如果为Django项目中引入静态文件 1.先要在project目录下创建static的目录,然后将jquery文件拷贝这个目录下就可以了 2.在pr ...
- 深入剖析java的try…catch…finally语句
一.前言 前些天参加面试的时候有一道题: public class test { public static void main(String[] args){ try { return; } fin ...