从sqlite

时间:2018-04-04 07:04:02

标签: android sqlite stack-overflow

我正在使用指纹识别器阅读员工指纹。 执行morphoDatabase.identify后,指纹识别器会等待员工指纹。 捕获指纹后,我从指纹识别器数据库获取employeeId。 现在我想从我的sqlite数据库中获取此员工详细信息并显示问候消息。 在此之后,我再次开始识别过程。

问题: 当我的身份识别计数达到约100时,我的应用程序崩溃了。

我添加了logcat错误。

Thread commandThread = (new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            identifyThreadMethod();
            Log.e("Identification Thread", "Completed");
            return;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}));



private void identifyThreadMethod() {

            int ret = 0;
            try {
                ret = morphoDatabase.identify(timeout, far, coder,
                        detectModeChoice, matchingStrategy, callbackCmd,
                        DashboardActivity.this, resultMatching, 2, morphoUser);
            } catch (Exception e) {
                Log.e("Exception", "Identification");
            }

            if(ret == 0) {
                String employeeId= morphoUser.getField(0);
                getEmployee(employeeId);
            }

            if (retvalue != -11) { // reader database not empty
                    if (!flag) {
                        identifyThreadMethod();
                    }
                }
            } 


        }

    }




public Employee getEmployee(String id) {

        if(db == null) {
            db = this.getReadableDatabase();
        }

        String selectQuery = "SELECT  * FROM " + TABLE_EMPLOYEE + " WHERE "
                + KEY_ID + "='" + id + "' AND " + KEY_IS_DELETED + "= 0";

        //getting stackoverflow error on bellow mentioned line

        Cursor cursor = db.rawQuery(selectQuery, null);

        if (cursor != null)
            cursor.moveToFirst();

        if (cursor.getCount() > 0) {
            Employee employee = new Employee();
            employee.setId(cursor.getString(1));


            HashMap<Integer, String> templates = new HashMap<>();
            templates.put(1, cursor.getString(2));
            templates.put(2, cursor.getString(3));
            templates.put(3, cursor.getString(4));
            templates.put(4, cursor.getString(5));
            templates.put(5, cursor.getString(6));
            templates.put(6, cursor.getString(7));
            templates.put(7, cursor.getString(8));
            templates.put(8, cursor.getString(9));
            templates.put(9, cursor.getString(10));
            templates.put(10, cursor.getString(11));

            employee.setTemplateMap(templates);
            employee.setFirstName(cursor.getString(12));
            employee.setLastName(cursor.getString(13));
            employee.setEmpLevel(cursor.getString(14));
            employee.setEmpIndex(cursor.getInt(15));
            employee.setEmpPIN(cursor.getString(16));
            employee.setEmpAccessMode(cursor.getInt(17));

            employee.setEmpEnrollFlag(cursor.getInt(18));
            employee.setAuthMode(cursor.getInt(19));
            employee.setIsDeleted(cursor.getInt(20));

            return employee;
        }
        return null;
    }

错误日志

E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-1
                  java.lang.StackOverflowError
                      at java.util.WeakHashMap.poll(WeakHashMap.java:569)
                      at java.util.WeakHashMap.put(WeakHashMap.java:608)
                      at android.database.sqlite.SQLiteConnectionPool.finishAcquireConnectionLocked(SQLiteConnectionPool.java:911)
                      at android.database.sqlite.SQLiteConnectionPool.tryAcquirePrimaryConnectionLocked(SQLiteConnectionPool.java:847)
                      at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:613)
                      at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:348)
                      at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:894)
                      at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:586)
                      at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                      at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
                      at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
                      at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
                      at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
                      at com.cms.attendance.fingerprintreader.database.DatabaseHandler.getEmployee(DatabaseHandler.java:434)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:876)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                      at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThreadMethod(DashboardActivity.java:999)
                    at com.cms.attendance.fingerprintreader.newui.DashboardActivity.identifyThrea

3 个答案:

答案 0 :(得分:0)

if (retvalue != -11) { // reader database not empty
                    if (!flag) {
                        identifyThreadMethod();
                    }
                }

似乎总是满足这个条件,因此identifyThreadMethod();总是被称为递归。

答案 1 :(得分:0)

我建议进行以下更改,以便在完成游标时基本满足光标的关闭。

不确定这是否是问题。

  • P.S。代码是原则性的,尚未经过测试,因此可能存在错误。

: -


        .then(service => {
            console.log("Getting Characteristic");
            return service.getCharacteristic(commandCharacteristicUUID);
        })

答案 2 :(得分:0)

请阅读以下答案,以便更清楚地了解StackoverflowError https://stackoverflow.com/a/214758/2290580

我需要24 * 7运行我的应用程序,并且我递归地调用identifyThreadMethod(),因此堆栈大小正在增加。 为了解决这个问题,我返回了我需要调用该方法的条件,以便完成方法执行。

Thread commandThread = (new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    boolean start = true;
                    while(start) {
                        start = identifyThreadMethod();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }));