在db中插入时出现空指针异常

时间:2011-08-05 10:57:01

标签: android

我遇到一个问题,当我们想要将数据插入数据库表时,它会返回NullPointer异常为“Failure deliver result resultInfo”。 我不知道它为什么会被删除?

请建议我解决这个问题。

错误Srtack:

08-05 16:18:39.816: ERROR/AndroidRuntime(5045): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { act=com.google.zxing.client.android.SCAN flg=0x80000 (has extras) }} to activity {com.shopzilla.android.common/com.shopzilla.android.common.MainActivity}: java.lang.NullPointerException
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3515)
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557)
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     at android.app.ActivityThread.access$2800(ActivityThread.java:125)
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063)
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     at android.os.Looper.loop(Looper.java:123)
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     at android.app.ActivityThread.main(ActivityThread.java:4627)
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     at java.lang.reflect.Method.invokeNative(Native Method)
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     at java.lang.reflect.Method.invoke(Method.java:521)
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     at dalvik.system.NativeStart.main(Native Method)
08-05 16:18:39.816: ERROR/AndroidRuntime(5045): Caused by: java.lang.NullPointerException
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     at com.shopzilla.android.common.MainActivity.onActivityResult(MainActivity.java:210)
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     at android.app.Activity.dispatchActivityResult(Activity.java:3890)
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
08-05 16:18:39.816: ERROR/AndroidRuntime(5045):     ... 11 more

代码:

package com.shopzilla.android.common;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.LinearGradient;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.flurry.android.FlurryAgent;
import com.shopzilla.android.client.dto.ProductSearchRequest;
import com.shopzilla.android.client.model.BaseInventoryItem;
import com.shopzilla.android.client.model.CatalogResponse;
import com.shopzilla.android.product.ProductComparisonActivity;
import com.shopzilla.android.search.SearchResultActivity;
import java.util.ArrayList;
import java.util.Locale;

public class MainActivity extends Activity {
    /**
     * Called when the activity is first created.
     */
    private LocationManager locationManager;
    private Location currentLocation;
    static ArrayList<String> recent = new ArrayList<String>();
    SQLiteDatabase db;
    static String keyword;
    EditText txt_search;
    public static Boolean zipcode = false;
    public static String zip = "";
    String lat;
    String longi;
    public static String status = "";
    Dialog dialog;
    public static int count = 0;
    ContentValues values;
    private static final String CREATE_RECENT_BARCODE_TABLE = "create table if not exists recentbarcode(prod TEXT,status TEXT,image TEXT);";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btn = (Button) findViewById(R.id.btn_Search);
        Button btn_scanbar = (Button) findViewById(R.id.btn_ScanBar);
        txt_search = (EditText) findViewById(R.id.txt_Search);

        //Create Favorites DataBase
        final SQLiteDatabase db = openOrCreateDatabase("recentsearches2.db", SQLiteDatabase.CREATE_IF_NECESSARY, null);
        db.setVersion(1);
        db.setLocale(Locale.getDefault());
        db.setLockingEnabled(true);
        db.execSQL(CREATE_RECENT_BARCODE_TABLE);
        values = new ContentValues();

