为数据库编译sql语句高速caching已达到MAX大小

我的代码是

ContentValues values; values = new ContentValues(); values.put(SQLHelper.EMPLOYEE_LPN, jsObj.getString("lpn")); db.update(SQLHelper.EMPLOYEE_TABLE, values, "EMPLOYEE_LPN ='" + jsObj.getString("lpn") + "'", null); 

Log Cat中显示警告

 08-31 15:19:45.297: WARN/Database(2868): Reached MAX size for compiled-sql statement cache for database /data/data/org.sipdroid.sipua/databases/test.db; ie, NO space for this sql statement in cache: SELECT EMPLOYEE_NAME FROM eyemployee WHERE EMPLOYEE_LPN ='1169162'. Please change your sql statements to use '?' for bindargs, instead of using actual values 

如何解决它。 请帮忙

Solutions Collecting From Web of "为数据库编译sql语句高速caching已达到MAX大小"

看这里的例子8-3和8-4。

例8-3。 使用更新方法

 /** * 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()); } } 

例8-3中的代码的一些亮点如下:

例8-4显示了如何使用execSQL方法。
例8-4。 使用execSQL方法

 /** * 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()); } } 

该消息要求您使参数使用SQLvariables,而不是SQL文字。

每个sql查询都被parsing,计划被生成,并存储在一个sql语句caching中。

从caching中获取具有相同文本的查询。

  --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) 

查询有不同的文本(包括文字)不能在caching中find,并(无用)添加到它。

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

我今天正在寻找这个,并且碰到了这个文档。

http://ormlite.com/docs/query-builder

这解决了我的问题。 这是上面链接的代码

 QueryBuilder<Account, String> queryBuilder = accountDao.queryBuilder(); Where<Account, String> where = queryBuilder.where(); SelectArg selectArg = new SelectArg(); // define our query as 'name = ?' where.eq(Account.NAME_FIELD_NAME, selectArg); // prepare it so it is ready for later query or iterator calls PreparedQuery<Account> preparedQuery = queryBuilder.prepare(); // later we can set the select argument and issue the query selectArg.setValue("foo"); List<Account> accounts = accountDao.query(preparedQuery); // then we can set the select argument to another // value and re-run the query selectArg.setValue("bar"); accounts = accountDao.query(preparedQuery);