2016-01-19 81 views
-1

我試圖從我的SQLite數據庫在android中檢索一些數據,但我得到一些錯誤。SQLite錯誤:無法從CursorWindow讀取第0行,col -1

的一切都在這裏首先是我的數據庫代碼片段:

private static final String TABLE_NAME_UrlCache = "UrlCache"; 
private static final String COLUMN_NAME_UrlCache_ID = "id"; 
private static final String COLUMN_NAME_UrlCache_TIME = "time"; 
private static final String COLUMN_NAME_UrlCache_DATE = "date"; 
private static final String COLUMN_NAME_UrlCache_CLIENTIP = "clientip"; 
private static final String COLUMN_NAME_UrlCache_CLIENTMAC = "clientmac"; 
private static final String COLUMN_NAME_UrlCache_REQUESTEDURL = "requestedurl"; 
private static final String COLUMN_NAME_UrlCache_FILENAME = "filename"; 
private static final String CREATE_TABLE_UrlCache = "CREATE TABLE " +TABLE_NAME_UrlCache+ " (" + COLUMN_NAME_UrlCache_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_NAME_UrlCache_TIME +" text, " + COLUMN_NAME_UrlCache_DATE + " text, "+ COLUMN_NAME_UrlCache_CLIENTIP + " text, "+ COLUMN_NAME_UrlCache_CLIENTMAC + " text, "+ COLUMN_NAME_UrlCache_REQUESTEDURL +" text, "+COLUMN_NAME_UrlCache_FILENAME+" text "+");"; 


public boolean addRequestedURL(String time,String date,String client_ip,String client_mac,String url,String file_name) 
{ 
    Log.d("Client mac db", client_mac); 

    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(this.COLUMN_NAME_UrlCache_TIME, time); 
    contentValues.put(this.COLUMN_NAME_UrlCache_DATE, date); 
    contentValues.put(this.COLUMN_NAME_UrlCache_CLIENTIP, client_ip); 
    contentValues.put(this.COLUMN_NAME_UrlCache_CLIENTMAC, client_mac); 
    contentValues.put(this.COLUMN_NAME_UrlCache_REQUESTEDURL, url); 
    contentValues.put(this.COLUMN_NAME_UrlCache_FILENAME, file_name); 
    db.insert(TABLE_NAME_UrlCache, null, contentValues); 

    return true; 
} 


public boolean FileFromUrlAlreadyRequested(String url) 
    { 

     SQLiteDatabase db = this.getReadableDatabase(); 

     try 
     { 
      Cursor cursor = db.rawQuery("select requestedurl from "+ TABLE_NAME_UrlCache, null); 


      try { 

       if (cursor.moveToFirst()) 
       { 
        do 
        { 

         String retrieved_url = cursor.getString(cursor.getColumnIndex(DBManager.COLUMN_NAME_UrlCache_REQUESTEDURL)); 
         String retrieved_id = cursor.getString(cursor.getColumnIndex(DBManager.COLUMN_NAME_UrlCache_CLIENTMAC)); 

         if (retrieved_url.equals(url)) 
         { 
          this.setID(retrieved_id); 
          return true; 
         } 

        } while (cursor.moveToNext()); 
       } 

      } 
      finally 
      { 
       try 
       { 
        cursor.close(); 
       } 
       catch (Exception ignore) {} 
      } 

     } 
     finally 
     { 
      try 
      { 
       db.close(); 
      } catch (Exception ignore) {} 
     } 

     return false; 

    } 

這裏是錯誤:

java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 
                     at android.database.CursorWindow.nativeGetString(Native Method) 
                     at android.database.CursorWindow.getString(CursorWindow.java:438) 
                     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 
                     at com.android.python27.DBManager.FileFromUrlAlreadyRequested(DBManager.java:427) 
                     at com.android.python27.Download$GetRequestedURLAsyncTask.onPostExecute(Download.java:267) 
                     at com.android.python27.Download$GetRequestedURLAsyncTask.onPostExecute(Download.java:193) 
                     at android.os.AsyncTask.finish(AsyncTask.java:631) 
                     at android.os.AsyncTask.access$600(AsyncTask.java:177) 
                     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
                     at android.os.Handler.dispatchMessage(Handler.java:99) 
                     at android.os.Looper.loop(Looper.java:137) 
                     at android.app.ActivityThread.main(ActivityThread.java:4867) 
                     at java.lang.reflect.Method.invokeNative(Native Method) 
                     at java.lang.reflect.Method.invoke(Method.java:511) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
                     at dalvik.system.NativeStart.main(Native Method) 

它粉碎,當我嘗試在這裏獲取MAC地址:

String retrieved_id = cursor.getString(cursor.getColumnIndex(DBManager.COLUMN_NAME_UrlCache_CLIENTMAC)); 

我檢查了Lod.d,看看我是否通過了成功的變量,並且我可以看到創建了新記錄成功。

任何意見將是有益的和深深的讚賞。

+0

您只選擇一列,但您試圖找到兩列。首先解決它。 – 323go

+0

不是一個答案,只是一個建議,但:不要硬編碼SQL查詢中的列名稱。改用你創建的'String'常量。這樣,當您決定在將來更改某些列名時,您不會陷入麻煩。 –

回答

2

您嘗試閱讀DBManager.COLUMN_NAME_UrlCache_CLIENTMAC列,但它不在您的投影列表中。

更改您的SQL查詢以選擇DBManager.COLUMN_NAME_UrlCache_CLIENTMACDBManager.COLUMN_NAME_UrlCache_REQUESTEDURL

+0

O我的錯誤,沒有表明。謝謝 – PL13

0

您的變量被聲明爲'私人',這意味着它只能在類中訪問,請嘗試將其更改爲'public'。

相關問題