簡體   English   中英

android Studio 上的 Edittext 建議

[英]Edittext Suggestion on android Studio

幫助我如何從 AutocompleteTextview 修復此代碼我看不到這部分的錯誤代碼

 final String [] myData =  myDB.SelectAllData();

 final AutoCompleteTextView autoCom = (AutoCompleteTextView)findViewById(R.id.TVresult);
 final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.select_dialog_singlechoice,myData);
    autoCom.setAdapter(adapter);

和這部分

public String[] SelectAllData() {


    try {
        String ArrayData[] = null;
        SQLiteDatabase db;
        db = this.getReadableDatabase(); // Read Data

        String strSQL = "SELECT  * FROM " + DB_TABLE_NAME;
        Cursor cursor = db.rawQuery(strSQL, null);

        if(cursor != null)
        {
            if (cursor.moveToFirst()) {
                ArrayData = new String[cursor.getCount()];
                /***
                 *  [x] = Name
                 */
                int i= 0;
                do {
                    ArrayData[i] = cursor.getString(0);
                    i++;
                } while (cursor.moveToNext());

            }
        }
        cursor.close();

        return ArrayData;

    } catch (Exception e) {
        return null;
    }

}

這是我的 MainActivity 代碼

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    resulttext = (TextView) findViewById(R.id.TVresult);
    rescebu = (TextView) findViewById(R.id.english);
    trans = (Button) findViewById(R.id.translate);
    respam = (TextView) findViewById(R.id.tagalog);
    resilo = (TextView) findViewById(R.id.vis);
    resbik = (TextView) findViewById(R.id.ilonngo);
    myDB = new DatabaHelper(this);
    tts = new TextToSpeech(this, this);
    final String [] myData =  myDB.SelectAllData();

    final AutoCompleteTextView autoCom = (AutoCompleteTextView)findViewById(R.id.TVresult);
    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.select_dialog_singlechoice,myData);
    autoCom.setAdapter(adapter);
    autoCom.setThreshold(1);
    autoCom.setTextColor(Color.RED);

這是 Dabasehelper 和 SelectAllData 方法

public class DatabaHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "translator4.sqlite";
private static final String DB_TABLE_NAME = "wews";
public DatabaHelper(Context context) {

    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {

}

public Cursor getAllData(String English, String Tagalog, String Visaya, String Ilonggo) {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("select * from wews where English like '" + English + "' or Tagalog like '" + Tagalog + "' or Visayan like '" + Visaya + "' or Ilonggo like '" + Ilonggo + "';", null);

    return res;
}


@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

}


public String[] SelectAllData() {


    try {
        String ArrayData[] = null;
        SQLiteDatabase db;
        db = this.getReadableDatabase(); // Read Data

        String strSQL = "SELECT  * FROM " + DB_TABLE_NAME;
        Cursor cursor = db.rawQuery(strSQL, null);

        if(cursor != null)
        {
            if (cursor.moveToFirst()) {
                ArrayData = new String[cursor.getCount()];
                /***
                 *  [x] = Name
                 */
                int i= 0;
                do {
                    ArrayData[i] = cursor.getString(0);
                    i++;
                } while (cursor.moveToNext());

            }
        }
        cursor.close();

        return ArrayData;

    } catch (Exception e) {
        return null;
    }

}

這是日志 LogCat

Process: application.example.com.myapplication, PID: 20663
                                                                                           Theme: themes:{default=overlay:system, iconPack:system, fontPkg:system, com.android.systemui=overlay:system, com.android.systemui.navbar=overlay:system}
                                                                                           java.lang.RuntimeException: Unable to start activity ComponentInfo{application.example.com.myapplication/application.example.com.myapplication.MainActivity}: java.lang.NullPointerException: storage == null
                                                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2462)
                                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2522)
                                                                                               at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363)
                                                                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                               at android.os.Looper.loop(Looper.java:148)
                                                                                               at android.app.ActivityThread.main(ActivityThread.java:5475)
                                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                                               at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:102)
                                                                                            Caused by: java.lang.NullPointerException: storage == null
                                                                                               at java.util.Arrays$ArrayList.<init>(Arrays.java:38)
                                                                                               at java.util.Arrays.asList(Arrays.java:155)
                                                                                               at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:137)
                                                                                               at application.example.com.myapplication.MainActivity.onCreate(MainActivity.java:56)
                                                                                               at android.app.Activity.performCreate(Activity.java:7125)
                                                                                               at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
                                                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2415)
                                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2522) 
                                                                                               at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
                                                                                               at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                               at android.os.Looper.loop(Looper.java:148) 
                                                                                               at android.app.ActivityThread.main(ActivityThread.java:5475) 
                                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                                                                                               at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:102)

由於您錯過了在 do...while 循環中創建字符串對象ArrayData[i] = new String() ,因此可能對此代碼塊進行了修改。

public String[] SelectAllData() {


    try { 
        String ArrayData[] = null;
        SQLiteDatabase db;
        db = this.getReadableDatabase(); // Read Data

        String strSQL = "SELECT  * FROM " + DB_TABLE_NAME;
        Cursor cursor = db.rawQuery(strSQL, null);

        if(cursor != null)
        { 
            if (cursor.moveToFirst()) {
                ArrayData = new String[cursor.getCount()];
                /*** 
                 *  [x] = Name 
                 */ 
                int i= 0;
                do { 
                    ArrayData[i] = new String();
                    ArrayData[i] = cursor.getString(0);
                    i++;
                } while (cursor.moveToNext());

            } 
        } 
        cursor.close();

        return ArrayData;

    } catch (Exception e) {
        return null; 
    } 

}

我建議改變:-

public String[] SelectAllData() {


    try {
        String ArrayData[] = null;
        SQLiteDatabase db;
        db = this.getReadableDatabase(); // Read Data

        String strSQL = "SELECT  * FROM " + DB_TABLE_NAME;
        Cursor cursor = db.rawQuery(strSQL, null);

        if(cursor != null)
        {
            if (cursor.moveToFirst()) {
                ArrayData = new String[cursor.getCount()];
                /***
                 *  [x] = Name
                 */
                int i= 0;
                do {
                    ArrayData[i] = cursor.getString(0);
                    i++;
                } while (cursor.moveToNext());

            }
        }
        cursor.close();

        return ArrayData;

    } catch (Exception e) {
        return null;
    }

}

到 :-

public String[] SelectAllData() {

    try {
        String ArrayData[];
        SQLiteDatabase db;
        db = this.getReadableDatabase(); // Read Data

        String strSQL = "SELECT  * FROM " + DB_TABLE_NAME;
        Cursor cursor = db.rawQuery(strSQL, null);

        ArrayData = new String[cursor.getCount()];
        int i = 0;
        while (cursor.moveToNext()) {
            ArrayData[i++] = cursor.getString(0);
            //ArrayData[cursor.getPosition()] = cursor.getString(0); //Could be an alternative
        }
        cursor.close();

        return ArrayData;

    } catch (Exception e) {
        return new String[0];
    }
}

簡而言之,檢查空游標是沒有用的,它並不表示沒有數據,而是在沒有數據時返回計數為 0 的空游標。

因此,當沒有數據時cursor.moveToFirst將是false並且if任何代碼都不會被執行。 因此 ArrayData 將為空(空指針異常的可能原因)。

如果沒有數據或者在 try 塊中捕獲了另一個異常,修改后的代碼將返回一個空數組(0 個元素)。

您還可以通過使用cursor.getPosition()來取消使用計數器/索引,這實際上是相同的(根據注釋掉的行)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM