为什么会得到java.lang.IllegalArgumentException:在这种情况下,索引1处的绑定值为null?

为什么会得到java.lang.IllegalArgumentException:在这种情况下,索引1处的绑定值为null?,java,android,sqlite,android-activity,android-sqlite,Java,Android,Sqlite,Android Activity,Android Sqlite,我知道java.lang.IllegalArgumentException是什么意思:索引1处的bind值为null以及导致错误的原因。在我的案例中,我仍然无法找到这种错误的原因 那么,我打算实现什么呢? 我的SQLite数据库表中有4列。我想求每列的和,然后再求这四个结果的和。sum的行值根据用户从autoCompleteTextView中选择的产品名称进行过滤 我从哪里得到错误? 我的stackTrace说我在以游标c=db.query开头的行中得到错误。。。在下面的代码中。以下代码是我的a

我知道
java.lang.IllegalArgumentException是什么意思:索引1处的bind值为null
以及导致错误的原因。在我的案例中,我仍然无法找到这种错误的原因

那么,我打算实现什么呢?

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

我从哪里得到错误?

我的stackTrace说我在以游标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));
        }
    });
这是我的追踪

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: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
        }
    });
}
    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");
    }
}

我将尝试删除以下内容中的总和:新字符串[]{“sum(+VivzHelper.COLUMN\u ADD\u PURCHASE\u ITEM\u QUANTITY+”),
查看绑定是否有效。

itemName
addPurchaseQuantity()
调用中为
null
,因此当SQLite尝试使用它替换选择参数(“?”)时,您会收到此异常

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

编辑 您应该独立地测试每个方法,以便轻松地发现错误或bug。学习应用单元测试,如中所述


然后,您会发现问题被简化为从AutoCompleteTextView中获取文本值,您可以在那里找到大量的示例(例如)。

您可以显示
AddPurchase
类的
onCreate()
的代码吗?@TactMayer已经添加了您要求的代码您可以发布该方法吗,从调用的位置调用
addPurchaseQuantity()
method如果调用
addPurchaseQuantity(itemName)
inside
aggregateQty()
然后它将崩溃,因为用户仍然没有从AutoCompleteTextView中选择项。在选择项名称为空之前,它的意思是。@bharat已经在上面的描述中添加了更新02中要求的代码<代码>addPurchaseItemName.setOnItemClickListener(新的AdapterView.OnItemClickListener()用于将所选产品名称保存到
itemName
。但是您可能认为
itemName
为空是正确的。现在,我应该如何将所选产品名称分配给
itemName
,并将
itemName
用作各种方法的参数?删除总和后,我应该如何找到总和是的,我知道
itemName
的值为空,这就是异常的原因。这正是我的问题。我一直在尝试使用以下代码
itemName=String.valueOf将用户在
autoCompleteTextView
中选择的值分配给
itemName
(arg0.getItemAtPosition(arg2));
在onCreate()中如上所述。但由于某种原因,用户从
autoCompleteTextView
中选择的字符串值没有被分配到
itemName
。我哪里出错了?因此,您的问题与异常、sqlite等无关,而是与获取autoCompleteTextView的值有关。我不确定错误是否为due由于未能从autoCompleteTextView获取值或其他原因。我很抱歉。但您是否能够确定异常的原因?我已经尝试使用更新01中发布的setOnItemClickListener。此外,还尝试了您的(即)。但由于某些原因,我仍然将itemName的字符串值设置为NULL。我已经从web上查看了各种来源,但没有结果。似乎存在一些我无法识别的错误。如果这不是一个问题,请您查看Update 01并指出我错在哪里?
    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");
    }
}