2016-04-13 2 views
-2

Я не знаю, почему я получаю эту ошибку:Случайные Android Sqlite Сбои

java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 

Я получаю его для этих линий в SQLite:

db_d.setIsFollowingType(c.getInt(c.getColumnIndex(KEY_IS_FOLLOWING_TYPE))); 
db_d.setIsFollowerType(c.getInt(c.getColumnIndex(KEY_IS_FOLLOWER_TYPE))); 

Если я комментирую их это работает , это весь SQLite метод:

public List<DatabaseUser> getUsers(int type) { 

     String whereClause = KEY_IS_FOLLOWING_TYPE + " = ? "; 
     if(type == 1) { 

      whereClause = KEY_IS_FOLLOWER_TYPE + " = ? "; 
     } 
     List<DatabaseUser> getUsers = new ArrayList<DatabaseUser>(); 
     SQLiteDatabase db = this.getReadableDatabase(); 
     String[] whereArgs = new String[]{ 
       "1" 
     }; 
     String orderBy = KEY_ID + " DESC"; 

     Cursor c = db.query(TABLE_USERS, null, whereClause, whereArgs, null, null, orderBy); 

     if (c.moveToFirst()) { 
      do { 
       DatabaseUser db_d = new DatabaseUser(); 

       db_d.setUserId(c.getString(c.getColumnIndex(KEY_USER_ID))); 
       db_d.setPicture(c.getString(c.getColumnIndex(KEY_PICTURE))); 
       db_d.setUsername(c.getString(c.getColumnIndex(KEY_USERNAME))); 

       db_d.setFollowersCount(c.getInt(c.getColumnIndex(KEY_FOLLOWERS_COUNT))); 
       db_d.setFollowingCount(c.getInt(c.getColumnIndex(KEY_FOLLOWING_COUNT))); 
       db_d.setTrackingCount(c.getInt(c.getColumnIndex(KEY_TRACKING_COUNT))); 
       db_d.setIsFollowingType(c.getInt(c.getColumnIndex(KEY_IS_FOLLOWING_TYPE))); 
       db_d.setIsFollowerType(c.getInt(c.getColumnIndex(KEY_IS_FOLLOWER_TYPE))); 
       db_d.setIsChanged(c.getInt(c.getColumnIndex(KEY_IS_CHANGED))); 

       db_d.setDateAdded(c.getLong(c.getColumnIndex(KEY_DATE_ADDED))); 

       Log.d(Constants.DEBUG, "DB pull user product " + db_d); 
       getUsers.add(db_d); 
      } while (c.moveToNext()); 
     } 

     //calling for close for recycling make sure it does not cause an error 
     c.close(); 
     return getUsers; 

    } 

Это моя таблица Создать метод:

private static final String CREATE_TABLE_USERS = "CREATE TABLE " 
      + TABLE_USERS + "(" 
      + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 
      + KEY_USER_ID + " TEXT NOT NULL UNIQUE ON CONFLICT REPLACE," 
      + KEY_PICTURE + " TEXT," 
      + KEY_USERNAME + " TEXT," 
      + KEY_FOLLOWERS_COUNT + " INTEGER," 
      + KEY_FOLLOWING_COUNT + " INTEGER," 
      + KEY_TRACKING_COUNT + " INTEGER," 
      + KEY_IS_FOLLOWING_TYPE + " INTEGER," 
      + KEY_IS_FOLLOWER_TYPE + " INTEGER," 
      + KEY_IS_CHANGED + " INTEGER," 
      + KEY_DATE_ADDED + " LONG" 
      + ")"; 

Это DatabaseUser Объект:

public class DatabaseUser { 



    private String userId, picture, username; 
    private int followersCount, followingCount, trackCount, isChanged, isFollowingType, isFollowerType; 
    private long dateAdded; 


    //TODO USER NO NEED FOR ISFOLLOWING 
    public DatabaseUser() { 
    } 


    //TODO TESTING 
    public DatabaseUser(String uId, String pic, String uname, 
         int followersC, int followingC, int trackC, int isChng, int followingtype, int followertype, 
         long dateAdd) { 
     userId = uId; 
     picture = pic; 
     username = uname; 
     followersCount = followersC; 
     followingCount = followingC; 
     trackCount = trackC; 
     isChanged = isChng; 
     isFollowingType = followingtype; 
     isFollowerType = followertype; 
     dateAdded = dateAdd; 


    } 


    public String getUserId() { 
     return userId; 
    } 

    public void setUserId(String userId) { 
     this.userId = userId; 
    } 

    public String getPicture() { 
     return picture; 
    } 

    public void setPicture(String picture) { 
     this.picture = picture; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public int getFollowersCount() { 
     return followersCount; 
    } 

    public void setFollowersCount(int followersCount) { 
     this.followersCount = followersCount; 
    } 

    public int getFollowingCount() { 
     return followingCount; 
    } 

    public void setFollowingCount(int followingCount) { 
     this.followingCount = followingCount; 
    } 

    public int getTrackingCount() { 
     return trackCount; 
    } 

    public void setTrackingCount(int trackCount) { 
     this.trackCount = trackCount; 
    } 

    public int getIsChanged() { 
     return isChanged; 
    } 

    public void setIsChanged(int isChanged) { 
     this.isChanged = isChanged; 
    } 

    public int getIsFollowingType() { 
     return isFollowingType; 
    } 

    public void setIsFollowingType(int isFollowingType) { 
     this.isFollowingType = isFollowingType; 
    } 

    public long getDateAdded() { 
     return dateAdded; 
    } 

    public void setDateAdded(long dateAdded) { 
     this.dateAdded = dateAdded; 
    } 

    public int getIsFollowerType() { 
     return isFollowerType; 
    } 

    public void setIsFollowerType(int isFollowerType) { 
     this.isFollowerType = isFollowerType; 
    } 
} 

Это где я делаю чек в MainHome деятельности, где возникающую погрешность:

private void testCreateUserFollowing() { 


     //0 is for isType following 
     DatabaseUser testUserFollowing1 = new DatabaseUser("userId1", "pictureId", "username1", 2354, 30534, 498231, 0, 1, 3, 0); 
     DatabaseUser testUserFollowing2 = new DatabaseUser("userId2", "pictureId", "username2", 2750000, 30000000, 4, 0, 1, 3, 0); 
     DatabaseUser testUserFollowing3 = new DatabaseUser("userId3", "pictureId", "username3", 2, 3, 4, 0, 1, 3, 0); 



     DatabaseUser testUserFollower1 = new DatabaseUser("userId4", "pictureId", "username4", 2, 3, 4, 0, 3, 1, 0); 
     DatabaseUser testUserFollower2 = new DatabaseUser("userId5", "pictureId", "username5", 2, 3, 4, 0, 3, 1, 0); 
     DatabaseUser testUserFollower3 = new DatabaseUser("userId6", "pictureId", "username6", 2, 3, 4, 0, 3, 1, 0); 

     DatabaseUser checkUsersExist = db.getSingleUser("userId3"); 
     if(checkUsersExist != null) { 

     } else { 
      db.createUser(testUserFollowing1); 
      db.createUser(testUserFollowing2); 
      db.createUser(testUserFollowing3); 
      db.createUser(testUserFollower1); 
      db.createUser(testUserFollower2); 
      db.createUser(testUserFollower3); 
     } 


    } 

Комментирование тройник два поля, как я упомянутый выше работает, но мне нужно, чтобы он работал с раскомментированием его ... Кроме того, я понял, что другие ошибки sqlite появляются в другой строке с той же ошибкой для другой таблицы ... если это помогает с чем угодно. У меня нет ошибок в классе SQLITE Helper, который содержит методы sqlite ... так что неуверенно, почему эта ошибка появляется ...

ОБНОВЛЕНИЕ: ДЛЯ всех, кто интересуется: , по-видимому, вызывающий deleteDatabase ("dbname"); работал только и удаление или очистка данных приложения не ...

+0

посетите сайт: //stackoverflow.com/questions/25958555/cursors-sqlite-and-queries – Bharatesh

+2

Вы недавно добавили столбец в свой 'CREATE TABLE' и не обновили/не стерели существующие файлы базы данных? – laalto

+0

Да, потому что я переустановил приложение, чтобы очистить старую базу данных, которая была, когда эта ошибка начала появляться, после очистки базы данных. В противном случае он работал нормально до этого, так что не уверен, так как тест создается в проверке класса MainHome, был добавлен метод, и я очистил базу данных, в которой он начал происходить. – Lion789

ответ

-1

Сначала вы должны потребовать, чтобы проверить курсор являются пустыми или нет, то после того, как получить данные из него, как следующего

if(c!=null){ 
if (c.moveToFirst()) { 
      do { 
       DatabaseUser db_d = new DatabaseUser(); 

       db_d.setUserId(c.getString(c.getColumnIndex(KEY_USER_ID))); 
       db_d.setPicture(c.getString(c.getColumnIndex(KEY_PICTURE))); 
       db_d.setUsername(c.getString(c.getColumnIndex(KEY_USERNAME))); 

       db_d.setFollowersCount(c.getInt(c.getColumnIndex(KEY_FOLLOWERS_COUNT))); 
       db_d.setFollowingCount(c.getInt(c.getColumnIndex(KEY_FOLLOWING_COUNT))); 
       db_d.setTrackingCount(c.getInt(c.getColumnIndex(KEY_TRACKING_COUNT))); 
       db_d.setIsFollowingType(c.getInt(c.getColumnIndex(KEY_IS_FOLLOWING_TYPE))); 
       db_d.setIsFollowerType(c.getInt(c.getColumnIndex(KEY_IS_FOLLOWER_TYPE))); 
       db_d.setIsChanged(c.getInt(c.getColumnIndex(KEY_IS_CHANGED))); 

       db_d.setDateAdded(c.getLong(c.getColumnIndex(KEY_DATE_ADDED))); 

       Log.d(Constants.DEBUG, "DB pull user product " + db_d); 
       getUsers.add(db_d); 
      } while (c.moveToNext()); 
     } 
} 
+0

Я пробовал этот метод, он не работает, c не является нулевым, это значит, что запись не существует для тех столбцов, которые дают мне ошибку – Lion789

+0

Итак, пожалуйста, подтвердите все ключ столбца, который вы используете для получения данных, совпадает с возвратом столбца. –

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