2013-06-05 36 views
3

嘿,我是創建Android應用程序的一個小菜鳥,這只是我的第二個。我需要創建一個應用程序來掃描條形碼並將信息保存到數據庫中。使用zxing條碼掃描器添加數據到數據庫問題創建產品數據庫問題

我使用zxing條碼掃描器和Sqllite數據庫創建了一個產品數據庫,如本文Zxing app and SQLite database。但是,當我填充產品表單後點擊添加產品按鈕。一個消息框說我的應用程序不幸停止彈出。掃描和填充工程,但我不認爲數據庫操作的作品。

這裏是我的頁面,用於添加產品表單和數據庫操作。

StartMenu.java

package com.example.barcodedatabaseapp; 

import java.math.BigDecimal; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class StartMenu extends Activity { 

    static final class ProductData { 
     String barcode; 
     String format; 
     String title; 
     String Others; 
     BigDecimal Price; 
     } 

     @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_start_menu); 
     Button addButton=(Button) findViewById(R.id.button1); 
     addButton.setOnClickListener(new OnClickListener(){ 
       public void onClick(View v) 
       { 
       startActivity(new Intent(StartMenu.this,AddProduct.class)); 
       } 

      }); 

    } 


} 

AddProduct.java

package com.example.barcodedatabaseapp; 

import java.math.BigDecimal; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 

import com.example.barcodeda tabaseapp.StartMenu.ProductData; 

public class AddProduct extends Activity implements OnClickListener {   

    private static final int REQUEST_BARCODE = 0; 
    private static final ProductData mProductData = new ProductData(); 
    EditText mBarcodeEdit; 
    EditText mFormatEdit; 
    EditText mTitleEdit; 
    EditText mPriceEdit; 
    private Button mScanButton; 
    private Button mAddButton; 
    ProductDatabase mProductDb; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_add_product); 
    mBarcodeEdit = (EditText) findViewById(R.id.barcodeEdit); 
     mFormatEdit = (EditText) findViewById(R.id.codeFormatEdit); 
     mTitleEdit = (EditText) findViewById(R.id.titleEdit); 
     mPriceEdit = (EditText) findViewById(R.id.priceEdit); 
     mScanButton = (Button) findViewById(R.id.scanButton); 
     mScanButton.setOnClickListener(this); 
     mAddButton = (Button) findViewById(R.id.addButton2); 
     mAddButton.setOnClickListener(this); 

} 
    public void onClick(View v) { 

       switch (v.getId()) { 
       case R.id.scanButton: 
        Intent intent = new Intent("com.google.zxing.client.android.SCAN"); 
        intent.putExtra("SCAN_MODE", "PRODUCT_MODE"); 
        startActivityForResult(intent, REQUEST_BARCODE); 
        break; 


       case R.id.addButton2: 
        String barcode = mBarcodeEdit.getText().toString(); 
        String format = mFormatEdit.getText().toString(); 
        String title = mTitleEdit.getText().toString(); 
        String price = mPriceEdit.getText().toString(); 

        String errors = validateFields(barcode, format, title, price); 
        if (errors.length() > 0) { 
         showInfoDialog(this, "Please fix errors", errors); 
        } else { 
         mProductData.barcode = barcode; 
         mProductData.format = format; 
         mProductData.title = title; 
         mProductData.Price = new BigDecimal(price); 

        mProductDb.insert(mProductData); 
         showInfoDialog(this, "Success", "Product saved successfully"); 
         resetForm(); 
        } 
        break; 
       } 
    } 

    private void showInfoDialog(Context context, String title, String information) { 
     new AlertDialog.Builder (context) 
     .setMessage(information) 
     .setTitle(title) 
     .setPositiveButton("OK", new DialogInterface.OnClickListener() { 


      public void onClick(DialogInterface dialog, int which) { 
       dialog.dismiss(); 

      } 
     }).show(); 
    } 
    private void resetForm() { 
         mBarcodeEdit.getText().clear(); 
      mFormatEdit.getText().clear(); 
      mTitleEdit.getText().clear(); 
      mPriceEdit.getText().clear(); 
    } 
    public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     if (requestCode == REQUEST_BARCODE) { 
      if (resultCode == RESULT_OK) { 
       String barcode = intent.getStringExtra("SCAN_RESULT"); 
       mBarcodeEdit.setText(barcode); 

       String format = intent.getStringExtra("SCAN_RESULT_FORMAT"); 
       mFormatEdit.setText(format); 
      } else if (resultCode == RESULT_CANCELED) { 
       finish(); 
      } 
     } 
    } 

private static String validateFields(String barcode, String format, 
    String title, String price) { 
    StringBuilder errors = new StringBuilder(); 

    if (barcode.matches("^\\s*$")) { 
     errors.append("Barcode required\n"); 
    } 

    if (format.matches("^\\s*$")) { 
     errors.append("Format required\n"); 
    } 

    if (title.matches("^\\s*$")) { 
     errors.append("Title required\n"); 
    } 

    if (!price.matches("^-?\\d+(.\\d+)?$")) { 
     errors.append("Need numeric price\n"); 
    } 

    return errors.toString(); 
    } 
} 

ProductDatabase.java

package com.example.barcodedatabaseapp; 

import java.math.BigDecimal; 

import com.example.barcodedatabaseapp.StartMenu.ProductData; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class ProductDatabase { 
      private static final String PRODUCT_TABLE="products"; 
      private static final String DATABASE_NAME="spot_pay.db"; 
      private static final int DATABASE_VERSION=1; 
       private static final BigDecimal ONE_HUNDRED =new BigDecimal(100); 

      private SQLiteDatabase db; 

      private static class ProductDatabaseHelper extends SQLiteOpenHelper { 

       private static final String TAG = null; 

       public ProductDatabaseHelper(Context context) { 
        super(context, DATABASE_NAME, null, DATABASE_VERSION); 

       } 

       @Override 
       public void onCreate(SQLiteDatabase db) {    
         StringBuilder sql = new StringBuilder(); 

         sql.append("create table ").append(PRODUCT_TABLE) 
          .append("( ") 
          .append(" _id integer primary key,") 
          .append(" barcode text,") 
          .append(" format text,") 
          .append(" title text,") 
          .append(" price currency") 
          .append(") "); 

         db.execSQL(sql.toString());  

         Log.d(TAG, PRODUCT_TABLE + "table created");  
       } 

       @Override 
       public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    
        db.execSQL("drop table if exists " + PRODUCT_TABLE);      
        onCreate(db); 
       } 

       } 



      public ProductDatabase(Context context) { 
       ProductDatabaseHelper helper = new ProductDatabaseHelper(context); 
       db = helper.getWritableDatabase(); 
      } 

      public boolean insert(ProductData product) { 
       ContentValues vals = new ContentValues(); 
       vals.put("barcode", product.barcode); 
       vals.put("format", product.format); 
       vals.put("title", product.title); 
       vals.put("price", product.Price.multiply(ONE_HUNDRED).longValue()); 

       return db.insert(PRODUCT_TABLE, null, vals) != -1; 
      } 
     } 

有關於在XML文件中的硬編碼的文本字符串警告,但在沒有錯誤蝕。

這裏的logcat中,請注意我的模擬器不承認我的攝像頭,我從來看,我對我弟弟的Nexus 10