        if (count == 0) {
            showDialog(0);
        }
        //Open Search Result Activity
        btn.setOnClickListener(new View.OnClickListener() {

            public void onClick(View arg0) {

                recent.add(txt_search.getText().toString());
                keyword = txt_search.getText().toString();
                if (!keyword.equals("")) {
                    Intent intent = new Intent(MainActivity.this, SearchResultActivity.class);
                    intent.putExtra("keyword", txt_search.getText().toString());
                    startActivity(intent);
                } else {
                    Toast.makeText(MainActivity.this, "Please Enter a Search Text in a Search Box.", Toast.LENGTH_SHORT).show();
                }

            }
        });
        //Open Scan BarCode Activity
        btn_scanbar.setOnClickListener(new View.OnClickListener() {

            public void onClick(View arg0) {
                try {
                    Intent intent = new Intent("com.google.zxing.client.android.SCAN");
                    intent.setPackage("com.google.zxing.client.android");
                    intent.putExtra("SCAN_MODE", "PRODUCT_MODE");
                    startActivityForResult(intent, 0);
                } catch (Exception e) {
                    AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
                    alertDialog.setTitle("BIZRATE");
                    alertDialog.setMessage("Download BarCode Scanner App!!");
                    alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            Intent viewIntent =
                                    new Intent("android.intent.action.VIEW",
                                            Uri.parse("https://market.android.com/details?id=com.google.zxing.client.android"));
                            startActivity(viewIntent);

                            return;
                        }
                    });
                    alertDialog.setButton2("Cancel", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            return;
                    } });
                    alertDialog.show();
                }

            }
        });

        //Geo Coding

        this.locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        // Subscribe to the location manager's updates on the current location
        this.locationManager.requestLocationUpdates("gps", (long) 30000, (float) 10.0, new LocationListener() {
            public void onLocationChanged(Location arg0) {
                handleLocationChanged(arg0);
            }

            public void onProviderDisabled(String arg0) {

            }

            public void onProviderEnabled(String arg0) {

            }

            public void onStatusChanged(String arg0, int arg1, Bundle arg2) {

            }
        });

        txt_search.setOnEditorActionListener(new EditText.OnEditorActionListener() {

            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

                if (actionId == EditorInfo.IME_ACTION_DONE) {
                    recent.add(txt_search.getText().toString());
                    keyword = txt_search.getText().toString();
                    if (!keyword.equals("")) {
                        Intent intent = new Intent(MainActivity.this, SearchResultActivity.class);
                        intent.putExtra("keyword", txt_search.getText().toString());
                        startActivity(intent);
                    } else {
                        Toast.makeText(MainActivity.this, "Please Enter a Search Text in a Search Box.", Toast.LENGTH_SHORT).show();
                    }

                }
                return false;
            }
        });
    }

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == 0) {
            if (resultCode == RESULT_OK) {

                String contents = intent.getStringExtra("SCAN_RESULT");
                String format = intent.getStringExtra("SCAN_RESULT_FORMAT");

                // perform the barcode search immediately after getting the scan
                ProductSearchRequest barcodeSearch = ProductSearchRequestFactory.createProductSearchRequest();
                barcodeSearch.setProductId(contents);
                barcodeSearch.setZipCode("90291");
                barcodeSearch.setResultsOffers(25);
                CatalogResponse barcodeResponse = CatalogServiceLocator.getCatalogAPIClient().performSearch(barcodeSearch);
                BaseInventoryItem item = null;

                // check to see if the searched scan returned an offer
                if(barcodeResponse.getOffers() != null && !barcodeResponse.getOffers().isEmpty()){
                    item = barcodeResponse.getOffers().get(0);
                }
                // check to see if the searched scan returned a product
                if(barcodeResponse.getProducts() != null && !barcodeResponse.getProducts().isEmpty()){
                    item = barcodeResponse.getProducts().get(0);
                }
                if(item != null) {
                    // Send the user directly to product comparison activity, with the item returned by the scan
                    Intent searchIntent = new Intent(MainActivity.this, ProductComparisonActivity.class);
                    searchIntent.putExtra("item", item);
                    startActivity(searchIntent);
                    /* values = new ContentValues();*/
                     values.put("prod",contents);
                     values.put("status","Product Found");
                     values.put("image",item.getImageUrl(60));

                } else {
                    Toast.makeText(MainActivity.this, "Product Not Found on Bizrate", Toast.LENGTH_SHORT).show();
                    /* values = new ContentValues();*/
                     values.put("prod",contents);
                     values.put("status","Product Not Found");
                     values.put("image","");
                     long id = db.insert("recentbarcode",null,values); //-----------> Here is the Problem
                }
              /*  long id = db.insert("recentbarcode",null,values);
                db.close();*/
            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(MainActivity.this, "Scan Cancelled.", Toast.LENGTH_SHORT).show();
            }
        }

    }

    private void handleLocationChanged(Location loc) {
        // Save the latest location
        this.currentLocation = loc;
        // Update the latitude & longitude TextViews
        lat = Double.toString(loc.getLatitude());
        longi = Double.toString(loc.getLongitude());
    }

    private void handleReverseGeocodeClick() {
        if (this.currentLocation != null) {
            // Kickoff an asynchronous task to fire the reverse geocoding
            // request off to google
            ReverseGeocodeLookupTask task = new ReverseGeocodeLookupTask();
            task.applicationContext = this;
            task.execute();
        } else {
            // If we don't know our location yet, we can't do reverse
            // geocoding - display a please wait message
            showToast("Please wait until we have a location fix from the gps");
        }
    }

    public void showToast(CharSequence message) {
        int duration = Toast.LENGTH_SHORT;

        Toast toast = Toast.makeText(getApplicationContext(), message, duration);
        toast.show();
    }

    public class ReverseGeocodeLookupTask extends AsyncTask<Void, Void, String> {
        private ProgressDialog dialog;
        protected Context applicationContext;

        @Override
        protected void onPreExecute() {
            this.dialog = ProgressDialog.show(applicationContext, "Please wait...contacting the tubes.",
                    "Requesting reverse geocode lookup", true);
        }

        @Override
        protected String doInBackground(Void... params) {
            String localityName = "";

            if (currentLocation != null) {
                localityName = Geocoder.reverseGeocode(currentLocation);
            }

            return localityName;
        }

        @Override
        protected void onPostExecute(String result) {
            //this.dialog.cancel();
            zip = result;
            dialog.dismiss();

        }
    }

    protected Dialog onCreateDialog(int id) {
        switch (id) {
            case 0:
                count = 1;
                dialog = new Dialog(this);
                //dialog.setTitle("");
                dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                dialog.setContentView(R.layout.geocode);
                dialog.show();

                Button btn_getGeo = (Button) dialog.findViewById(R.id.btn_Geo_Ok);
                Button btn_cancel = (Button) dialog.findViewById(R.id.btn_Geo_cancel);
                btn_getGeo.setOnClickListener(new View.OnClickListener() {

                    public void onClick(View arg0) {

                        zipcode = true;
                        handleReverseGeocodeClick();
                        //dialog.dismiss();
                        removeDialog(0);
                    }
                });

                btn_cancel.setOnClickListener(new View.OnClickListener() {

                    public void onClick(View arg0) {

                        removeDialog(0);
                    }
                });

                break;
        }
        return dialog;
    }

    //Flurry Implementation
    public void onStart() {
        super.onStart();
        FlurryAgent.onStartSession(this, "AJT5DWUVF6IAE78NQV69");
        // your code
    }

    public void onStop() {
        super.onStop();
        FlurryAgent.onEndSession(this);
        // your code
    }
}

1 个答案:

答案 0 :(得分:0)

在onActivityResult()中,您取消引用“intent”。我没有看到对setResult(int resultCode,intent数据)的调用,在这里你应该传回一个intent作为传递结果的方法。