1. 程式人生 > >Android-工作總結-LX-2018-08-20-判斷資料庫表字段是否為空

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) {
        }
    }
}

結果: