2013-06-05 2 views
3

안녕하세요. 안드로이드 앱을 만드는 데 약간의 멍청한 반응이 있습니다. 이것은 제 두 번째 것입니다. 바코드를 스캔하고 정보를 데이터베이스에 저장하는 앱을 만들어야합니다.데이터베이스에 데이터를 추가하는 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 파일에서 하드 코드 된 텍스트 문자열에 대한 경고하지만 오류에있다 식. 여기

, 내 에뮬레이터 내 웹캠을 인식하지 못합니다주의하시기 바랍니다 로그 캣입니다, 나는 내 동생의 넥서스 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 태블릿에서 파일을보고 싶습니다. 이클립스의 avd (전화)를 실행하는 동안 연결해야합니다. 보통 단계. 또한 가능한 경우이 데이터베이스 데이터를 양식 또는 목록으로 표시하려고합니다. 그 충고가 있니? –

+0

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

+0

내가 속한 사람에 따르면, 이제 스캔 한 항목이 있는지 확인하는 코드가 필요합니다. 이미 데이터베이스에 입력되었습니다. 그래서 메시지가 데이터베이스에 추가되지 않고 팝업되면, 이미 작성된 테이블로이를 수행하는 SQLite 명령을 찾고 있습니다. –

관련 문제