2016-08-09 1 views
1

これは私の最初の質問です。オーバーフローが発生しているので、見落としやフォーマットミスを許してください。この問題は十分に単純だと思われますが、私は何らかの理由で「部分をまとめる」ことができません。私もJavaとAndroidのスタジオを学んでいますので、悪いコードを教えてください。バーコードスキャナーアプリからデータにアクセスしてSQLiteクエリーで使用する

バーコードスキャニングアプリケーションからデータを収集し、変数に送信し、その変数をデータベースに渡して、UPCコードに基づいて情報を取得する必要があります。私はバーコードスキャナにZXingライブラリを使用しており、handleResultメソッドを使用して初期データを取得しています。

私はSimpleScannerアクティビティで収集したデータを持っていますが、SQliteクエリでその変数を使用する方法を理解できません。私が使用している主なクラスは次のとおりです。

ご協力いただければ幸いです。私はデータベース全体をうまく照会することができますが、私がスキャンしている実際の項目と一致する行を検索する必要があります。再度、感謝します!

SimpleScannerActivity.java

package com.example.android.dropr; 

import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.widget.Toast; 

import com.google.zxing.Result; 

import java.util.ArrayList; 
import java.util.List; 

import me.dm7.barcodescanner.zxing.ZXingScannerView; 

public class SimpleScannerActivity extends MainActivity implements    ZXingScannerView.ResultHandler { 

private ZXingScannerView mScannerView; 

@Override 
public void onCreate(Bundle state) { 
    super.onCreate(state); 
    mScannerView = new ZXingScannerView(this); // Programmatically initialize the scanner view 
    setContentView(mScannerView);    // Set the scanner view as the content view 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    mScannerView.setResultHandler(this); // Register ourselves as a handler for scan results. 
    mScannerView.startCamera();    // Start camera on resume 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    mScannerView.stopCamera();    // Stop the camera on pause 
} 


@Override 
public void handleResult(Result rawResult) { 
    String TAG = "Dropr"; 

    /** 
    * Create Alert Dialog, so that user has time to read the information within. 
    */ 

    AlertDialog.Builder scanInfo = new AlertDialog.Builder(this); 


    String messageContent = "Content - " + rawResult.getText(); 
    String messageFormat = "Format - " + rawResult.getBarcodeFormat().toString() + "."; 
    scanInfo.setTitle("Scan Information:"); 
    scanInfo.setMessage(messageContent + "\n" + messageFormat); 
    scanInfo.setCancelable(true); 

    scanInfo.setPositiveButton(
      "OK", 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
        // IF you would like to resume scanning, call this method below: 
        // Handle the data 
        Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          mScannerView.resumeCameraPreview(SimpleScannerActivity.this); 
         } 
        }, 1000); 
       } 
      }); 

    AlertDialog showInfo = scanInfo.create(); 
    showInfo.show(); 

    // Do something with the result here 
    Log.v(TAG, rawResult.getText()); 
    Log.v(TAG, rawResult.getBarcodeFormat().toString()); 
    } 
} 

DatabaseAccess.java

package com.example.android.dropr; 

import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

import java.util.ArrayList; 
import java.util.List; 

public class DatabaseAccess { 
    private SQLiteOpenHelper openHelper; 
    private SQLiteDatabase database; 
    private static DatabaseAccess instance; 
    private SimpleScannerActivity scannerActivity = new SimpleScannerActivity();  
/** 
* Private constructor to avoid object creation from outside classes. 
* 
* @param context 
*/ 
protected DatabaseAccess(Context context) { 
    this.openHelper = new DatabaseOpenHelper(context); 
} 

/** 
* Return a singleton instance of DatabaseAccess. 
* 
* @param context 
* @return the instance of DatabaseAccess 
*/ 
public static DatabaseAccess getInstance(Context context) { 
    if (instance == null) { 
     instance = new DatabaseAccess(context); 
    } 
    return instance; 
} 

/** 
* Open the database connection 
*/ 
public void open() { 
    this.database = openHelper.getWritableDatabase(); 
} 

/** 
* Close the database connection 
*/ 
public void close() { 
    if (database != null) { 
     this.database.close(); 
    } 
} 

/** 
* Read all quotes from the database. 
* 
* @return a list of quotes 
*/ 
public List<String> getCodes() { 
    List<String> list = new ArrayList<>(); 
    Cursor cursor = database.rawQuery("SELECT name, upc14 FROM Barcodes", null); 
    cursor.moveToFirst(); 
    while (!cursor.isAfterLast()) { 
     list.add(cursor.getString(0)); 
     list.add(cursor.getString(1)); 
     cursor.moveToNext(); 
    } 
    cursor.close(); 
    return list; 
    } 
} 
+0

現在のコードでSQLクエリをどこでどのように作成しようとしたのかを明確にしてください(質問にセクションを追加することによって)。 – nhouser9

+0

最初のステップは、where句を使用してレコードを検索し、DatabaseAccessクラスのbarcodeパラメータを持つメソッドを作成できるようにselect句を書く方法を理解することです(getCodesと似ていますが、リストの代わりに)。 – muratgu

+0

私は役に立たないと分かりませんが、getCodes()メソッドの中で、getString(0)の代わりにgetString(0)を取得しています。 – JCoder

答えて

0

私は最終的に解決策を考え出した、おかげで@muratguします!私は、スキャンしたデータの変数を作成して保存し、その変数をクエリに渡す別の方法を作成しました。

/** 
* read a single record from the database the matches the UPC-A code scanned. 
* if there is no match, do nothing. 
* @param rawContent 
* @return a brand name based on the matching UPC-A code that was scanned. 
*/ 
public String getInfo(String rawContent) { 
    String TAG = "Getinfo():"; 
    String content = "00" + rawContent; 
    String brandName = ""; 
    Cursor cursor = database.rawQuery("SELECT name, upc12 from Barcodes WHERE '" + content + "' = upc12", null); 
    if(cursor.getCount() > 0) { 
     cursor.moveToFirst(); 
     brandName = cursor.getString(cursor.getColumnIndex("name")); 

     cursor.close(); 
    } else { 
     Log.v(TAG, "uh oh, something went wrong in the if loop! "); 
    } 

    return brandName; 
} 

このメソッドは、スキャンしたデータを変数に渡すことができるSimpleScannerActivity.javaファイルで呼び出されます。このメソッドは、項目の名前を返し、ダイアログボックスに配置されます。正確に私が必要としたもの。

もう一度@muratgu!あなたは自分自身で問題を解決できる十分な情報を私にくれました。私はちょっと考えなければなりませんでした!

関連する問題