簡體   English   中英

如何在Android中修復“:”的Sqlite語法錯誤

[英]How to fix Sqlite syntax error for “ : ” in android

我正在使用一種方法來每隔1分鍾獲取設備詳細信息及其位置,並將其存儲在本地數據庫中。 但是問題是在獲取太多重復記錄的數據時。

//用於將位置詳細信息存儲到本地SQLite的函數

public void storeLocationToLocal(String imei, String positionDate, String positionTime, String signalStrength, String batteryStrength, String latitude, String longitude, String altitude, String speed, String chargingStatus, String status)
{
    SQLiteDatabase db=getWritableDatabase();

    String LOCATION_RECORD=imei+"|"+positionDate+"|" +positionTime+ "|"+signalStrength+"|"+batteryStrength+"|"+latitude+"|"+longitude+"|"+altitude+"|"+speed+"|"+chargingStatus+"|"+status;

    Cursor cursor = db.rawQuery("SELECT  * FROM " + TABLE_NAME + " WHERE " + KEY_LOCATION_RECORD + " = " + LOCATION_RECORD, null);

    int recordCount = cursor.getCount();

    cursor.close();

    System.out.println("SQLiteHelper storeLocationToLocal() QUEUE_QUERY : " +"SELECT  * FROM " + TABLE_NAME + " WHERE " + KEY_LOCATION_RECORD + " = " + LOCATION_RECORD);

    System.out.println("SQLiteHelper storeLocationToLocal() QueueRecordCount:"+recordCount);

    if (recordCount>0)
    {
        System.out.println("SQLiteHelper storeLocationToLocal() QueueRecordCount:"+recordCount + "Is already Exist...");
    }
    else
    {
        ContentValues values = new ContentValues();
        values.put(KEY_LOCATION_RECORD,LOCATION_RECORD);

        long result=db.insert(TABLE_NAME, null, values);

        System.out.println("SQLiteHelper storeLocationToLocal():"+result);
        System.out.println("SQLiteHelper storeLocationToLocal() LOCATION_RECORD:"+LOCATION_RECORD);

        ArrayList<LocationRecordGetterSetter> DatabaseRecordsSendToServer=retrieveLocationFromLocal();

        showRetrieveLocationFromLocal(DatabaseRecordsSendToServer);

    }


}

// Function to print and check values, that will be uploaded to server
private void showRetrieveLocationFromLocal(ArrayList<LocationRecordGetterSetter> recordsSendToServer)
{
    System.out.println("UpdateLocationService showRetrieveLocationFromLocal():");
    for (int i=0;i<recordsSendToServer.size();i++)
    {
        System.out.println("ID: "+recordsSendToServer.get(i).getId()+" LOCATION_RECORD: "+recordsSendToServer.get(i).getLatitude()+","+recordsSendToServer.get(i).getLongitude()+" | "+recordsSendToServer.get(i).getAltitude()+" | "+recordsSendToServer.get(i).getBatteryStrength()+" | "+recordsSendToServer.get(i).getChargingStatus()+" | "+recordsSendToServer.get(i).getImei()+" | "+recordsSendToServer.get(i).getPositionDate()+" | "+recordsSendToServer.get(i).getPositionTime()+" | "+recordsSendToServer.get(i).getSignalStrength()+" | "+recordsSendToServer.get(i).getSpeed()+" | "+recordsSendToServer.get(i).getStatus());
    }

}

錯誤

12:00.341 27260-27260/in.ileaf.ptrackerapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: in.ileaf.ptrackerapp, PID: 27260
    android.database.sqlite.SQLiteException: near ":12": syntax error (code 1): , while compiling: SELECT  * FROM Location WHERE location_details = 864238037598142|2019-01-22|11:12|0|46|18.477268|73.894804|539.9|0|1|fused
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    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:1318)
    at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1257)
    at in.ileaf.ptrackerapp.Utils.SQLiteHelper.storeLocationToLocal(SQLiteHelper.java:78)
    at in.ileaf.ptrackerapp.Utils.LocationServices.onLocationChanged(LocationServices.java:210)
    at com.google.android.gms.internal.zzcdi.zzq(Unknown Source)
    at com.google.android.gms.internal.zzbdw.zzb(Unknown Source)
    at com.google.android.gms.internal.zzbdx.handleMessage(Unknown Source)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:165)
    at android.app.ActivityThread.main(ActivityThread.java:6375)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:883)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)

將要搜索的參數用單引號引起來,例如

Cursor cursor = db.rawQuery("SELECT  * FROM " + TABLE_NAME + " WHERE " + KEY_LOCATION_RECORD + " = '" + LOCATION_RECORD + "'", null);

最好還是使用查詢便捷方法,並讓它為您編寫SQL。

例如

SQLiteDatabase db=getWritableDatabase();
String whereclause = KEY_LOCATION_RECORD + "=?";
String[] whereargs = new String[]{LOCATION_RECORD}; 
Cursor cursor = db.query(TABLE_NAME, null, whereclause, whereargs,null, null, null);
int recordCount = cursor.getCount();
......... rest of your code ......
  • 請注意,上面是原理代碼,尚未運行或測試,可能包含一些錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM