Reached MAX size for compiled-sql statement cache for database

后端 未结 2 1813
盖世英雄少女心
盖世英雄少女心 2021-02-04 12:56

My code is

ContentValues values; 
values = new ContentValues();
        values.put(SQLHelper.EMPLOYEE_LPN, jsObj.getString(\"lpn\"));
db.update(SQLHelper.EMPL         


        
2条回答
  •  庸人自扰
    2021-02-04 13:11

    Look at examples 8-3 and 8-4 here.

    Example 8-3. Using the update method

    /**
     * Update a job in the database.
     * @param job_id         The job id of the existing job
     * @param employer_id    The employer offering the job
     * @param title          The job title
     * @param description    The job description
     */
    public void editJob(long job_id, long employer_id, String title, String description) {
        ContentValues map = new ContentValues();
        map.put("employer_id", employer_id);
        map.put("title", title);
        map.put("description", description);
        String[] whereArgs = new String[]{Long.toString(job_id)};
        try{
            getWritableDatabase().update("jobs", map, "_id=?", whereArgs);
        } catch (SQLException e) {
            Log.e("Error writing new job", e.toString());
        }
    }
    

    Here are some of the highlights of the code in Example 8-3:

    Example 8-4 shows you how to use the execSQL method.
    Example 8-4. Using the execSQL method

    /**
     * Update a job in the database.
     * @param job_id         The job id of the existing job
     * @param employer_id    The employer offering the job
     * @param title          The job title
     * @param description    The job description
     */
    public void editJob(long job_id, long employer_id, String title, String description) {
        String sql = 
            "UPDATE jobs " +
            "SET employer_id = ?, "+
            " title = ?,  "+
            " description = ? "+
            "WHERE _id = ? ";
        Object[] bindArgs = new Object[]{employer_id, title, description, job_id};
        try{
            getWritableDatabase().execSQL(sql, bindArgs);
        } catch (SQLException e) {
            Log.e("Error writing new job", e.toString());
        }
    }
    

    The message is asking you to make parameters use sql variables instead of sql literals.

    Each sql query is parsed, plans are generated, and stored in a sql statement cache.

    Queries which have the same text are fetched from the cache.

      --One query
    SELECT * FROM Customers WHERE Id = @1   (@1 = 3)
    SELECT * FROM Customers WHERE Id = @1   (@1 = 4)
    SELECT * FROM Customers WHERE Id = @1   (@1 = 5)
    

    Queries which have different text (including literals) cannot be found in the cache and are (uselessly) added to it.

      --Three Queries.
    SELECT * FROM Customers WHERE Id = 3
    SELECT * FROM Customers WHERE Id = 4
    SELECT * FROM Customers WHERE Id = 5
    

提交回复
热议问题