2011-08-05 94 views
0

我有一個問題,當我們想要插入數據到數據庫表時,它返回一個空指針異常作爲「Failure deliver result resultInfo」。 我不知道它爲什麼會被刪除?在db中插入空指針異常

請建議我解決這個問題。

錯誤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 
    } 
} 
+0

我認爲有一個概率。與ypur db ....是完全創建? – Hanry

+0

如何檢查我的數據庫是否完美創建? –

+0

來自DDMS,你可以通過eclipse插件看到它: 它可以在>> coderzheaven.com/2011/04/sqlitemanager-plugin-for-eclipse/ – Hanry

回答

0

在onActivityResult()你提領 「意圖」。我沒有看到對setResult(int resultCode,意圖數據)的調用,您應該將回傳意圖作爲傳回結果的方式。