06-06 09:26:42.840: E/AndroidRuntime(825): FATAL EXCEPTION: main 
06-06 09:26:42.840: E/AndroidRuntime(825): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.google.zxing.client.android.SCAN (has extras) } 
06-06 09:26:42.840: E/AndroidRuntime(825): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1622) 
06-06 09:26:42.840: E/AndroidRuntime(825): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1417) 
06-06 09:26:42.840: E/AndroidRuntime(825): at android.app.Activity.startActivityForResult(Activity.java:3370) 
06-06 09:26:42.840: E/AndroidRuntime(825): at android.app.Activity.startActivityForResult(Activity.java:3331) 
06-06 09:26:42.840: E/AndroidRuntime(825): at com.example.barcodedatabaseapp.AddProduct.onClick(AddProduct.java:51) 
06-06 09:26:42.840: E/AndroidRuntime(825): at android.view.View.performClick(View.java:4202) 
06-06 09:26:42.840: E/AndroidRuntime(825): at android.view.View$PerformClick.run(View.java:17340) 
06-06 09:26:42.840: E/AndroidRuntime(825): at android.os.Handler.handleCallback(Handler.java:725) 
06-06 09:26:42.840: E/AndroidRuntime(825): at android.os.Handler.dispatchMessage(Handler.java:92) 
06-06 09:26:42.840: E/AndroidRuntime(825): at android.os.Looper.loop(Looper.java:137) 
06-06 09:26:42.840: E/AndroidRuntime(825): at android.app.ActivityThread.main(ActivityThread.java:5039) 
06-06 09:26:42.840: E/AndroidRuntime(825): at java.lang.reflect.Method.invokeNative(Native Method) 
06-06 09:26:42.840: E/AndroidRuntime(825): at java.lang.reflect.Method.invoke(Method.java:511) 
06-06 09:26:42.840: E/AndroidRuntime(825): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
06-06 09:26:42.840: E/AndroidRuntime(825): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
06-06 09:26:42.840: E/AndroidRuntime(825): at dalvik.system.NativeStart.main(Native Method) 

而且

06-06 09:28:38.579: E/AndroidRuntime(864): FATAL EXCEPTION: main 
06-06 09:28:38.579: E/AndroidRuntime(864): java.lang.NullPointerException 
06-06 09:28:38.579: E/AndroidRuntime(864): at com.example.barcodedatabaseapp.AddProduct.onClick(AddProduct.java:70) 
06-06 09:28:38.579: E/AndroidRuntime(864): at android.view.View.performClick(View.java:4202) 
06-06 09:28:38.579: E/AndroidRuntime(864): at android.view.View$PerformClick.run(View.java:17340) 
06-06 09:28:38.579: E/AndroidRuntime(864): at android.os.Handler.handleCallback(Handler.java:725) 
06-06 09:28:38.579: E/AndroidRuntime(864): at android.os.Handler.dispatchMessage(Handler.java:92) 
06-06 09:28:38.579: E/AndroidRuntime(864): at android.os.Looper.loop(Looper.java:137) 
06-06 09:28:38.579: E/AndroidRuntime(864): at android.app.ActivityThread.main(ActivityThread.java:5039) 
06-06 09:28:38.579: E/AndroidRuntime(864): at java.lang.reflect.Method.invokeNative(Native Method) 
06-06 09:28:38.579: E/AndroidRuntime(864): at java.lang.reflect.Method.invoke(Method.java:511) 
06-06 09:28:38.579: E/AndroidRuntime(864): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
06-06 09:28:38.579: E/AndroidRuntime(864): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
06-06 09:28:38.579: E/AndroidRuntime(864): at dalvik.system.NativeStart.main(Native Method) 
+1

LogCat說什麼? – CaseyB

+0

我沒有在模擬器上運行它,因爲它無法識別掃描儀所需的網絡攝像頭。我在我的Nexus 10平板電腦上運行它,症狀如我所說。 –

+1

在實際設備上運行總是更好!看起來你不使用ZXIng庫。這很容易引入。看看這個鏈接:https://code.google.com/p/zxing/wiki/ScanningViaIntent – CaseyB

回答

1

你做填表格未在您的活動的onCreate中初始化mProductDb

mProductDb = new ProductDatabase(this); 
+0

謝謝,我知道這件事很簡單,但不知道是什麼。當我使用SQLiteBrowser和模擬器時,我可以查看數據庫,但是我希望在我的S III迷你手機或Nexus 10平板電腦上看到該文件,我必須在運行eclipse的avd(用於電話)時連接它們。然後通常的步驟。另外,如果可能的話,我想將這個數據庫數據顯示爲表單或列表。有任何建議嗎? –

+0

http://android-er.blogspot.de/2011/06/simple-example-using-androids-sqlite.html – Nachi

+0

根據我所處的人,我現在需要的代碼來檢查掃描的項目是否有已經被輸入到數據庫中,如果有的話彈出一條消息,而不添加到數據庫,我正在尋找SQLite命令,這將使用已創建的表執行此操作。 –