2016-01-19 2 views
-1

Я пытаюсь получить некоторые данные из моего SQLite db в Android, но я получаю некоторую ошибку.Ошибка SQLite: не удалось прочитать строку 0, col -1 из CursorWindow

Прежде всего Вот отрывок из моей БД код:

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) 

Он раздавлен, когда я пытаюсь получить адрес макинтош здесь:

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_CLIENTMAC, так и DBManager.COLUMN_NAME_UrlCache_REQUESTEDURL.

+0

О, моя ошибка, не показала этого. спасибо – PL13

0

Ваши переменные объявлены как «частные», что означает, что доступ к ним возможен только внутри класса, вместо этого попробуйте заменить его на «public».

Смежные вопросы