达到最大大小编译SQL语句缓存来查询相关的数据库问题?缓存、语句、大小、数据库

2023-09-07 12:18:04 作者:你以婚纱拖地/我以短裙相衬

朋友,

我写了下面这似乎是错误的sqlite的INSERT语句。在插入行之前我检查,如果记录存在,然后插入不(ATM数据超过600条记录)

达到最大尺寸为编译SQL语句缓存从ATM中cache.select 1 database.no空间,这条SQL语句,其中atmid = 251,请改变你的SQL说明书用?对于bindargs,而不是

 公共无效addAtm(ATM自动取款机)    {db.execSQL(插入+ AtmsTable.NAME +        (+ AtmsTable.COL_ID +,        + AtmsTable.COL_BankID +,        + AtmsTable.COL_BankNAME +,        + AtmsTable.COL_BankPhone +,        + AtmsTable.COL_BankAddress +,        + AtmsTable.COL_BankCoordinates +,        + AtmsTable.COL_BankCity +,        + AtmsTable.COL_BankWebaddress +)值(        + atm.getAtmID()+,        + atm.getBankID()        +,'+ atm.getBankName()。修剪()        +,+ atm.getPhone()        +,+ atm.getAddress()        +,+ atm.getCoordinates()        +,+ atm.getCity()        +','+ atm.getWebAddress()+'););} 

 公共布尔atmExists(INT atmId)    {        OpenIfNotOpened();         光标的光标= db.rawQuery(+ AtmsTable.NAME +,其中+ AtmsTable.COL_ID +=+ atmId,空从选择1);               布尔存在=(cursor.getCount()大于0);               cursor.close();               返回的存在;    } 

和我收到以下错误消息

任何帮助将是AP preciated。

解决方案   

公共无效execSQL(SQL字符串)

    

自:API级别1执行单  SQL语句不是SELECT或  返回其他任何SQL语句  数据。它没有装置返回任何  数据(如受影响数  行)。相反,我们鼓励你  使用insert(字符串,字符串,  ContentValues​​),更新(字符串,  ContentValues​​,字符串,字符串[]),等。  人,如果可能的话。

只需使用:

  ContentValues​​丘壑=新ContentValues​​();vals.put(AtmsTable.COL_BankID,atm.getBankID());vals.put(AtmsTable.COL_BankNAME,atm.getBankName()修剪());/ ...如果(db.update(AtmsTable.NAME,丘壑,AtmsTable.COL_ID +=?,新的String [] {Integer.toString(atm.getAtmID())})== 0){  vals.put(AtmsTable.COL_ID,atm.getAtmID());  db.insert(AtmsTable.NAME,空,丘壑);} 

friends,

i have written following sqlite insert statement which seems to be wrong. before inserting row i am checking if record exists then dont insert(ATM data is more than 600 records)

Reached max size for compiled sql statement cache for database.no space for this sql statement in cache.select 1 from atm where atmid=251 please change your sql statment to use "?" for bindargs, instead of

public void addAtm(ATM atm)
    {

db.execSQL("INSERT INTO " + AtmsTable.NAME + 
        "(" +AtmsTable.COL_ID + ","
        +AtmsTable.COL_BankID +"," 
        + AtmsTable.COL_BankNAME+","
        + AtmsTable.COL_BankPhone+","
        + AtmsTable.COL_BankAddress+","
        + AtmsTable.COL_BankCoordinates+","
        + AtmsTable.COL_BankCity+","
        + AtmsTable.COL_BankWebaddress+") Values (" 
        +atm.getAtmID()+","
        +atm.getBankID()
        + ",'" + atm.getBankName().trim()
        +"','" + atm.getPhone()
        +"','" + atm.getAddress()
        +"','" + atm.getCoordinates()
        +"','" + atm.getCity()
        +"','" + atm.getWebAddress()+ "');");

}

and

public boolean atmExists(int atmId)
    {
        OpenIfNotOpened();
         Cursor cursor = db.rawQuery("select 1 from " + AtmsTable.NAME  +" where " + AtmsTable.COL_ID + "=" + atmId,null);
               boolean exists = (cursor.getCount() > 0);
               cursor.close();
               return exists;
    }

and i am getting following error message

any help would be appreciated.

解决方案

public void execSQL (String sql)

Since: API Level 1 Execute a single SQL statement that is NOT a SELECT or any other SQL statement that returns data. It has no means to return any data (such as the number of affected rows). Instead, you're encouraged to use insert(String, String, ContentValues), update(String, ContentValues, String, String[]), et al, when possible.

just use:

ContentValues vals = new ContentValues();
vals.put(AtmsTable.COL_BankID, atm.getBankID());
vals.put(AtmsTable.COL_BankNAME, atm.getBankName().trim());
/...
if(db.update(AtmsTable.NAME, vals, AtmsTable.COL_ID + "=?", new String[]{Integer.toString(atm.getAtmID())}) == 0){
  vals.put(AtmsTable.COL_ID, atm.getAtmID());
  db.insert(AtmsTable.NAME, null, vals);
}