java - 为什么我收到 java.lang.IllegalArgumentException : the bind value at index 1 is null in this case?

标签 java android sqlite android-activity android-sqlite

我知道 java.lang.IllegalArgumentException:索引 1 处的绑定(bind)值为 null 的含义以及导致错误的原因。就我的情况而言,我仍然无法找到此类错误的原因。

那么,我打算实现什么目标?

我的 SQLite 数据库表中有 4 列。我想找到每列的总和,然后再次找到这四个结果的总和。 sum 的行值根据用户从 autoCompleteTextView 中选择的产品名称进行过滤。

我在哪里收到错误?

我的 stackTrace 说我在下面的代码中以 Cursor c = db.query... 开头的行中收到错误。以下代码是我的 android 项目的 db 文件的一部分。

    public int addPurchaseQuantity(String itemName) {
    SQLiteDatabase db = helper.getReadableDatabase();
    int result = 0;
    String selection = VivzHelper.COLUMN_ADD_PURCHASE_ITEM_NAME + " =? ";
    String[] selectionArgs = {itemName};
    Cursor c = db.query(VivzHelper.ADD_PURCHASE_TABLE,
            new String[]{"sum(" + VivzHelper.COLUMN_ADD_PURCHASE_ITEM_QUANTITY + ")"},
            selection,
            selectionArgs,
            null,
            null,
            null);
    if (c.moveToFirst()) {
        result = c.getInt(0);
    }
    c.close();
    return result;
}

itemName是根据用户选择从autoCompleteTextView获取的。

        String[] autoCompleteName = vivzHelper.getInventoryNameFilterBySupplierName(vivzHelper.getSupplierID(param1));
    ArrayAdapter<String> NameAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, autoCompleteName);
    addPurchaseItemName.setThreshold(1);// starts working from first char
    addPurchaseItemName.setAdapter(NameAdapter);

    addPurchaseItemName.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            itemName = String.valueOf(arg0.getItemAtPosition(arg2));
        }
    });

我的 stackTrace 还指向 java Activity 文件的以下代码。

int purchaseQty = vivzHelper.addPurchaseQuantity(itemName);

这是我的堆栈跟踪

04-21 00:09:58.274  21975-21975/com.example.bharathduraiswamy.comboedittext E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bharathduraiswamy.comboedittext/com.example.bharathduraiswamy.comboedittext.AddPurchase}: java.lang.IllegalArgumentException: the bind value at index 1 is null
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2313)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2365)
        at android.app.ActivityThread.access$600(ActivityThread.java:156)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:153)
        at android.app.ActivityThread.main(ActivityThread.java:5336)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.IllegalArgumentException: the bind value at index 1 is null
        at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:164)
        at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200)
        at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
        at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
        at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161)
        at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
        at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200)
        at com.example.bharathduraiswamy.comboedittext.VivzDatabaseAdapter.addPurchaseQuantity(VivzDatabaseAdapter.java:2011)
        at com.example.bharathduraiswamy.comboedittext.AddPurchase.aggregateQty(AddPurchase.java:531)
        at com.example.bharathduraiswamy.comboedittext.AddPurchase.onCreate(AddPurchase.java:133)
        at android.app.Activity.performCreate(Activity.java:5122)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2277)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2365)
        at android.app.ActivityThread.access$600(ActivityThread.java:156)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:153)
        at android.app.ActivityThread.main(ActivityThread.java:5336)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
        at dalvik.system.NativeStart.main(Native Method)

有人可以告诉我我到底哪里出了问题吗?

