访问数据从条码扫描器应用程序使用在SQLite查询



这是我在这里关于堆栈溢出的第一个问题,所以请原谅我的任何疏忽或格式错误。这个问题似乎很简单,但由于某种原因,我无法"把碎片拼凑在一起"。我也在学习java和android studio,所以请原谅和教育任何不好的代码。

我需要从我的条形码扫描应用程序收集数据,将其提交给一个变量,然后通过我的数据库通过该变量获取基于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;
  }
}

我终于想出了一个解决方案,感谢@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!你给了我足够的信息,我可以自己解决这个问题。我只是想了一下!

最新更新