【问题标题】:How to check if data exists in a record before performing an action in SQLite?在 SQLite 中执行操作之前如何检查记录中是否存在数据?
【发布时间】:2017-11-26 11:06:49
【问题描述】:

我制作了一个扫描二维码的应用。我希望将从二维码扫描的数据(将是 2300、2301、2302 之类的数字)与 sqlite 数据库中名为 ID 的列进行比较。 sqlite 数据库中列 ID 的一些值是 2301、2302、2303。我希望将扫描的数据与 ID 中的值进行比较,如果它们匹配,则执行操作。如果不是,将显示错误消息。如果二维码的值为 2301,则执行该操作。如果是 8900(数据库中没有的数字),它会显示一条消息:找不到学生。我还想澄清一下,scannedData 没有被输入到 sqlite 数据库中,而是被发送到谷歌脚本链接。 sqlite 数据库包含一个学生列表。我希望如果扫描的数据与 sqlite 数据库中的 nay ID 不相似,那么 sannedData 将不会被发送到谷歌应用脚​​本目标。 这是我的活动 DatabaseHelper 的数据库代码

public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "Student.db";
public static final String TABLE_NAME = "student_table";
public static final String COL_1 = "ID";
public static final String COL_2 = "NAME";
public static final String COL_3 = "SURNAME";
public static final String COL_4 = "MARKS";

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + TABLE_NAME +" (ID INT PRIMARY KEY UNIQUE,NAME TEXT,SURNAME TEXT,MARKS TEXT)");
}

下面是我要修改以检查它是否在数据库中的代码。这是另一个名为 MainActivity 的活动。

    public class ArrivalTime extends AppCompatActivity {

    String scannedData;
    Button scanBtn;

    //-----------------------------------------------------------
    //DatabaseHelper myDb;
//------------------------------------------------------------


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_arrival_time);
        final Activity activity = this;
        scanBtn = (Button) findViewById(R.id.scan_btn);
        //-------------------------------------------------------
     //  myDb = new DatabaseHelper(this);

        //---------------------------------------------------------

        scanBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                IntentIntegrator integrator = new IntentIntegrator(activity);
                integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);
                integrator.setPrompt("Place barcode in window to Scan it");
                integrator.setBeepEnabled(true);
                integrator.setCameraId(0);
                integrator.setBarcodeImageEnabled(false);
                integrator.initiateScan();
            }

        });

    }

    //-----------------------------------------------------------------------------------------

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        IntentResult result= IntentIntegrator.parseActivityResult(requestCode,resultCode,data);
        if(result!=null){
            scannedData = result.getContents();
            if(scannedData != null){
                // here we need to handle scanned data
               // Cursor c = myDb.getId(String);
               // if(c.getCount() == 0) {
                    // show message
                 //   Toast.makeText(ArrivalTime.this,"Student doesn't exist in database",Toast.LENGTH_LONG).show();
                 //   return;
                //}
                new SendRequest().execute();

            }
            else{

            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }


    //-----------------------------------------------------------------------------------------

    public class SendRequest extends AsyncTask<String, Void, String>{

        protected void onPreExecute(){}

        protected String doInBackground(String... arg0){

            try{
                URL url = new URL("https://script.google.com/macros/s/ttttttttttttttttttttttttttttttttttttttttttttt/exec");

                JSONObject postDataParams = new JSONObject();

                postDataParams.put("sdata",scannedData);
                Log.e("params", postDataParams.toString());

                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setReadTimeout(15000 /* milliseconds */);
                conn.setConnectTimeout(15000 /* milliseconds */);
                conn.setRequestMethod("GET");
                conn.setDoInput(true);
                conn.setDoOutput(true);

                OutputStream os = conn.getOutputStream();
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(os, "UTF-8"));
                writer.write(getPostDataString(postDataParams));

                writer.flush();
                writer.close();
                os.close();

                int responseCode=conn.getResponseCode();

                if (responseCode == HttpsURLConnection.HTTP_OK) {

                    BufferedReader in=new BufferedReader(new InputStreamReader(conn.getInputStream()));
                    StringBuffer sb = new StringBuffer("");
                    String line="";

                    while((line = in.readLine()) != null) {

                        sb.append(line);
                        break;
                    }

                    in.close();
                    return sb.toString();

                }
                else {
                    return new String("false : "+responseCode);
                }
            }
            catch(Exception e){
                return new String("Exception: " + e.getMessage());
            }
        }

        @Override
        protected void onPostExecute(String result) {
            Toast.makeText(getApplicationContext(), result,
                    Toast.LENGTH_LONG).show();

        }
    }

    public String getPostDataString(JSONObject params) throws Exception {

        StringBuilder result = new StringBuilder();
        boolean first = true;

        Iterator<String> itr = params.keys();

        while(itr.hasNext()){

            String key= itr.next();
            Object value = params.get(key);

            if (first)
                first = false;
            else
                result.append("&");

            result.append(URLEncoder.encode(key, "UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(value.toString(), "UTF-8"));

        }
        return result.toString();
    }
//-----------------------------------------------------------------------------------------

我希望该函数检查扫描的数据是否不为空并且它是否存在于数据库中。我试着做 if(scannedData != null && mapped==id) 但我不确定如何从另一个活动中调用数据库数据并执行比较

我在下面给出了一个示例,但它假设我正在检查是否存在与已扫描的值相似的值,以便可以将其输入到我不想要的 sqlite 数据库中。

任何建议。

【问题讨论】:

  • 我认为您想使用 ID 列检查数据..
  • 是的。这就是我想做的事
  • 好的,检查答案。如果数据存在 ti 将返回 true。
  • 你完成了吗?我已经更新了一些代码..请检查..
  • 如果你觉得有什么问题可以问我...

标签: android sqlite android-sqlite qr-code


【解决方案1】:

你可以像下面这样查看..

  public Boolean getId(String id) {
   boolean rValue = false;
    String selectQuery = "SELECT * FROM "  + TABLE_NAME + " where "+ COL_1 +" = ? " ;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor c = db.rawQuery(selectQuery, new String[]{id});


    if (c.moveToFirst()) {
        do {
            // Data Is Exist;
            rValue = true;
        } while (c.moveToNext());
    }

    db.close();
    c.close();

    return rValue;

}

【讨论】:

    【解决方案2】:

    答案很简单,您必须使用给定的 ID 列值进行选择查询,并像这样检查 Cursor.getCount() 方法。 Cursor.getCount(); // returns number of rows from this query。 如果它返回 0,那么那里有一些行,这意味着 ID 确实存在

    public boolean Contains(String ID) {
        Cursor cursor = null;
    
        cursor = db.rowQuery("SELECT * FROM student_table WHERE ID === ? ", new String[]{ID});
        if (cursor.getCount() == 0) {
            return false;
        }
        return true;
    }
    

    【讨论】:

    • if(scannedData != null) 在 if 函数中怎么样。将扫描的数据与数据库中的任何内容进行比较是我写的正确吗
    • 我以前没有使用过这个,我一直使用我的解决方案,它已经过测试并且适用于我所有的项目。它也非常简单和优化。
    • 在执行新的 SendRequest().execute() 操作之前,如何将方法调用到 onActivityresult 方法。它不会自动检查该值是否已扫描数据与数据库中的任何内容相似
    猜你喜欢
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2013-06-13
    相关资源
    最近更新 更多