更新 01:添加了 AddPurchase Activity 中的 onCreate()

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.add_purchase);

    // Set a toolbar to replace the action bar
    Toolbar myToolbar = (Toolbar) findViewById(R.id.toolbar_addPurchase);
    setSupportActionBar(myToolbar);
    myToolbar.setNavigationIcon(R.drawable.logo);

    //Disable the Toolbar Title
    getSupportActionBar().setDisplayShowTitleEnabled(false);

    // Adding UP icon for Setting Activity
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    SharedPreferences myPreferences = getSharedPreferences("sharedSupplierData", Context.MODE_PRIVATE);
    param1 = myPreferences.getString("sharedSupplierName", DEFAULT);
    if (param1.equals(DEFAULT)) {
        Message.message(this, "No data was found");
    }

    addPurchaseItemName = (AutoCompleteTextView) findViewById(R.id.addPurchaseProductName);
    addPurchaseItemQty = (EditText) findViewById(R.id.addPurchaseProductQuantity);
    addPurchaseCostPrice = (EditText) findViewById(R.id.addPurchaseCostPrice);
    addPurchaseSalePrice = (EditText) findViewById(R.id.addPurchaseSalePrice);
    myDate = (TextView) findViewById(R.id.addPurchaseDatum);
    purchaseSum = (TextView) findViewById(R.id.addPurchaseSum);
    primarySpinner = (Spinner) findViewById(R.id.toolbar_spinner);
    vivzHelper = new VivzDatabaseAdapter(this);

    showDialogOnButtonClick();
    populateListView();

    String[] autoCompleteName = vivzHelper.getInventoryNameFilterBySupplierName(vivzHelper.getSupplierID(param1));
    ArrayAdapter<String> NameAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, autoCompleteName);
    addPurchaseItemName.setThreshold(1);// starts working from first char
    addPurchaseItemName.setAdapter(NameAdapter);

    addPurchaseItemName.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            itemName = String.valueOf(arg0.getItemAtPosition(arg2));
        }
    });

    Message.message(this, ("Item Name  = " + itemName));

    aggregateQty();

    //Initializing an Adapter
    ArrayAdapter<String> toolbar_adapter = new ArrayAdapter<>(
            this, android.R.layout.simple_spinner_dropdown_item, primarySpinner_array);
    //Providing the Resource xml for Drop down Layout
    toolbar_adapter.setDropDownViewResource(R.layout.custom_simple_spinner_dropdown_item);
    primarySpinner.setAdapter(toolbar_adapter);

    //Setting a default Spinner value before onItemClick
    primarySpinner.setSelection(0);
    //Initializing an OnItemClick Listener for Spinner Item
    primarySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            int position_toolbar = primarySpinner.getSelectedItemPosition();

            //Changing Spinner TextSize and Text Color
            ((TextView) arg0.getChildAt(0)).setTextColor(Color.WHITE);
            ((TextView) arg0.getChildAt(0)).setTextSize(20);
            //Changing Spinner Pointer Color - partially effective
            primarySpinner.getBackground().setColorFilter(getResources().getColor(R.color.White), PorterDuff.Mode.SRC_ATOP);

            //Using Switch to move to other Activities
            Intent intent_spinner;
            switch (arg2) {
                case 1:
                    intent_spinner = new Intent(AddPurchase.this, SupplierDues.class);
                    AddPurchase.this.startActivity(intent_spinner);
                    break;
                case 2:
                    intent_spinner = new Intent(AddPurchase.this, SupplierReturns.class);
                    AddPurchase.this.startActivity(intent_spinner);
                    break;
                case 3:
                    intent_spinner = new Intent(AddPurchase.this, SupplierBalanceSheet.class);
                    AddPurchase.this.startActivity(intent_spinner);
                    break;
                case 4:
                    intent_spinner = new Intent(AddPurchase.this, AddSupplier.class);
                    AddPurchase.this.startActivity(intent_spinner);
                    break;
                default:
                    break;
            }
            //Changing Spinner Pointer Color - partially effective
            primarySpinner.getBackground().setColorFilter(getResources().getColor(R.color.White), PorterDuff.Mode.SRC_ATOP);
            //Setting a default Spinner value after onItemClick
            primarySpinner.setSelection(0);
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
        }
    });
}

更新 02:调用 addPurchaseQuantity() 时的aggregateQty()

    public void aggregateQty() {

    int purchaseQty = vivzHelper.addPurchaseQuantity(itemName);
    int saleQty = vivzHelper.addSaleQuantity(itemName);
    int supplierRtnQty = vivzHelper.returnedToSupplierQuantity(itemName, rtnPrice);
    int supplierRtnScrapQty = vivzHelper.returnedToSupplierForScrapQuantity(itemName, rtnPrice);
    int customerRtnQty = vivzHelper.returnedByCustomerQuantity(itemName, rtnPrice);

    if (itemName.length() != 0) {
        availableQuantity = String.valueOf(purchaseQty - saleQty - supplierRtnQty - supplierRtnScrapQty + customerRtnQty);
        addPurchaseItemQty.setHint(availableQuantity);

        Message.message(this, ("Item Name  = " + itemName + "\n" +
                "Purchase Quantity = " + purchaseQty + "\n" +
                "Sale Quantity = " + saleQty + "\n" +
                "Supplier Return Quantity = " + supplierRtnQty + "\n" +
                "Customer Return Quantity = " + customerRtnQty));

    } else {
        Message.message(this, "Please Select an Item");
    }
}

最佳答案

itemNameaddPurchaseQuantity() 调用中为 null,因此当 SQLite 尝试使用它来替换选择参数('?' )您收到此异常。

尝试将 itemName 设置为已知值并检查结果。

编辑

您应该独立测试每个方法,以便可以轻松发现错误或错误。学习如何应用单元测试,如 Testing Fundamentals 中所述。 .

然后,您会发现问题减少了,可以从 AutoCompletTextView 获取文本值,您可以在其中找到大量示例(即 How to get string text from AutoCompleteTextView? )。

关于java - 为什么我收到 java.lang.IllegalArgumentException : the bind value at index 1 is null in this case?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29762009/

相关文章:

java - 使用 Guice 在对象图中构建特定类

java - 如何使用java在资源组中创建IoTHub资源?

android - 是否可以使用 SonarQube 分析 Android Kotlin 代码覆盖率?

Android - 从听筒播放音频

android - 如何测试 android 应用程序的网络错误?

c# - SQLite 的 DLL hell

sql - 如何在 SQLite 中折叠结果集?

java - 为什么我通过 Bazel 构建的应用程序在添加 Firebase 依赖项后一打开就会崩溃?

java - 为什么这个排序不起作用

ruby - Sqlite3 在 irb 中可用,但在 Mac OS X Lion 上的 ruby​​ 中不可用