Android-工作總結-LX-2018-08-20-判斷資料庫表字段是否為空
阿新 • • 發佈:2018-12-23
問題的因素:
除錯了一上午,我要判斷資料庫表的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) { } } }
結果: